Docker Compose 入门教程
Docker compose (以下简称为 compose)可用于定义和运行多容器 docker 应用程序。
通过 compose,我们可以使用 YAML 文件来配置应用程序的服务(services),然后只需要通过一个命令,就可以将配置的所有服务启动起来。
使用 compose 只需要三步:
- 使用
Dockerfile定义应用的环境,以便于可以任何地方复制应用的环境 - 使用
docker-compose.yml定义构成应用的服务,以便于它们可以在隔离的环境中一起运行 - 运行
docker-compose up命令,这时 compose 会启动并运行整个应用程序
安装
对于 Mac 系统 和 Windows 系统,安装 docker 桌面端时, compose 已经捆绑安装了。对于 Linux 系统安装 compose 也不麻烦,可以参考官方安装文档 https://docs.docker.com/compose/install/。
可以通过以下命令来测试 compose 安装是否成功:
1 | docker-compose --version |
输出:
docker-compose version 1.24.1, build 4667896b
实践:以 Flask 应用为例
我们以一个 Flask 应用程序为例,说明如何使用 compose 来配置相关的服务。
步骤一:编写源代码
- 创建源代码目录
composetest
1 | mkdir composetest |
- 创建 Flask 应用
创建 app.py 源代码:
1 | import time |
上述的代码中,redis 是 redis 容器的主机名称,且 redis 的监听端口为 6379。对于 compose 来说,可以使用容器名称来作为主机名称来访问其他容器,具体可以参考 compose 网络。
注意,如果使用 compose 运行 app.py,则 redis 的主机地址不能使用 127.0.0.1,否则会出现无法连接 redis 的报错。
- 创建 python 依赖
创建 requirements.txt 文件,里面包含应用程序依赖的 python 包。
1 | flask |
步骤二:创建 Dockerfile
接下来,我们编写 Dockerfile 文件来构建 docker 镜像。这个镜像包含了 flask 应用程序的依赖环境。
在 composetest 目录创建 Dockerfile 文件:
1 | FROM python:3.7-alpine |
这个 Dockerfile 文件作用包括:
- 构建的基础镜像是
python:3.7-alpine - 工作目录为
/code - 设置 flask 应用程序的环境变量,有关 flask 环境变量的使用,可以参考 flask quickstart
- 安装 gcc 等软件
- 复制
requirements.txt文件到工作目录,以便于安装有关 python 依赖 - 复制当前目录文件到工作目录
/code - 设置容器启动命令,以便启动 flask 应用程序
有关 Dockerfile 的使用,请参考官方文档 Dockerfile 官方文档。
步骤三:定义 compose 服务
接下来,我们编写 docker-compose.yml。在 composetest 目录创建 docker-compose.yml 文件:
1 | version: '3' |
在 docker-compose.yml 文件定义了两个服务:web 和 redis。
- web 服务:
web服务的镜像由Dockerfile来指定构建。另外,我们还指定的宿主机和容器间端口的映射关系 5000:5000 - redis 服务:
redis服务的镜像从 docker 镜像仓库拉取
注意每个服务都必须通过 image 指定镜像或 build 指令(需要 Dockerfile)来自动构建生成镜像。
最后,composetest 目录内的文件如下图所示:
步骤四:运行
进入 composetest 目录,执行命令:
1 | docker-compose up |
接下来,compose 会构建 web 镜像,拉取 redis 镜像,并启动服务。
启动完毕,打开浏览器,输入地址 http://localhost:5000/,会看到以下输出:
Hello World! I have been seen 1 times.
刷新一下页面,会看到数据不断地增加 1。
使用命令 docker images 可以观察到当前的镜像,使用命令 docker ps -a 可以观察当前正在运行的容器,有需要的话,还可以使用命令 docker exec -it xxx /bin/sh 进入容器。
为了关闭并删除 compose 启动的容器,可以执行命令:
1 | docker-compose down |
步骤五:往 compose 文件添加 bind mount
修改 docker-compose.yml 文件,往 web 服务添加 bind mount:
1 | version: '3' |
通过 volumes 关键字我们将当前目录 composetest 挂载到容器内的 /code 目录,这样一来,我们就可以随时修改应用程序的源代码,而不需要重新构建镜像。
同时,我们增加了新的环境变量 FLASK_ENV(值为 development),这使得可以修改 flask 应用的代码随即生效,而不需要对 flask 应用进行重启。
有关 bind mount 的使用,可以参考文章 《Docker 数据持久化》。
重新执行命令 docker-compose up,启动应用程序。打开浏览器,输入地址,看到输出
Hello World! I have been seen 1 times.
这时,修改本地 composetest 目录的 app.py 源代码,调整问候语,然后保存。
1 |
|
再刷新浏览器,可以看到输出的问候语已更新,说明由于 bind mount 的使用,通过修改本地源代码而不需要重新构建镜像,应用程序就已经得到了更新。
Hello from Docker! I have been seen 2 times.
参考资料
- https://docs.docker.com/compose/
- https://docs.docker.com/compose/install/
- https://docs.docker.com/compose/wordpress/
- https://juejin.im/post/5d17442e518825559f46ed92
- https://www.jianshu.com/p/4c4b8e8f9f55
- https://docs.docker.com/compose/gettingstarted/
- https://flask.palletsprojects.com/en/1.1.x/quickstart/
- https://docs.docker.com/compose/networking/
- https://yeasy.gitbooks.io/docker_practice/compose/compose_file.html