Compose和Docker版本兼容性对应关系如下:

docker compose 设置 network docker compose network mode_回滚

docker compose的顶级配置项有:

  1. version 定义了版本信息
  2. services 定义了服务的配置信息
    services 的定义包含应用于为该服务启动的每个容器的配置,非常类似于将命令行的 docker container create
  3. networks 定义了网络信息,提供给 services 中的 具体容器使用
    networks 的定义类似于命令行的 docker network create
  4. volumes 定义了卷信息,提供给 services 中的 具体容器使用
    volumes 的定义类似于命令行的 docker volume create

services 常用相关配置

  1. container_name
    指定容器名称。默认将会使用项目名称服务名称序号
container_name: nginx-front
#指定容器名称后,该服务将不允许进行扩展(scale),因为Docker不允许多个容器具有相同的名称。
  1. labels
    定义容器的元数据(metadata)信息。例如可以为容器添加辅助说明信息
labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "test department"
  com.startupteam.release: "rc3 for v1.0"

3.构建过程中应用到的相关配置项
每个服务都必须通过 image 来指定镜像或 build 指令(需要 Dockerfile文件)等来自动构建生成镜像
如果使用 build 指令,那么在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置
image用法
指定镜像名称或镜像 ID。如果该镜像在本地不存在,Compose 将会拉取这个镜像

image: nginx:latest
image: 5673fdg8f9

build用法
类似于命令行的 docker build .
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 compose 将会利用它自动构建这个镜像,然后使用这个镜像

version: '3'
services:
  nginx-front:
    build: ./test
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。同时使用 dockerfile 指令指定 Dockerfile 文件     名
version: '3'
services:
  nginx-front:
    build:
      context: ./test
      dockerfile: Dockerfile-nginx
如果同时指定了 image和 build, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 会使用 build 指令中指定的 Dockerfile 构建的镜像,之后构建的镜像名称使用 image 中指定的名字 nginx-front:tag命名
build: ./test
image: nginx-front:tag

4 . command
command指令可以覆盖容器启动后默认执行的命令

command: bundle exec thin -p 3000
也可以写成类似 Dockerfile 中的格式
command: [bundle, exec, thin, -p, 3000]
  1. depends_on
    定于容器的依赖的其他容器及启动先后问题。以下例子中会先启动容器tomcat和redis再启动nginx
    但是并不意味着nginx-front服务会等待redis和tomcat完全启动之后才启动
version: '3'
services:
  nginx-front:
    build: ./test
    depends_on:
      - tomcat
      - redis
  redis:
    image: redis
  tomcat:
    image: tomcat

6.environment
设置环境变量。可以使用数组或字典两种格式
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据

environment:
  DEV_ENV: test
  SESSION_SECRET:
environment:
  - DEV_ENV=test
  - SESSION_SECRET
  1. ports
    映射端口信息
    宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式,或者仅仅指定容器的端口(宿主将会随机选择端口)
ports:
 - "80"
 - "80:80"
 - "6379:6379"
 - "127.0.0.1:8080:8080"
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式
  1. expose
    暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定容器内部的端口为参数
expose:
 - "80"
 - "443"
  1. networks
    容器需要要加入的网络,使用顶级networks 定义下的条目
services:
  nginx-front:
    networks:
     - test-network-01
...
networks:
  test-network-01:
    driver: bridge   #设置自定义网络的驱动, bridge(默认)/host/none

关于顶级配置项的networks:

1). 不显式声明网络环境
docker-compose.yml会创建一个$(basename ${PWD})_default命名的compose网络

version: '3'
services:
 nginx:
  image: nginx:latest
  depends_on:
   - db
  ports:
   - "8081:80"
  links:
   - db
 db:
  image: mysql:5.7
  environment:
   MYSQL_ROOT_PASSWORD: X951068Zl@

[root@master jumpserver]# docker-compose up
[root@master jumpserver]# docker network ls 
...
3c2b843a81e7        jumpserver_default   bridge    local
...

2).使用已存在的自定义网络:

networks:
 default:
  external:
   name: jumpserver_default

3).创建一个bridge类型compose网络:

networks:
 nginx-network

10.extra_hosts
类似Docker中的 --add-host 参数,指定container额外的host解析

extra_hosts:
 - "registry.yun-ti.com:192.168.0.50"
 - "code.yun-ti.com:192.168.0.50"
  1. healthcheck
    通过命令检查容器是否健康运行
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 180s
  timeout: 10s
  retries: 3
  1. links
    相较于解决容器启动顺序问题的depends_on,links标签用来解决的是容器连接问题,与Docker client的–link一样效果,会连接到其它服务中的容器
