下面将实际部署 Compose 文件中定义的应用。可以从我的百度网盘(https://pan.baidu.com/s/1Q0tcQnSqUQ06rfEdH_MBaw 提取码: a55v)下载所需的文件。
将代码下载到本地,并部署到新创建的名为 counter-app 的目录中。
该目录包含所需的所有文件,可以作为构建上下文。
Docker Compose 会使用目录名(counter-app)作为项目名称,这一点在后续的操作中会看到,Docker Compose 会将所有的资源名称中加上前缀 counter-app_。
进入 counter-app 目录中,检查文件是否存在。
简要介绍这几个文件。
app.py 显然是应用的核心文件,而 docker-compose.yml 文件将应用的所有组件组织起来。
下面使用 Docker Compose 将应用启动起来。以下所有的命令都是运行在刚才创建的 counter-app 目录下的。
$ docker-compose up &
[1] 1635
Creating network "counterapp_counter-net" with the default driver
Creating volume "counterapp_counter-vol" with default driver
Pulling redis (redis:alpine)...
alpine: Pulling from library/redis
1160f4abea84: Pull complete
a8c53d69ca3a: Pull complete
<Snip>
web-fe_1 | * Debugger PIN: 313-791-729
启动应用将花费几秒钟时间,其输出也非常详尽。下面我们来讲解一下 docker-compose 命令。
常用的启动一个 Compose 应用(通过 Compose 文件定义的多容器应用称为“Compose 应用”)的方式就是 docker-compose up 命令。
它会构建所需的镜像,创建网络和卷,并启动容器。
默认情况下,docker-compose up 会查找名为 docker-compose.yml 或 docker-compose.yaml 的 Compose 文件。
如果 Compose 文件是其他文件名,则需要通过 -f 参数来指定。
如下命令会基于名为 prod-equus-bass.yml 的 Compose 文件部署应用。
使用 -d 参数在后台启动应用也是常见的用法,代码如下。
docker-compose up -d
--OR--
docker-compose -f prod-equus-bass.yml up -d
前面的示例命令在前台启动应用(没有使用 -d 参数),但是使用了 & 将终端窗口返回。
这种用法不太正规,所有的日志还是会直接输出到我们后续可能会用的终端窗口上。
这样应用就构建并启动起来了,可以直接使用 docker 命令来查看 Docker Compose 创建的镜像、容器、网络和卷。
可以看到有 3 个在部署过程中构建或拉取的镜像。
counterapp_web-fe:latest 镜像源自 docker-compose.yml 文件中的 build: . 指令。
该指令让 Docker 基于当前目录下的 Dockerfile 来构建一个新的镜像。
该镜像基于 python:3.4-alpine 构建,其中包含 Python Flask Web 应用的程序代码。更多信息可以通过查看 Dockerfile 的内容进行了解。
为了方便理解,每一行都添加了注释。部署时要删除掉。
请注意,Docker Compose 会将项目名称(counter-app)和 Compose 文件中定义的资源名称(web-fe)连起来,作为新构建的镜像的名称。
Docker Compose 部署的所有资源的名称都会遵循这一规范。
由于 Compose 文件的 .Services.redis 项中指定了 image: "redis:alpine",因此会从 Docker Hub 拉取 redis:alpine 镜像。
如下命令列出了两个容器。每个容器的名称都以项目名称(所在目录名称)为前缀。此外,它们还都以一个数字为后缀用于标识容器实例序号,因为 Docker Compose 允许扩缩容。
counterapp_web-fe 容器中运行的是应用的 Web 前端。其中执行的是 app.py,并且被映射到了 Docker 主机的 5000 端口,稍后会进行连接。
如下的网络和卷列表显示了名为 counterapp_counter-net 的网络和名为 counterapp_counter-vol 的卷。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
1bd949995471 bridge bridge local
40df784e00fe counterapp_counter-net bridge local
f2199f3cf275 host host local
67c31a035a3c none null local
$ docker volume ls
DRIVER VOLUME NAME
<Snip>
local counterapp_counter-vol
应用部署成功后,读者可以用 Docker 主机的浏览器连接 5000 端口来查看应用的运行效果,如下图所示。
单击浏览器的刷新按钮,计数会增加。
如果使用 & 启动应用,那么可以在终端窗口中看到包含 HTTP 响应码 200 的日志。这表明请求收到了正确的响应,每次加载页面都会有日志打印出来。
到此,多容器的应用已经借助 Docker Compose 成功部署了。