Docker Compose

本篇介绍 Docker Compose 的概念与三步使用流程、Compose 的安装、docker-compose.yml 文件的结构与常用指令,并通过一个 Python Web + Redis 的实战示例贯穿构建、启动、后台运行、停止与查看环境变量等常用命令。

一、Docker Compose 简介

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

使用 Compose 基本上是一个三步过程:

  1. 定义应用程序的环境,编写 Dockerfile,以便应用可以在任何地方复制运行。
  2. 定义构成应用程序的服务,编写 docker-compose.yml,以便各服务可以在隔离的环境中一起运行。
  3. 运行 docker-compose up,Compose 启动并运行整个应用程序。

docker-compose.yml 模板

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

二、安装 Docker Compose

2.1 下载二进制文件

运行以下命令下载 Docker Compose 的当前稳定版本(以 1.24.0 为例):

curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如需安装其他版本,将命令中的 1.24.0 替换为所需的 Compose 版本即可。

2.2 赋予可执行权限

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

或者设置软链接:

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

2.3 验证安装

docker-compose -version
docker-compose version 1.24.0, build 0aa59064

三、docker-compose.yml 结构说明

docker-compose.yml 通过 YAML 语法描述服务,常用顶层与服务级指令如下:

指令 层级 说明
version 顶层 指定 Compose 文件格式版本,如 '3'
services 顶层 定义应用的各个服务
volumes 顶层 声明可供服务挂载的数据卷
networks 顶层 声明服务使用的网络
image 服务级 指定服务所使用的镜像
build 服务级 指定构建上下文(包含 Dockerfile 的目录路径),Compose 会基于此构建镜像
ports 服务级 暴露端口,格式为 "宿主机端口:容器端口"
volumes 服务级 挂载数据卷或绑定宿主机目录
environment 服务级 设置容器环境变量
depends_on 服务级 设置服务依赖与启动顺序
networks 服务级 指定服务加入的网络
links 服务级 连接到其他服务(较旧写法,新版本推荐使用网络)

四、实战:在 Compose 上运行 Python Web 应用

下面构建一个运行在 Docker Compose 上的 Python Web 应用程序。开始前请确保已安装 Docker 和 Docker Compose。

4.1 创建项目目录

mkdir /composetest
cd /composetest

4.2 编写 app.py

在目录中创建 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)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

4.3 编写 requirements.txt

创建 requirements.txt,声明 Python 依赖:

flask
redis

4.4 编写 Dockerfile

编写用于构建镜像的 Dockerfile,该镜像包含 Python 应用所需的全部依赖(包括 Python 本身):

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

指令解析:

指令 说明
FROM 从 Python 3.4 镜像开始构建
ADD 将当前目录 . 添加到镜像中的 /code 路径
WORKDIR 将工作目录设置为 /code
RUN 安装 Python 依赖项
CMD 将容器的默认命令设置为 python app.py

4.5 编写 docker-compose.yml

创建 docker-compose.yml,内容如下:

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

该 Compose 文件定义了两个服务:web 和 redis。

  • web 服务:使用从当前目录的 Dockerfile 构建出的镜像,并将容器的 5000 端口绑定到宿主机的 5000 端口。此示例使用 Flask Web 服务器的默认端口 5000。
  • redis 服务:使用从 Docker Hub 拉取的公共 Redis 镜像。

4.6 使用 Compose 构建并运行

在项目目录下执行:

docker-compose up
Creating network "test_default" with the default driver
Building web
Step 1/5 : FROM python:3.4-alpine
3.4-alpine: Pulling from library/python
8e402f1a9c57: Pull complete
cda9ba2397ef: Pull complete
aafecf9bbbfd: Pull complete
bc2e7e266629: Pull complete
e1977129b756: Pull complete
Digest: sha256:c210b660e2ea553a7afa23b41a6ed112f85dbce25cbcb567c75dfe05342a4c4b
Status: Downloaded newer image for python:3.4-alpine
 ---> c06adcf62f6e
Step 2/5 : ADD . /code
 ---> 3db85f1ea02e
Step 3/5 : WORKDIR /code
 ---> Running in 2b89a8fdd46c
Removing intermediate container 2b89a8fdd46c
 ---> b7810a62cb13
Step 4/5 : RUN pip install -r requirements.txt
 ---> Running in 3bea2169e30e
DEPRECATION: Python 3.4 support has been deprecated. pip 19.1 will be the last one supporting it. Please upgrade your Python as Python 3.4 won't be maintained after March 2019 (cf PEP 429).
Collecting flask (from -r requirements.txt (line 1))
......

构建完成后,在浏览器输入 http://<服务器IP>:5000,即可看到 Web 界面。

五、Compose 常用命令

5.1 后台运行与停止

使用 -d 参数让容器在后台运行:

docker-compose up -d
Starting test_web_1   ... done
Starting test_redis_1 ... done

停止运行中的容器:

docker-compose stop
Stopping test_web_1   ... done
Stopping test_redis_1 ... done

5.2 查看服务环境变量

使用 run 可以一次性运行某个服务中的命令,例如查看 web 服务的环境变量:

docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=8e3d7bb7ac53
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.4.10
PYTHON_PIP_VERSION=19.0.3
HOME=/root

5.3 更多命令

可通过以下命令查看完整帮助:

docker-compose --help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert keys
                              in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

常用命令速查:

命令 作用
docker-compose up 创建并启动容器(前台运行)
docker-compose up -d 创建并启动容器(后台运行)
docker-compose down 停止并删除容器、网络、镜像和数据卷
docker-compose ps 列出 Compose 管理的容器
docker-compose logs 查看容器输出
docker-compose stop 停止服务
docker-compose start 启动服务
docker-compose restart 重启服务
docker-compose build 构建或重新构建服务镜像
docker-compose exec <service> <cmd> 在运行中的服务容器里执行命令
docker-compose run <service> <cmd> 一次性运行服务中的命令
docker-compose scale <service>=n 设置某服务的容器数量
docker-compose rm 删除已停止的容器
最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