Docker Compose
的前身是Fig
,Fig
是一个由Orchard
公司开发的多容器管理工具。这是一个基于Docker
的Python
工具,容许用户基于一个YAML
文件定义多容器应用,从而可使用fig
命令行工具进行应用的部署,还能实现对应用的生命周期进行管理。然后,Docker
公司收购了Fig
,并更为为Docker Compose
,命令行工具fig
改名为docker-compose
,自此成为绑定在Docker
引擎之上的外部工具。python
在Linux
上安装Docker Compose
可分为两步:git
curl
命令下载二进制文件chmod
命令赋予权限验证版本号github
$ 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
Docker Compose
使用YAML
文件来定义多服务的应用,网络和卷,文件存放的默认路径是:./docker-compose.yml
,可传入-f
参数指定具体文件,而且支持.yml
和.yaml
扩展名。YAML
文件是JSON
的一个子集(JSON
是JavaScript
的子集),所以也可使用JSON
文件进行数据传输。web
YAML
文件有如下语法规则:redis
key
(理解为相同层级)#
表示注释,从这个字符一直到行尾,都会被解析器忽略。Docker Compose
部署应用$ docker-compose --help #查看帮助
拉取源码,查看项目结构docker
$ 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
包。shell
启动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
形式查看应用的运行效果
因为咱们使用的是在前台启动应用,使用&
将HTTP
状态码和日志返回到终端上,这时候能够看到:
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