Docker 之十七 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 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 的命令自动补全工具

1
2
3
4
5
6
7
# 安装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命令自动补全功能在重新登录后才会生效

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

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

Docker Compose 覆盖镜像中的 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 Compose 指定网络模式

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

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
ports:
- "8848:8848"
- "9555:9555"
network_mode: host
restart: on-failure

Docker Compose 指定环境变量

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

参考资料