前言
Docker Compose
的前身是Fig
,Fig
是一个由Orchard
公司开发的多容器管理工具。这是一个基于Docker
的Python
工具,允许用户基于一个YAML
文件定义多容器应用,从而可以使用fig
命令行工具进行应用的部署,还能实现对应用的生命周期进行管理。而后,Docker
公司收购了Fig
,并更为为Docker Compose
,命令行工具fig
更名为docker-compose
,自此成为绑定在Docker
引擎之上的外部工具。
安装Docker Compose
在Linux
上安装Docker Compose
可分为两步:
- 使用
curl
命令下载二进制文件 - 使用
chmod
命令赋予权限 -
验证版本号
$ curl -L \ curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-\ `uname -s`-`uname -m` \ -o /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose $ docker-compose --version #查看版本 docker-compose version 1.25.1-rc1, build d92e9bee
Compose 文件
Docker Compose
使用YAML
文件来定义多服务的应用,网络和卷,文件存放的默认路径是:./docker-compose.yml
,可传入-f
参数指定具体文件,并且支持.yml
和.yaml
扩展名。YAML
文件是JSON
的一个子集(JSON
是JavaScript
的子集),因此也可以使用JSON
文件进行数据传输。
YAML
文件有以下语法规则:
- 大小写敏感
- 使用缩进表示层级关系,相同缩进表示同级
key
(理解为相同层级) - 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
-
#
表示注释,从这个字符一直到行尾,都会被解析器忽略。
使用Docker Compose
部署应用
- 帮助文档
$ docker-compose --help #查看帮助
-
拉取源码,查看项目结构
$ git clone https://github.com/nigelpoulton/counter-app.git $ cd counter-app/ $ tree -C #查看树状图结构 . ├── app.py ├── docker-compose.yml ├── Dockerfile ├── README.md └── requirements.txt
用tree查看工作目录结构,一目了然!
简要介绍这几个文件:
app.py
是应用程序代码(一个Python Flask应用)同时也是核心文件;docker-compose.yml
是Compose
文件,用于指导Docker
如何部署应用;Dockerfile
定义了如何构建应用服务的镜像;requirements.txt
列出了应用所需依赖的Python
包。 -
启动
Compose
应用$ docker-compose up & #前台启动应用,&表示返回终端窗口
默认情况下,
docker-compose up
会查找名为docker-compose.yml
或docker-compose.yaml
的Compose
文件。*如果Compose
文件是其他文件名,则需要通过-f
参数来指定。$ docker-compose -f prod-equus-bass.yml up #指定prod-equus-bass.yml文件名启动应用
如果需要在后台启动应用,需要传入
-d
参数:$ docker-compose up -f prod-equus-bass.yml up -d #指定文件名在后台启动应用
查看启动
Compose
应用的过程中构建或者拉取的镜像:请注意,第
1
行的镜像名counter-app_web-fe
会将项目名称counter-app
和服务应用名称web-fe
连接,作为新构建的镜像名称。$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE counter-app_web-fe latest 19989da561d9 14 minutes ago 84.5MB redis alpine a49ff3e0d85f 11 days ago 29.3MB python 3.4-alpine c06adcf62f6e 8 months ago 72.9MB
查看
Dockerfile
文件信息:FROM python:3.4-alpine #基础镜像 ADD . /code #将app.py文件复制到镜像中 WORKDIR /code #设置工作目录 RUN pip install -r requirements.txt #安装依赖 CMD ["python", "app.py"] #设置默认启动的应用
查看
Docker Container
信息:显示出两个容器,都是以项目名称
counter-app
为前缀的容器名称。此外,观察容器名的数组后缀1
表示容器实例序号——与容器扩缩容有关。$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS c3a032dfd36b redis:alpine "docker-entrypoint.s…" 30 minutes ago Up 30 minutes fa448d107b92 counter-app_web-fe "python app.py" 30 minutes ago Up 30 minutes PORTS NAMES 6379/tcp counter-app_redis_1 #注意这里的数字后缀1 0.0.0.0:5000->5000/tcp counter-app_web-fe_1
查看网络和卷:
$ docker network ls #网络 79a6c4de07ff bridge bridge local e0de8f8c1f7b counter-app_counter-net bridge local 38598419a27a host host local c90f1a680fa6 none null local $ docker volume ls #卷 local 22ae5189527230e12431b9125d66b28e91d93eb96eaeac86078de217aa25665a local counter-app_counter-vol
- 应用部署测试
应用部署成功后,在浏览器输入
ip:port
形式查看应用的运行效果
使用Docker Compose
管理应用
如果想要对一个应用的生命周期进行管理,可以使用以下命令:
$ docker-compose up #启动应用
$ docker-compose restart #重启应用
$ docker-compose stop #停止应用,不会删除资源
$ docker-compose rm #删除应用和网络,只留下卷和镜像
$ docker-compose down #删除应用和网络,只留下镜像、卷、源码
Stopping counter-app_redis_1 ...
Stopping counter-app_web-fe_1 ...
redis_1 | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1 | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1 | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1 | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1 | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1 | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1 | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1 | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1 | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1 | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1 | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
redis_1 | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1 | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
redis_1 | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1 | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
Stopping counter-app_web-fe_1 ... done
counter-app_web-fe_1 exited with code 0
counter-app_web-fe_1 exited with code 0
counter-app_redis_1 exited with code 0
Stopping counter-app_redis_1 ... done
counter-app_redis_1 exited with code 0
Removing counter-app_redis_1 ... done
Removing counter-app_web-fe_1 ... done
Removing network counter-app_counter-net
[1] 已完成 docker-compose up
[2]- 已完成 docker-compose up
[3]+ 已完成 docker-compose up
$ docker-compose ps #查看应用日志
Name Command State Ports
------------------------------
需要特别注意的是,虽然部署应用被删除了,但是counter-vol
卷并没有被删除,因为卷是应用于数据的持久化存储的。因此,卷的生命周期与相应的容器应该是完全解耦的,删除或启动容器,并不会影响到卷。
$ docker volume ls #查看卷
local 22ae5189527230e12431b9125d66b28e91d93eb96eaeac86078de217aa25665a
local counter-app_counter-vol
$ docker-compose ps #查看应用日志
Name Command State Ports
--------------------------------------------------------------------------------------
counter-app_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
counter-app_web-fe_1 python app.py Up 0.0.0.0:5000->5000/tcp
如果再次启动应用,会发现启动速度变得更快了,这是因为卷已经存在,不需要再去拉取和构建新的镜像。
如果想要查看应用内的进程,则需要:
$ docker-compose top #查看应用内进程
counter-app_redis_1
UID PID PPID C STIME TTY TIME CMD
------------------------------------------------------------------
guest-r+ 1216 1165 0 18:42 ? 00:00:00 redis-server
counter-app_web-fe_1
UID PID PPID C STIME TTY TIME CMD
------------------------------------------------------------------------------------
root 1231 1181 0 18:42 ? 00:00:00 python app.py
root 1426 1231 0 18:42 ? 00:00:02 /usr/local/bin/python /code/app.py
注意,PID
编号是在docker
主机上,而不是容器(应用)内的进程ID
。
Dockerfile
和Docker Compose
文件的对比
Dockerfile 文件和Docker Compose
文件最大的区别是:前者的代码文件是复制到./code
目录,而后者的代码文件是直接挂载到卷上的,如果卷中有任何修改,这种变化会立刻反映到应用中。
查看卷挂载于Docker
主机上的什么位置:
$ docker volume inspect counter-vol | grep Mount