Docker环境安装
- Docker简介
- Docker工作原理
- Docker的应用场景
- Docker 的优点
- CentOS Docker 安装与配置
- Docker 安装
- Docker 配置
- Docker容器概念
- Docker容器操作
- 拉取镜像
- 删除镜像
- 容器相关命令
- 创建并启动容器
- 停止和恢复容器
- 删除容器
Docker简介
- Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源;
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化;
- 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低;
- Docker 从 17.03 版本之后分为 CE(Community Edition-社区版)和 EE(Enterprise Edition-企业版)
Docker工作原理
docker引擎是一个C/S结构的应用
Server是一个常驻进程
REST API实现了client和server间的交互协议
CLI实现容器和镜像的管理,用户通过命令行对其操作
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,大大减少编写代码和在生产环境中运行代码之间的延迟。
CentOS Docker 安装与配置
Docker 安装
使用官方安装脚本自动安装,借助阿里云镜像进行加速
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或使用国内 daocloud 一键安装命令
curl -sSL https://get.daocloud.io/docker | sh
安装成功后,可以通过docker --version
查看docker版本
Docker 配置
配置docker国内源
cd /etc/docker
进入该目录下,使用ls
命令查看该目录下是否有daemon.json
文件,如果没有,使用vim daemon.json
编辑文件,插入内容
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://reg-mirror.qiniu.com"
]
}
保存成功后,执行systemctl daemon-reload
进行重载,然后执行systemctl start docker
重新启动docker
Docker服务
systemctl status docker #查看docker状态
systemctl enable docker #设置默认开机启动
systemctl start docker #启动docker
systemctl restart docker #重新启动docker
systemctl stop docker #停止docker
Docker容器概念
镜像(Images):容器的模板,包括容器运行时所需要的数据
容器(Container):运行的进程,依赖镜像运行,镜像的具体化
容器类似于WMware虚拟机,WMware虚拟机可以根据CentOS镜像创建多个CentOS系统,一个镜像可以创造出多个容器。而容器内可以创建对应的环境,如容器1:Tomcat+Java;容器2:PHP+Mysql。容器之间互不影响
Docker容器操作
拉取镜像
想要运行容器必须提前下载好对应的镜像,比如想运行一个mariadb10.7版本的容器,需要先在本地有这个镜像才能运行。
镜像需要在镜像仓库上去下载,就像代码是托管在代码仓库上的,默认情况下需要从公有仓库,也就是dockerhub上下载镜像,dockerhub上有海量的镜像提供选择,构建环境的时候可以直接下载其中的镜像来使用
从镜像仓库拉取镜像:docker pull 镜像:Tag
,Tag相当于镜像工具的版本,可省略,省略则默认为拉取最新版本
docker pull mariadb:10.7
docker pull mysql:8.0
docker pull nginx
/var/lib/docker/
目录下,有个iamge
目录,该目录下存放的,则是从镜像仓库上下载下来的镜像
可以通过docker images
或docker image ls
命令查看本地有哪些镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6efc10a0510f 3 days ago 142MB
mariadb 10.7 4a632f970181 4 weeks ago 401MB
mysql 8.0 412b8cc72e4a 8 days ago 531MB
删除镜像
删除镜像,需提前删除对应的容器:docker rmi 镜像id或者镜像名
docker rmi mariadb:10.7
docker rmi 6efc10a0510f
如果拉取镜像的时候指定了版本,指定镜像名删除镜像的时候,也需要带上版本号
容器相关命令
docker run <options> 镜像:tag commands # 新建一个容器并启动
docker stop 容器ID或名称 # 停止运行中的容器
docker start 容器ID或名称 # 启动停止的容器
docker restart 容器ID或名称 # 重启容器
docker logs -f 容器ID/名称 # 查看容器日志
docekr inspect 容器ID/名称 # 查看容器详细信息
创建并启动容器
docker run <options> 镜像:tag commands
options表示选项,用于运行容器时一些额外的配置,commands表示运行在容器内部的命令,比如容器内部要运行一个python脚本,commands可以替换为 python commands。
常用的选项有:
-d 指定容器运行后台
-i 用于控制台交互
-t 支持终端登录,通常和-i参数一起使用
-p 映射容器端口,用法:-p 宿主机端口:容器端口
-v 挂载容器存储卷,用法:-v 宿主机路径:容器路径
-e 设置容器的环境变量用于容器内的应用程序进行相关配置,用法 -e 环境变量名=变量值
--name=“container_name” 指定容器的名称
--rm 退出容器时删除容器 与--restart冲突
--restart=“always” 容器停止后,docker再次启动,自动重启容器 与 --rm冲突
例如:
docker run -it -p 8888:3306 -e MARIADB_ROOT_PASSEORD=test mariadb:10.7
mariadb服务默认监听3306端口,但是容器内部的网络和宿主机不在一个网段,所以我们把该端口映射到了宿主机的3306端口,现在我们通过访问宿主机的8888端口就可以访问mariadb了
-e MARIADB_ROOT_PASSEORD=test
这行指配置mariadb的root账号的密码为test
此时我们的进程是运行在前台的,如果关闭窗口就可能造成容器进程退出,所以如果想让容器一直不退出,可以在运行的时候加上-d
参数,让容器进程作为守护进程。
docker run -it -d -p 9999:3306 -e MYSQL_ROOT_PASSEORD=123456 --name="db_mysql"
mysql:8.0
如果要删除容器,但是又要备份容器的数据,可以通过-v
参数指定挂载容器存储卷,设置容器目录/var/lib/mysql
映射到本地目录/data/mariadb/data
mkdir -p /data/mariadb/data
docker run -it -d -p 8889:3306 -e MARIADB_ROOT_PASSEORD=123456 --name="db_mariadb" -v /data/mariadb/data:/var/lib/mysql mariadb:10.7
还可以通过docker cp
命令将docker容器内的配置文件信息复制到宿主机上,将nginx_test
容器内Nginx的/etc/nginx
目录下的配置文件信息,复制到宿主机的/data/nginx/config
目录下
mkdir -p /data/nginx/config
docker run -it -d -p 8080:80 --name="nginx_test" nginx
docker cp nginx_test:/etc/nginx /data/nginx/config
此时可以通过 docker ps
命令查看运行中的容器
如果没有指定容器名称,会随机分配,通常情况下,创建容器的时候都指定容器的名称,这样停止容器的时候,方便操作
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75812ef6b412 mysql:8.0 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 33060/tcp, 0.0.0.0:9999->3306/tcp, :::9999->3306/tcp db_mysql
a21665817d61 mariadb "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 0.0.0.0:8888->3306/tcp, :::8888->3306/tcp busy_dirac
参数内容:CONTAINER ID
指容器id;IMAGE
指使用的镜像名称;COMMAND
指启动容器时运行的命令;STATUS
指容器状态;PORTS
指容器端口映射信息;NAMES
指容器名称;
停止和恢复容器
我们可以通过start
和stop
命令 来启动或停止一个容器,参数为容器ID或者容器名
docker stop 75812ef6b412 #停止一个容器 75812ef6b412
docker stop db_mysql #停止mysql服务的容器
docker start 75812ef6b412 #恢复停止中的容器 75812ef6b412
若容器在运行过程中发生异常而退出,docker ps
命令是看不到终止的进程的,可以通过-a
参数列出所有的进程,包括已经停止的(状态为Exited)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75812ef6b412 mysql:8.0 "docker-entrypoint.s…" 13 minutes ago Exited (0) 2 seconds ago db_mysql
a21665817d61 mariadb:10.7 "docker-entrypoint.s…" 24 minutes ago Up 24 minutes 0.0.0.0:8888->3306/tcp, :::8888->3306/tcp busy_dirac
删除容器
删除容器使用 docker rm
命令,可以通过容器名或者容器id进行删除
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
docker rm -f db_mysql
docker rm -f 75812ef6b412