Docker Compose 入门使用教程

大纲

前言

Docker Compose 介绍

Docker Compose 项目来源于以前的 Fig 项目,使用 Python 语言编写,是 Docker 官方推出的一款单机容器编排工具,与 Docker Swarm、Docker Machine 并称为 Docker 容器编排三剑客。其支持定义和运行多容器的应用,可以一条命令启动多个容器,使用 Docker Compose 后不再需要使用 Shell 脚本来启动容器。Docker Compose 通过一个配置文件来管理多个 Docker 容器,在配置文件中所有的容器通过 services 来定义,然后使用 docker-compose 命令来启动、停止、重启应用和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

Docker Compose 安装

安装 Docker Compose

Docker Compose 具体的版本号可以从 Docker Compose Releases 获取。

1
2
3
4
5
6
7
8
9
10
11
# 下载二进制文件,如果需要安装其他版本的话,修改下面命令中的版本号即可
# curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 校验二进制文件的完整性,对比下载页面中二进制文件真实的 SHA-256sum 值
# sha256sum /usr/local/bin/docker-compose

# 赋予二进制文件可执行权限
# chmod +x /usr/local/bin/docker-compose

# 查看 docker-compose 的版本号
# docker-compose version

安装命令自动补全工具

这里安装 Docker Compose 命令自动补全工具,是为了日常更方便使用 Docker Compose 命令。

1
2
3
4
5
# 安装 bash 命令自动补全软件包
# yum install bash-completion

# 下载 docker-compose 命令自动补全工具的二进制文件,这里的版本号必须和上面 docker-compose 的版本号一致
# curl -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

特别注意

Docker Compose 的命令自动补全功能需要重新登录(SSH)系统后才会生效。

Docker Compose 使用

管理镜像和容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 拉取镜像
# docker-compose pull

# 创建并前台启动容器
# docker-compose up

# 创建并后台启动容器
# docker-compose up -d

# 查看容器的运行状态
# docker-compose ps

# 启动容器
# docker-compose start

# 停止容器
# docker-compose stop

# 停止并删除容器,包括网络、数据卷(特别注意,此操作会删除所有容器的数据,且数据不可恢复)
# docker-compose down

若 YAML 配置文件不在当前目录下,或者配置文件名不是 docker-compose.ymldocker-compose.yaml,那么则需要通过 -f 参数指定 YAML 配置文件的路径

1
2
# 指定 YAML 配置文件,拉取镜像
# docker-compose -f /example/nacos-standalone-mysql-5.7.yml pull

指定网络模式

1
2
3
4
5
6
7
8
9
10
11
12
13
version: "3.5"

services:
nacos:
image: nacos/nacos-server:latest
container_name: nacos-standalone-mysql
env_file:
- /usr/nacos/env/nacos-standlone-mysql.env
volumes:
- /usr/nacos/logs/:/home/nacos/logs
- /usr/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
network_mode: host
restart: on-failure

指定环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3.5"

services:
nacos:
image: nacos:2.0.2
container_name: nacos-server
privileged: false
restart: always
ports:
- 8848:8848
environment:
- MODE=standalone
- TRACK=-javaagent:/opt/skywalking-agent.jar
- JAVA_OPTS=-Xms512m -Xmx1024m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC

声明外部网络

在 Docker Compose 中,可以通过在 networks 指令声明某个网络是外部网络(External Network)。外部网络是指在 Docker Compose 文件之外已经存在的网络,而 Docker Compose 文件只会引用它,而不会尝试重新创建。主要使用场景有两个,第一个是与其他 Docker Compose 项目共享网络,第二个是与非 Compose 管理的容器共享网络。以下是一个配置示例:

1
2
3
4
5
6
7
8
9
10
11
version: "3.5"

services:
nginx:
image: nginx:latest
networks:
- cloud-network

networks:
cloud-network:
external: true

指定容器的静态 IP

创建 Docker Compose 的配置文件 docker-compose.yml,然后写入以下内容,主要定义了容器 zookeeperdubbo-admin,其中通过自定义网络(网桥)来指定每个容器的 IP 地址(静态 IP)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: "3.5"

services:
zookeeper:
image: clay/zookeeper-server:3.4.13
container_name: dubbo-zookeeper
ports:
- 2181:2181
networks:
distributed-network:
ipv4_address: 172.171.0.2
volumes:
- '/container/zookeeper/log:/usr/local/zookeeper-3.4.13/log'
- '/container/zookeeper/data:/usr/local/zookeeper-3.4.13/data'
dubbo-admin:
image: clay/dubbo-admin:0.1
container_name: dubbo-admin
depends_on:
- zookeeper
networks:
distributed-network:
ipv4_address: 172.171.0.3
ports:
- 8083:8080

networks:
distributed-network:
name: distributed-network
driver: bridge
ipam:
config:
- subnet: 172.171.0.0/24

覆盖镜像中的 CMD 指令

1
2
3
4
5
6
7
8
9
10
11
12
13
version: "3.5"

services:
redis:
image: redis:5.0.4-stretch
container_name: redis-5.0.4
privileged: false
ports:
- 6379:6379
volumes:
- '/container/redis/data:/data'
- '/container/redis/redis.conf:/usr/local/etc/redis/redis.conf'
command: redis-server /usr/local/etc/redis/redis.conf

以交互式终端模式启动容器

比如,现在有命令 docker run -it node,那应该怎样使用 Docker Compose 来替代它呢?命令 docker run -it 启动的是一个交互式终端模式,因此在 docker-compose.yml 文件中,需要通过配置 stdin_opentty 来实现相同效果。使用示例如下:

1
2
3
4
5
6
7
8
version: '3.5'

services:
node-app:
image: node:latest
stdin_open: true # 等效于 -i,保持标准输入打开
tty: true # 等效于 -t,分配一个伪终端
command: bash # 可选,如果想直接进入 bash 终端

在定义完 YML 配置文件后,就可以使用以下命令来启动容器:

1
docker-compose up -d

或者,如果只想启动容器并附加到交互终端,可以使用:

1
docker-compose run node-app

这将会启动 node 镜像,并且提供一个交互式的终端,就像 docker run -it node 一样。按下 ctrl + pctrl + q 快捷键可以断开容器连接,但不关闭容器。

参考资料