version: '3'
services:
  nginx-front:
    images: nginx:latest
    depends_on:
     - tomcat
     - redis
    links:
     - tomcat
     - redis
 
#使用的别名将会自动在服务容器中的/etc/hosts里创建:
172.1.0.2  tomcat
172.1.0.3  redis
  1. deploy
    指定与部署和运行服务相关的配置
    只有在集群方式部署的时候这个配置才有效
deploy                # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm 
  endpoint_mode         # v3.3 版本中新增的功能, 指定服务暴露的方式
      vip                   # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
      dnsrr    # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
  labels                # 指定服务的标签,这些标签仅在服务上设置
  mode                  # 指定 deploy 的模式
      global                # 每个集群节点都只有一个容器
      replicated            # 用户可以指定集群中容器的数量(默认)
  placement             # 不知道怎么用
  replicas              # deploy 的 mode 为 replicated 时, 指定容器副本的数量
  resources             # 资源限制
      limits                # 设置容器的资源限制
          cpus: "0.5"           # 设置该容器最多只能使用 50% 的 CPU   
          memory: 50M           # 设置该容器最多只能使用 50M 的内存空间  
      reservations          # 设置为容器预留的系统资源(随时可用) 
          cpus: "0.2"           # 为该容器保留 20% 的 CPU
          memory: 20M           # 为该容器保留 20M 的内存空间
  restart_policy        # 定义容器重启策略, 用于代替 restart 参数
      condition             # 定义容器重启策略(接受三个参数) 
          none                  # 不尝试重启
          on-failure            # 只有当容器内部应用程序出现问题才会重启
          any                   # 无论如何都会尝试重启(默认)
      delay                 # 尝试重启的间隔时间(默认为 0s)
      max_attempts          # 尝试重启次数(默认一直尝试重启) 
      window                # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s)
  update_config         # 用于配置滚动更新配置
      parallelism           # 一次性更新的容器数量
      delay                 # 更新一组容器之间的间隔时间
      failure_action        # 定义更新失败的策略
          continue              # 继续更新
          rollback              # 回滚更新
          pause                 # 暂停更新(默认)
      monitor               # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0)
      max_failure_ratio     # 回滚期间容忍的失败率(默认值为0)
      order                 # v3.4 版本中新增的参数, 回滚期间的操作顺序
          stop-first            #旧任务在启动新任务之前停止(默认)
          start-first           #首先启动新任务, 并且正在运行的任务暂时重叠
  rollback_config       # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略
      parallelism           # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚
      delay                 # 每个组回滚之间的时间间隔(默认为0)
      failure_action        # 定义回滚失败的策略
          continue              # 继续回滚
          pause                 # 暂停回滚
      monitor               # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0)
      max_failure_ratio     # 回滚期间容忍的失败率(默认值0)
      order                 # 回滚期间的操作顺序
          stop-first            # 旧任务在启动新任务之前停止(默认)
          start-first           # 首先启动新任务, 并且正在运行的任务暂时重叠

volumes 常用相关配置

  1. volumes
    该指令中路径支持相对路径。数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)
volumes:
 - /etc/conf
 - cache/:/tmp/cache
 - ~/home/nginxlogs:/var/logs/nginx:ro
  1. 卷的 bind 和 volume 的混合使用示例
version: "3.2"
services:
  nginx-front:
    image: nginx:alpine
    volumes:
      # 卷 (volume)
      - type: volume
        source: ngx-cfg-data
        target: /etc/nginx
        volume:
          nocopy: true
      # 挂载 (bind)
      - type: bind
        source: /home/static
        target: /usr/share/nginx/html
  mysql:
    image: mysql:5.7.3
    volumes:
      - "/var/run/mysql/mysql.sock:/var/run/mysql/mysql.sock"
      - "msyql-data:/var/lib/mysql"
volumes:
  ngx-cfg-data:
  mysql-data

容器的限制的参数

  1. ulimits
    指定容器的 ulimits 限制值。
    e.g.指定最大进程数为 65535,指定文件句柄数为65535(软限制<=硬限制)
ulimits:
    nproc: 65535
    nofile:
      soft: 65535
      hard: 65535

2.sysctl
配置容器内核参数

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

编写一个版本 3.6的docker-compose.yml示例

version: "3.6"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  mysql:
    image: mysql:5.7.3
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data: