Docker Compose

Compose 简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤

  1. 使用 Dockerfile 定义应用程序的环境
  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
  3. 执行 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

将可执行权限应用于二进制文件:

sudo chmod +x /usr/local/bin/docker-compose

创建软链:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

docker-compose version

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:设置工作目录为 /code
  • ENV 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

配置指令参考

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

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