Docker Compose 是用来定义和运行多个Docker容器的工具。

Compose中有两个主要的概念:

  • 服务(Service): 一个应用的容器。
  • 项目(Project): 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义。

一个项目可以由多个服务关联而成,Compose用于管理项目。

安装

Mac下用自带的二进制包安装Docker后可以直接使用。

Linux下这样安装:

1
2
$ 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

安装完成后可以检查版本

1
2
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

实战

此最简DEMO参考自这里.

目录结构

1
2
3
4
|-docker-compose-demo/
| |-app.py
| |-Dockerfile
| |-docker-compose.yml

app.py中实现了一个最简单的Web应用,当访问一次就计数加一。

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)

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

Dockerfile中定制了Web应用的Docker镜像。

1
2
3
4
5
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

docker-compose.yml则是Docker Compose的模板文件,定义了Compose的组成和参数。

1
2
3
4
5
6
7
8
9
10
version: '3'
services:

web:
build: .
ports:
- "5000:5000"

redis:
image: "redis:alpine"

运行项目

1
$ docker-compose up

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

若要后台运行,则需要加-d参数

1
$ docker-compose up -d

指定配置文件

1
$ docker-compose -f docker-compose.dev.yml up

docker-compose.yml

详细的官方配置说明在这里

version

指定格式版本。在大多数情况下,最好使用支持的最新版本。你可以查看 Compose 文件参考获取Docker Engine版本与Compose格式版本的对应关系。

1
version: "3.8"

services

组成该compose项目的多个服务。

有空再补充。

可能会遇到的问题

  • 在某些环境下docker-compose up -d会出现unknown flag: --iidfile的错误

    参考这个帖子,切换回老版本的docker-compose

    1
    2
    $ rm -f /usr/local/bin/docker-compose
    $ curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
  • 出现类似”ERROR: Service ‘frontend’ failed to build : Error parsing reference: “node:lts-alpine3.13 as build-stage” is not a valid repository/tag: invalid reference format”的错误

    大概率是Docker Engine版本过低,需要升级Docker

    附一个在CentOS 7.x上升级Docker的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
    $ yum install -y yum-utils
    $ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    $ yum install docker-ce docker-ce-cli containerd.io
    $ systemctl start docker
    $ systemctl enable docker

    如果在离线环境下,可以参考这篇文章进行安装。

Reference