Docker-Compose 讲解

· 5,505 字 · 约 14 分钟
0

Docker-Compose 讲解

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

通过 Docker-Compose,不需要使用 shell 脚本来启动容器,而是使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令,根据 YAML 的文件配置创建并启动所有服务。

一、Docker-Compose 模板文件简介与部署架构

Compose 允许用户通过一个 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。Compose 模板文件是一个定义服务、网络和卷的 YAML 文件。

Docker-Compose 将所管理的容器分为三层:

  • 工程(project):一个工程包含多个服务。运行目录下的所有文件(docker-compose.yml 等)组成一个工程,若无特殊指定,工程名即为当前目录名。
  • 服务(service):一个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例。
  • 容器(container):实际运行的最小单元实例。

YAML 模板文件语法注意事项

YAML 是一种标记语言,可读性高。使用 YAML 时需要注意下面事项:

  • 使用缩进表示层级关系,不支持制表符 tab 键缩进,只能使用空格键缩进;
  • 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级,通常开头缩进 2 个空格;
  • 字符后缩进 1 个空格,如冒号 : ,逗号 , ,横杠 -
  • # 号注释;
  • 如果包含特殊字符用单引号 '' 引起来,布尔值必须用引号 "" 括起来;
  • 区分大小写。

二、YAML 模板文件核心指令详述

默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像,也可以通过 build 指令自动构建。以下是所有核心指令详解:

1、image

指定为镜像名称或镜像 ID。如果镜像不存在,Compose 将尝试从互联网拉取这个镜像。

YAML
services:
  web:
    image: nginx

2、build

指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

YAML
build: ./dir

3、command

覆盖容器启动后默认执行的命令。

YAML
command: bundle exec thin -p 3000

4、links

链接到其他服务容器,使用服务名称(同时作为别名)或服务别名(SERVICE:ALIAS)都可以。

YAML
links:
  - db
  - db:database
  - redis

5、external_links

链接到 docker-compose.yml 外部的容器,甚至并非是 Compose 管理的容器。

YAML
external_links:
  - redis_1
  - project_db_1:mysql

6、ports

暴露端口信息。格式为 宿主机器端口:容器端口(HOST:CONTAINER),或者仅仅指定容器的端口(宿主机器将会随机分配端口)。

YAML
ports:
  - "3306"
  - "8080:80"
  - "127.0.0.1:8090:8001"

7、expose

暴露端口,与 ports 不同的是 expose 只可以暴露端口而不能映射到主机,只供外部服务连接使用。

YAML
expose:
  - "3000"
  - "8000"

8、volumes

设置卷挂载的路径。可以设置 宿主机路径:容器路径(host:container)或加上访问模式(host:container:ro)。ro 是 readonly 模式。

YAML
volumes:
  - /var/lib/mysql:/var/lib/mysql
  - /configs/mysql:/etc/configs/:ro

9、volumes_from

挂载另一个服务或容器的所有数据卷。

YAML
volumes_from:
  - service_name
  - container_name

10、environment

设置环境变量。可以属于数组或字典两种格式。

YAML
environment:
  - RACK_ENV=development
  - SESSION_SECRET

11、env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

YAML
env_file: .env
env_file:
  - ./common.env
  - /opt/secrets.env

12、extends

基于已有的服务进行服务扩展。自动继承 common.yml 中的 webapp 服务及相关的环境变量。

YAML
web:
  extends:
    file: common.yml
    service: webapp

13、net

设置网络模式。使用和 docker client 的 –net 参数一样的值。

YAML
net: "bridge" # 容器默认连接的网络,即默认的 docker0 网络
net: "none" # 容器定制的网络栈
net: "container:[name or id]" # 使用另一个容器的网络配置
net: "host" # 在宿主网络栈上添加一个容器

14、pid

和宿主机系统共享进程命名空间,打开该选项的容器可以相互通过进程 ID 来访问和操作。

YAML
pid: "host"

15、dns / dns_search

配置 DNS 服务器及 DNS 搜索域。可以是单个值也可以是一个列表。

