Docker Compose
Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤
- 使用 Dockerfile 定义应用程序的环境
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
- 执行 docker-compose up 命令来启动并运行整个应用程序
配置示例
docker-compose.yml 的配置案例如下:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose 安装
Linux 安装
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases
运行以下命令以下载 Docker Compose 的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
国内加速
你可以使用以下命令通过国内镜像加速安装:
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
docker-compose version
Alpine Linux 注意事项
对于 Alpine,需要以下依赖包:py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
macOS 安装
Mac 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Mac 用户不需要单独安装 Compose。
Windows 安装
Windows 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Windows 用户不需要单独安装 Compose。
使用教程
1. 准备
创建一个测试目录:
mkdir composetest
cd composetest
在测试目录中创建一个名为 app.py 的文件:
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 文件:
flask
redis
2. 创建 Dockerfile
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
COPY . .
CMD ["flask", "run"]
Dockerfile 说明
FROM python:3.7-alpine
:使用 Python 3.7 Alpine 镜像作为基础镜像WORKDIR /code
:设置工作目录为 /codeENV FLASK_APP app.py
:设置环境变量RUN apk add
:安装 gcc 等依赖COPY
:复制项目文件CMD
:设置默认的容器启动命令
3. 创建 docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
配置说明
- 定义了两个服务:web 和 redis
- web 服务使用当前目录的 Dockerfile 构建
- 将容器的 5000 端口映射到主机的 5000 端口
- redis 服务使用 Docker Hub 的公共 Redis 镜像
4. 构建和运行
在测试目录中执行以下命令来启动应用程序:
docker-compose up
后台运行
如果想在后台执行该服务可以加上 -d 参数:
docker-compose up -d
配置指令参考
version
指定 docker-compose.yml 文件的版本。
version: "3.7"
build
配置构建时的选项。
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
target: prod
build 配置项
context
:上下文路径dockerfile
:指定构建镜像的 Dockerfile 文件名args
:添加构建参数labels
:设置构建镜像的标签target
:多层构建,可以指定构建哪一层
command
覆盖容器启动后默认执行的命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
depends_on
设置依赖关系。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意
depends_on 不会等待服务完全启动才启动依赖它的服务。它只保证启动顺序。
environment
设置环境变量。
environment:
RACK_ENV: development
SHOW: 'true'
ports
暴露端口。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
volumes
挂载数据卷或主机目录。
volumes:
- /var/lib/mysql
- ./cache:/tmp/cache
- ~/configs:/etc/configs/:ro
networks
配置容器连接的网络。
services:
web:
networks:
- frontend
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge