使用Docker Compose管理多个容器

发布时间: 更新时间: 总字数:2181 阅读时间:5m 作者: IP上海 分享 网址

Docker Compose 是一个用来定义和运行复杂应用的 Docker 工具。使用 Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。- github.com/docker/compose

安装 Docker Compose

Linux 通用安装脚本

curl -L https://github.com/docker/compose/releases/download/1.28.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

ubuntu

apt install docker-compose

help

# docker-compose --help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  -c, --context NAME          Specify a context name
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert keys
                              in v3 files to their non-Swarm equivalent (DEPRECATED)
  --env-file PATH             Specify an alternate environment file

Commands:
  build              Build or rebuild services
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show version information and quit

配置文件

version

指定本 yml 依从的 compose 哪个版本制定的

build

指定为构建镜像上下文路径:

例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:

version: "3.7"
services:
  webapp:
    build: ./dir

或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile
      args:
        buildno: 1
      labels:
        - "cn.xiexianbin.description=Accounting webapp"
        - "cn.xiexianbin.department=Finance"
        - "cn.xiexianbin.label-with-empty-value"
      target: prod
  • context:上下文路径
  • dockerfile:指定构建镜像的 Dockerfile 文件名
  • args:添加构建参数,这是只能在构建过程中访问的环境变量
  • labels:设置构建镜像的标签
  • target:多层构建,可以指定构建哪一层
  • docker-compose up -d [--no-build|--no-recreate] 是不会重新构建镜像,使用 --build 才会重新构建镜像

cap_add,cap_drop

添加或删除容器拥有的宿主机的内核功能

cap_add:
  - ALL # 开启全部权限

cap_drop:
  - SYS_PTRACE # 关闭 ptrace权限

cgroup_parent

为容器指定父 cgroup 组,意味着将继承该组的资源限制

cgroup_parent: m-executor-abcd

command

覆盖容器启动的默认命令

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name

指定自定义容器名称,而不是生成的默认名称

container_name: my-web-container

depends_on

设置依赖关系

  • docker-compose up # 以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE # 自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop # 按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
    environment:
      - TZ=Asia/Shanghai
    container_name: web-1
    restart: always
    logging:
        driver: "json-file"
        options:
            max-size: 100m
            max-file: "5"
  redis:
    image: redis
  db:
    image: postgres

注意:web 服务不会等待 redis db 完全启动 之后才启动

devices

指定设备映射列表

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

device_ids

使用指定的 GPU

deploy:
  resources:
    reservations:
      devices:
      	- device_ids: ["1"]
        capabilities: ["gpu"]
        driver: "nvidia"

dns

自定义 DNS 服务器,可以是单个值或列表的多个值

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

自定义 DNS 搜索域。可以是单个值或列表

dns_search: example.com

dns_search:
  - dc1.example.com
  - dc2.example.com

entrypoint

覆盖容器默认的 entrypoint

entrypoint: /code/entrypoint.sh

entrypoint:
    - ping
    - -c
    - c
    - xiexianbin.cn

env_file

参考,从文件添加环境变量。可以是单个值或列表的多个值

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
$ cat .env
TAG=v1.5

$ cat compose.yml
services:
  web:
    image: "webapp:${TAG}"

$  docker compose config
services:
  web:
    image: 'webapp:v1.5'

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False

environment:
  RACK_ENV: development
  SHOW: 'true'

expose

暴露端口,但不映射到宿主机,只被连接的服务访问

仅可以指定内部端口为参数:

expose:
 - "3000"
 - "8000"

extra_hosts

添加主机名映射。类似 docker client --add-host

extra_hosts:
 - "somehost:1.1.1.1"

以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:

1.1.1.1  somehost

healthcheck

version: "3.9"

services:
  app:
    ...
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
      interval: 1m30s # 设置检测间隔
      timeout: 10s # 设置检测超时时间
      retries: 3 # 设置重试次数
      start_period: 40s # 启动后,多少秒开始启动检测程序
    restart: on-failure

image

指定容器运行的镜像。以下格式都可以:

image: redis
image: ubuntu:14.04
image: tutum/influxdb

logging

服务的日志记录配置。

driver:指定服务容器的日志记录驱动程序,默认值为 json-file。有以下三个选项

  • driver: “json-file”
  • driver: “syslog”
  • driver: “none”

仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。

logging:
  driver: json-file
  options:
    max-size: "100m" # 单个文件大小为100m
    max-file: "5" # 最多5个文件

当达到文件限制上限,会自动删除旧得文件。

syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://172.20.1.10:123"

network_mode

设置网络模式

  • network_mode: “bridge”
  • network_mode: “host”
  • network_mode: “none”
  • network_mode: “service:[service name]”
  • network_mode: “container:[container name/id]”

networks

配置容器连接的网络,引用顶级 networks 下的条目

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2
  • aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
  • restart
    • no:是默认的重启策略,在任何情况下都不会重启容器。
    • always:容器总是重新启动。
  • on-failure:在容器非正常退出时(退出状态非 0),才会重启容器。
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器
  • restart: “no”
  • restart: always
  • restart: on-failure
  • restart: unless-stopped

secrets

存储敏感数据,例如密码:

version: "3.1"
services:

mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret

secrets:
  my_secret:
    file: ./my_secret.txt

security_opt

修改容器默认的 schema 标签

security-opt:
  - label:user:USER   # 设置容器的用户标签
  - label:role:ROLE   # 设置容器的角色标签
  - label:type:TYPE   # 设置容器的安全策略标签
  - label:level:LEVEL  # 设置容器的安全等级标签

stop_grace_period

指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。

stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒

默认的等待时间是 10 秒。

stop_signal

设置停止容器的替代信号。默认情况下使用 SIGTERM 。

以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。

stop_signal: SIGUSR1

sysctls

设置容器中的内核参数,可以使用数组或字典格式。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

tmpfs

在容器内安装一个临时文件系统。可以是单个值或列表的多个值。

tmpfs: /run

tmpfs:
  - /run
  - /tmp

ulimits

覆盖容器默认的 ulimit

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes

将主机的数据卷或着文件挂载到容器里

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

其他

定时重启

$ vim /etc/crontab
echo 0 3 * * * cd /path/of/some && /usr/local/bin/docker-compose down && /usr/local/bin/docker-compose up -d
echo 0 3 * * * cd /path/of/some && /usr/local/bin/docker-compose restart xxx
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数