Docker
项目部署问题
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
Docker允许开发中将应用、依赖、函数库、配置一起打包形成可移植镜像
Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker如何解决开发、测试、生产环境有差异的问题?
- Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
一、Docker架构
1.1 基本概念
镜像:Docker将应用程序及其所需要的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器:镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离 ,对外不可见。
DockerHub:DockerHub是一个DockerHub镜像托管平台。这样的平台称为Docker Registry。
1.2 架构
Docker是一个CS架构,由两部分组成:
服务端(server):Docker守护进程,负责处理Docker命令,管理镜像、容器等。
客户端(client):通过命令或RestAPI向Docker服务端发送命令。可以在本地或远程向服务器发送指令。
二、CenOs安装Docker
2.1 安装Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable
test
和 nightly
三个更新频道。
官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。
2.2 CentOS安装Docker
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。
2.2.1 卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
1 | yum remove docker \ |
2.2.2 安装docker
首先需要大家虚拟机联网,安装yum工具
1 | yum install -y yum-utils \ |
然后更新本地镜像源:
1 | 设置docker镜像源 |
然后输入命令:
1 | yum install -y docker-ce |
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
2.2.3 启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
1 | # 关闭 |
通过命令启动docker:
1 | systemctl start docker # 启动docker服务 |
然后输入命令,可以查看docker版本:
1 | docker -v |
如图:
2.2.4 配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2.3 CentOS7安装DockerCompose
2.3.1 下载
Linux下需要通过命令下载:
1 | # 安装 |
如果下载速度较慢,或者下载失败,可以使用课前资料提供的docker-compose文件:
上传到/usr/local/bin/
目录也可以。
2.3.2 修改文件权限
修改文件权限:
1 | # 修改权限 |
2.3.3 Base自动补全命令:
1 | # 补全命令 |
如果这里出现错误,需要修改自己的hosts文件:
1 | echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts |
2.3.4 Docker镜像仓库
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry
2.3.5 简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
1 | docker run -d \ |
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
2.3.6 配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
1 | # 打开要修改的文件 |
2.3.7 带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
1 | version: '3.0' |
1 | docker-compose up -d |
推送镜像到私有镜像服务必须先tag,步骤如下:
- 重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080
1 | docker tag nginx:latest 192.168.150.101:8080/nginx:1.0 |
- 推送镜像
1 | docker push 192.168.150.101:8080/nginx1.0 |
- 拉取镜像
1 | docker pull 192.168.150.101:8080/nginx:1.0 |
三、Docker基本操作
3.1 镜像命令
镜像名称一般有两部分组成:[repository]:[tag]
如果没有指定tag,默认是latest,代表最新版本的镜像
案例
从DockerHub中拉取一个nginx镜像并查看。
1 | # 拉取一个nginx镜像 |
利用docker save
命令将nginx镜像到处到磁盘,然后通过load
加载回来
1 | # 打包镜像为压缩包 |
3.2 容器命令
案例1
创建并运行一个nginx容器。
1 | docker run --name mynginx -p 80:80 -d nginx |
docker run:创建并运行一个容器
–name:给容器起一个名称
-p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口。
-d:后台运行
-e KEY=VALUE:设置环境变量
nginx镜像名称
- 一般分为两部分,镜像名和版本号
[repository]:[tag]
,不写tag默认是最新版本 - 例如:mysql:5.7
- 一般分为两部分,镜像名和版本号
1 | # 查看容器 |
案例2
进入nginx容器,修改html文件的内容。
- 进入容器。
1 | docker exec -it mynginx bash |
- docker exec: 进入容器执行一个命令。
- -it:给当前进入的容器创建 一个标准的输入、输出终端,允许我们与容器交互。
- mynginx:要进入容器的名称。
- bash:进入容器后执行的命令,bash是一个linux终端交互命令。
1 | cd /usr/share/nginx/html |
- 关闭容器,启动容器,删除容器
1 | # 关闭容器 |
3.3 数据卷命令
容器和数据耦合问题
数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。
数据卷的操作基本语法如下:
1 | docker volume [COMMAND] |
docker volume
命令是数据卷操作,根据命令后面跟随的Command来确定下一步操作:
命令 | 描述 |
---|---|
create | 创建一个volume |
inspect | 显示一个或多个volume的信息 |
ls | 列出所有volume |
prune | 删除未使用的volume |
rm | 删除指定的volume |
1 | # 创建一个数据卷 |
3.3.1 数据卷挂载
我们在创建容器时,可以通过-v
参数来挂载一个数据卷到某一个容器目录。
容器创建时,如果发现挂载的数据卷不存在时,会自动创建。
创建一个nginx容器,修改容器内的html目录内的index.html内容。
1 | # 创建容器并挂载到html数据卷 |
挂载数据卷时,如果数据卷不存在会自动创建。
3.3.2 目录挂载
目录的挂载必须以/
或者./
开头,不然会被识别为数据卷。
创建并运行一个mysql容器,将宿主机目录直接挂载到容器。
- 在将课前资料中的mysql.tar文件上传到虚拟机,通过load命令加载为镜像
- 创建目录/tmp/myql/data
- 创建目录/tmp/myql/conf,将课前资料提供的hmy.cnf文件上传到/tmp/myql/conf
- 去DockerHub查阅资料,创建并运行MySQL容器,要求:
- 挂载/tmp/myql/data到mysql容器内数据存储目录
- 挂载/tmp/myql/conf/hmy.cnf到mysql容器的配置文件
- 设置MySQL密码
1 | # 创建目录 |
3.4 查看容器挂载的目录
1 | docker inspect containerid | grep -A 10 "Mounts" |
四、Dockerfile自定义镜像
镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成
镜像是分层结构,每一层称为一个Layer
- Baselmage层:包含级别的系统函数库、环境变量等、文件系统。
- Entrypoint:入口,是镜像中启动应用的命令
- 其他:在BaseImage基础上添加依赖、安装系统、完成整个应用的安装和配置。
Dockerfile
Dockerfile就是一个文本文件,其中包含一个一个的指令,用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
1 | mkdir -p /tmp/docker-demo |
Dockerfile文件
1 | # 指定基础镜像 |
案例
基于java:8-alpine镜像,将一个java项目构建为镜像。
Dockerfile
1 | # 指定基础镜像,java11使用 FROM openjdk:11 |
将Dockerfile文件放到和jar包一个目录下面
1 | # ./ 是Dockerfile所在的目录,打包成一个镜像 |
部署前端
1 | # 将项目放到/root/nginx/html下,对目录和配置文件进行挂载 |
五、容器网络互联
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
加入自定义网络的容器可以通过容器名互相访问,操作命令如下:
六、DockerCompose
DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个一个创建和运行容器。
Compose文本是一个文本文件,通过指令定义集群中每个容器如何运行。

其中hmall里面的depends_on表示依赖于mysql,到时候会先启动mysql。
命令
1 | docker compose [option] [COMMAND] |
准备好docker-compose.yaml文件
第二步启动
1
docker compose up -d
其他步骤
1
2
3
4
5docker images; # 查看镜像
docker ps -a; # 查看所有容器,或docker compose ps 列出所有启动的容器
# 删除,要先把所有容器删除,才能删除镜像
docker compose down;
docker rmi 镜像名称;
七、Docker镜像仓库
镜像仓库有公有和私有的两种形式:
公共仓库:例如Docker官方的Docker Hub,国内也有一些云服务商提供类似于Docker Hub的公开服务,比如网易云镜像服务
,阿里云镜像服务
等。
除了使用公开仓库外,用户还可以在本地搭建私有Docker Registry。企业自己的镜像最好采用Docker Registry来实现。