大纲
前言
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
# sha256sum /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose version
|
安装命令自动补全工具
这里安装 Docker Compose 命令自动补全工具,是为了日常更方便使用 Docker Compose 命令。
1 2 3 4 5
| # yum install bash-completion
# 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.yml
、docker-compose.yaml
,那么则需要通过 -f
参数指定 YAML 配置文件的路径
1 2
| # 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
,然后写入以下内容,主要定义了容器 zookeeper
与 dubbo-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_open
和 tty
来实现相同效果。使用示例如下:
1 2 3 4 5 6 7 8
| version: '3.5'
services: node-app: image: node:latest stdin_open: true tty: true command: bash
|
在定义完 YML 配置文件后,就可以使用以下命令来启动容器:
或者,如果只想启动容器并附加到交互终端,可以使用:
1
| docker-compose run node-app
|
这将会启动 node
镜像,并且提供一个交互式的终端,就像 docker run -it node
一样。按下 ctrl + p
与 ctrl + q
快捷键可以断开容器连接,但不关闭容器。
参考资料