Docker进阶(1):浅尝Docker Compose
什么是Docker Compose
Compose是定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,您可以从配置中创建并启动所有服务。要了解有关Compose所有功能的更多信息,请参阅功能列表。
使用Compose
-
使用Dockerfile定义应用程序的环境,以便可以在任何地方复制。
-
在docker-compose.yml中定义构成应用程序的服务,以便它们可以在隔离环境中一起运行。
-
运行docker compose up, docker compose命令会启动并运行整个应用程序。你也可以使用docker-compose二进制文件运行docker-compose up。
docker-compose.yml如下所示:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
有关编写文件的更多信息,请参阅编写文件参考。
Compose具有管理应用程序整个生命周期的命令:
- 启动、停止和重建服务
- 查看运行服务的状态
- 流化运行服务的日志输出
- 在服务上运行一次性命令
安装Docker Compose
-
运行以下命令以下载Docker Compose的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
-
可以选择,为bash和zsh shell安装命令补全
-
测试安装
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
体验Docker Compose
第一步:设置
-
创建并进入文件夹
mkdir composetest
cd composetest
-
创建一个app.py文件并添加以下内容
vim app.py
一个计数的例子
在这里,redis是应用程序网络上redis容器的主机名。我们使用Redis的默认端口,6379。
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
-
在项目目录中创建另一个名为requirements.txt的文件
vim requirements.txt
flask
redis
第二步:创建Dockerfile
在此步骤中,您将编写构建Docker映像的Docker文件。该映像包含Python应用程序所需的所有依赖项,包括Python本身。在项目目录中,创建一个名为Dockerfile的文件,并粘贴以下内容
vim Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
# 这告诉Docker:
# 以Python 3.7映像开始构建映像。
# 将工作目录设置为/code。
# 设置flask命令使用的环境变量。
# 安装gcc和其他依赖项
# 复制requirements.txt并安装Python依赖项。
# 向图像中添加元数据,以描述容器正在端口5000上监听
# 将项目中的当前目录复制到图像中的工作目录。
# 将容器的默认命令设置为flask run
第三步:在编写文件中定义服务
vim docker-compose.yml
在项目目录中创建一个名为docker-compose.yml的文件,并粘贴以下内容:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
此编写文件定义了两项服务:web和redis。
web服务使用从当前目录中的Dockerfile构建的映像。然后,它将容器和主机绑定到暴露的端口8000。此示例服务使用Flask Web服务器5000的默认端口。
redis服务使用从Docker Hub注册表中提取的公共Redis映像。
第四步:使用Compose
从项目目录中,通过运行docker-compose up应用程序。
docker-compose up
在浏览器中输入http://机器IP:8000/以查看应用程序正在运行。

停止应用程序,要么从第二个终端的项目目录中运行docker-compose down,要么在启动应用程序的原始终端中点击CTRL+C
总结
- 创建应用app.py
- Dockerfile将应用打包为镜像
- yaml文件定义完整的上线服务
- 启动compose项目
可以查看一下images和network都增加了些什么
yaml编写规则
yaml的编写一般分为4层,分别是版本、服务、网络和挂载
每个服务下可以根据自己的需求来进行配置
version: "3.9"
services:
services_1:
……
services_2:
……
……
networks:
volumes:
浙公网安备 33010602011771号