第 3 章 Docker 高级实践
在这一部分我们来介绍一些Docker的高级内容:
Dockerfile 和 Docker compose
3.1 Dockerfile
3.1.1 Dockerfile简介
什么是Dockerfile
Dockerfile类似于我们学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来。
Dockerfile的作用
1、找一个镜像: ubuntu
2、创建一个容器: docker run ubuntu
3、进入容器: docker exec -it 容器 命令
4、操作: 各种应用配置….
5、构造新镜像: docker commit
Dockerfile 使用准则
1、大: 首字母必须大写D
2、空: 尽量将Dockerfile放在空目录中。
3、单: 每个容器尽量只有一个功能。
4、少: 执行的命令越少越好。
Dockerfile 分为四部分:
基础镜像信息 从哪来?
维护者信息 我是谁?
镜像操作指令 怎么干?
容器启动时执行指令 嗨!!!
Dockerfile文件内容:
首行注释信息
指令(大写) 参数
Dockerfile使用命令:
1 | 构建镜像命令格式: |
3.1.2 Dockerfile快速入门
接下来我们快速的使用Dockerfile来基于ubuntu创建一个定制化的镜像:nginx。
1 | 创建Dockerfile专用目录 |
dockerfile内容
1 | # 构建一个基于ubuntu的docker定制镜像 |
进行构建操作
1 | 构建镜像 |
优化刚刚的Dockerfile文件
1 | # 构建一个基于ubuntu的docker定制镜像 |
运行修改好的Dockerfile进行构建
1 | :~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.2 . |
Dockerfile构建过程:
从基础镜像1运行一个容器A
遇到一条Dockerfile指令,都对容器A做一次修改操作
执行完毕一条命令,提交生成一个新镜像2
再基于新的镜像2运行一个容器B
遇到一条Dockerfile指令,都对容器B做一次修改操作
执行完毕一条命令,提交生成一个新镜像3
…
**构建过程镜像介绍
构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。提供了镜像调试的能力
3.1.3 基础指令详解
FROM
1 | FROM |
MAINTAINER
1 | MAINTAINER |
RUN
1 | RUN |
EXPOSE
1 | EXPOSE |
3.1.4 运行时指令详解
CMD
1 | CMD |
ENTRYPOINT
1 | ENTRYPOINT |
CMD ENTRYPOINT 综合使用实践
1 | 修改Dockerfile文件内容: |
3.1.5 文件编辑指令详解
ADD
1 | ADD |
COPY
1 | COPY |
VOLUME
1 | VOLUME |
VOLUME实践
1 | VOLUME实践 |
3.1.6 环境指令详解
ENV
1 | ENV |
ENV实践
1 | ENV实践: |
WORKDIR
1 | WORKDIR |
WORKDIR实践
1 | WORKDIR实践: |
USER与ARG
1 | USER |
3.1.7 触发器指令详解
触发器指令
1 | ONBUILD |
触发器实践
1 | 编辑Dockerfile |
1 | 构建子镜像Dockerfile文件 |
3.1.8 Dockerfile构建缓存
我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
1 | 取消缓存: |
3.2 Dockerfile构建go环境
接下来我们就来做一个工作实践,搭建一个go环境,然后尝试使用Dockerfile的方式,构造一个镜像。
3.2.1 项目描述
beego官方网站:https://beego.me/
我们借助于beego的简介,部署一个go项目,然后运行起来。
3.2.2 手工部署go语言环境
需求:
基于docker镜像,手工部署go项目环境
方案分析:
1、docker环境部署
2、go环境部署
3、go项目部署
4、测试
技术关键点:
1、docker环境部署
使用docker镜像启动一个容器即可
2、go环境部署
go软件的依赖环境
go软件的基本环境配置
3、go项目部署
beego框架的下载
项目文件配置
启动go项目
4、测试
宿主机测试
解决方案:
1、docker环境配置
1.1 获取docker镜像
1.2 启动docker容器
2、go环境部署
2.1 基础环境配置
2.2 go环境配置
3、go项目部署
3.1 获取beego代码
3.2 项目文件配置
3.3 项目启动
4、测试
4.1 宿主机测试
实施方案:
1 | 1、docker环境配置 |
3.2.3 Dockerfile案例分析
环境分析:
1、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。
因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的阿里云的源。
源内容:
1 | deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted |
由于阿里云的源出现问题所有更换为中科大的源 详情见3.1.1
2、软件安装,涉及到了各种软件
3、涉及到了go的环境变量设置
4、软件运行涉及到了软件的运行目录
5、项目访问,涉及到端口
关键点分析:
1、增加文件,使用 ADD 或者 COPY 指令
2、安装软件,使用 RUN 指令
3、环境变量,使用 ENV 指令
4、命令运行,使用 WORKDIR 指令
5、项目端口,使用 EXPOSE 指令
定制方案:
1、基于ubuntu基础镜像进行操作
2、增加国内源文件
3、安装环境基本软件
4、定制命令工作目录
5、执行项目
6、开放端口
3.2.4 Dockerfile实践
创建目录
1 | #创建目录 |
Dockerfile内容
1 | 构建一个基于ubuntu 的docker 定制镜像 |
3.3 Docker compose
Docker compose是一种docker容器的任务编排工具
官方地址:https://docs.docker.com/compose/
3.3.1 compose简介
任务编排介绍
场景:
我们在工作中为了完成业务目标,首先把业务拆分成多个子任务,然后对这些子任务进行顺序组合,当子任务按照方案执行完毕后,就完成了业务目标。
任务编排,就是对多个子任务执行顺序进行确定的过程。
常见的任务编排工具:
单机版: docker compose
集群版:
Docker swarm Docker
Mesos Apache
Kubernetes(k8s) Google
docker compose是什么
译文:
compose是定义和运行多容器Docker应用程序的工具。通过编写,您可以使用YAML文件来配置应用程序的服务。然后,使用单个命令创建并启动配置中的所有服务。要了解更多有关组合的所有特性,请参见特性列表。
docker compose的特点;
本质:docker 工具
对象:应用服务
配置:YAML 格式配置文件
命令:简单
执行:定义和运行容器
docker compose的配置文件
docker-compose.yml
文件后缀是yml
文件内容遵循 ymal格式
docker 和 Docker compose
Compose file format | Docker Engine release | Compose file format | Docker Engine release | |
---|---|---|---|---|
3.4 | 17.09.0+ | 2.3 | 17.06.0+ | |
3.3 | 17.06.0+ | 2.2 | 1.13.0+ | |
3.2 | 17.04.0+ | 2.1 | 1.12.0+ | |
3.1 | 1.13.1+ | 2.0 | 1.10.0+ | |
3.0 | 1.13.0+ | 1.0 | 1.9.1.+ |
官方地址:https://docs.docker.com/compose/overview/
3.3.2 compose 快速入门
docker compose 安装
1 | 安装依赖工具 |
PIP 源问题
1 | 用pip安装依赖包时默认访问https://pypi.python.org/simple/, |
compose简单配置文件
1 | 创建compose文件夹 |
docker-compose.yml 文件内容
1 | version: '2' |
运行一个容器
1 | 后台启动: |
3.3.3 compose命令详解
注意:
所有命令尽量都在docker compose项目目录下面进行操作
项目目录:docker-compose.yml所在目录
compose服务启动、关闭、查看
1 | 后台启动: |
容器开启、关闭、删除
1 | 启动一个服务 |
其他信息查看
1 | 查看运行的服务 |
3.3.4 compose文件详解
官方参考资料:
https://docs.docker.com/compose/overview/
文件命名:
后缀是 .yml
**YMAL介绍
YMAL文件格式:
1 | 李氏家族: |
compose文件样例:
1 | version: '2' # compose 版本号 |
格式详解:
1 | compose版本号、服务标识符必须顶格写 |
compose属性介绍
1 | 镜像: |
3.3.5 go项目实践
项目分析
需求:
自动部署一个集群,使用nginx代理两个go项目
流程分析:
1、go项目部署
2、nginx代理部署
3、docker 环境
4、docker compose任务编排
技术点分析:
1、go项目部署
go项目基础环境
go项目配置
2、nginx代理部署
nginx的配置文件
3、docker 环境
docker基础镜像
go镜像
nginx镜像
4、docker compose任务编排
4个任务:1个镜像构建任务、2个go任务、1个nginx任务
任务依赖关系:go任务执行依赖于nginx任务
镜像依赖:go镜像依赖于nginx镜像完毕
实施方案:
1、基础环境
1.1 compose基础目录
1.2 环境依赖文件:
sources.list、test.go、test1.go、test2.go、nginx-beego.conf
1.3 dockerfile文件
go项目环境的Dockerfile文件
2、任务编排文件
2.1 nginx任务
基于nginx镜像,增加一个nginx的代理配置即可
2.2 go基础镜像任务
基于ubuntu镜像,构建go基础环境镜像,参考3.2.4内容
该任务依赖于2.1 nginx任务
2.3 go项目任务
基于go基础镜像,增加测试文件即可
该任务依赖于2.2 go基础镜像任务
3、测试
3.1 集群测试
方案实施
1、基础环境
1.1 compose基础目录
创建compose基础目录
1 | :~$ mkdir /docker/compose/ |
1.2 环境依赖文件:
nginx配置文件
1 | 创建nginx专用目录 |
文件内容
1 | upstream beegos { |
go基础镜像依赖文件
1 | 创建go基础镜像目录: |
文件内容
1 | deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted |
或者
1 | RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list |
test.go配置文件
1 | package main |
go任务依赖文件:
beego1/test.go配置文件
1 | package main |
Beego2/test.go配置文件
1 | package main |
1.3 dockerfile文件
go项目环境的Dockerfile文件
创建Dockerfile文件
1 | :~$ vim dockerfile |
文件内容
1 | # 构建一个基于ubuntu 的docker 定制镜像 |
最终的文件目录结构
1 | :~# tree /docker/compose/ |
2、任务编排文件
docker-compose.yml文件内容
1 | version: '2' |
3、 最后测试
1 | 构建镜像 |