YAML
dns:
  - 8.8.8.8
  - 9.9.9.9
dns_search:
  - domain1.example.com

16、cap_add / cap_drop

添加或放弃容器的 Linux 能力(Capability)。

YAML
cap_add:
  - ALL
cap_drop:
  - NET_ADMIN

17、healthcheck

健康检查,非常有必要,等服务准备好以后再上线,避免更新过程中出现短暂的无法访问。

YAML
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost/alive"]
  interval: 5s
  timeout: 3s

18、depends_on

依赖的服务,优先启动。

YAML
depends_on:
  - redis

19、deploy

部署相关的配置(如在 swarm 模式下)。可以配置副本数量、资源限制等。

YAML
deploy:
  mode: replicated
  replicas: 2
  restart_policy:
    condition: on-failure
    max_attempts: 3
  resources:
    limits:
      cpus: "0.50"
      memory: 1g

三、完整 docker-compose.yml 实例 (Nacos 高可用集群)

以下是使用 Docker-Compose 编排 Nacos 集群的具体案例:

YAML
version: '3.5'
services:
  nacos1:
    restart: always
    image: nacos/nacos-server:${NACOS_VERSION}
    container_name: nacos1
    privileged: true
    ports:
      - "8001:8001"
      - "8011:9555"
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 1024M
    env_file:
      - ./nacos.env
    environment:
      NACOS_SERVER_IP: ${NACOS_SERVER_IP_1}
      NACOS_APPLICATION_PORT: 8001
      NACOS_SERVERS: ${NACOS_SERVERS}
    volumes:
      - ./logs_01/:/home/nacos/logs/
      - ./data_01/:/home/nacos/data/
      - ./config/:/home/nacos/config/
    networks:
      - ha-network-overlay
networks:
  ha-network-overlay:
    external: true

四、Docker-Compose 常用命令详细清单

1. docker-compose 命令格式

Bash/Shell
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  • -f, --file: 指定 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, --project-name: 指定项目名称,默认使用所在目录名称作为项目名。

2. docker-compose up

这个命令一定要记住,每次启动都要用到。

  • -d: 在后台运行服务容器。
  • --force-recreate: 强制重新创建容器,不能与 –no-recreate 同时使用。
  • --build: 在启动容器前构建服务镜像。

3. docker-compose ps

列出项目中目前的所有容器。

4. docker-compose stop / start

  • docker-compose stop: 停止正在运行的容器,可以通过 start 再次启动。
  • docker-compose start: 启动已经存在的服务容器。

5. docker-compose down

停止和删除容器、网络、卷、镜像。

  • --rmi type: 删除镜像。all 删除定义的所有镜像;local 删除镜像名为空的镜像。
  • -v, --volumes: 删除已经在 compose 文件中定义的和匿名的附在容器上的数据卷。

6. docker-compose logs

查看服务容器的输出日志。可以通过 -f 参数实现实时跟踪(类似于 tail -f)。

7. docker-compose build

构建(重新构建)项目中的服务容器。使用 --no-cache 可以不使用缓存构建。

8. docker-compose pull

拉取服务依赖的镜像。

9. docker-compose restart

重启项目中的服务。可以通过 -t 指定重启前停止容器的超时时间。

10. docker-compose rm

删除所有(停止状态的)服务容器。推荐先执行 stop 命令再执行 rm。

  • -f: 强制直接删除,包括非停止状态的容器。

11. docker-compose run

在指定服务上执行一个命令。例如 docker-compose run --rm web python manage.py migrate(执行完毕后自动删除临时容器)。

12. docker-compose scale

设置指定服务运行的容器个数,例如 docker-compose scale web=3 db=2

13. docker-compose pause / unpause

暂停或恢复一个服务容器。

14. docker-compose kill

通过发送 SIGKILL 信号来强制停止服务容器。支持通过 -s 参数指定发送的信号。

15. docker-compose config

验证并查看 compose 文件配置。当配置正确时,不输出任何内容,当文件配置错误时,输出具体的错误信息。