yaml教程

https://docs.docker.com/compose/compose-file/compose-file-v3/#restart_policy

文件介绍
https://docs.docker.com/compose/compose-file/
https://github.com/compose-spec/compose-spec/blob/master/spec.md

文件名先后顺序 docker-compose.yaml 和 docker-compose.yml

version:指定 docker-compose.yml 文件的写法格式 (已弃用)
services:多个容器集合
build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
build: ./dir
---------------
build:
    context: ./dir
    dockerfile: Dockerfile
    args:
        buildno: 1
command:覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]
dns:配置 dns 服务器,可以是一个值或列表
dns: 8.8.8.8
------------
dns:
    - 8.8.8.8
    - 9.9.9.9
dns_search:配置 DNS 搜索域,可以是一个值或列表
dns_search: example.com
------------------------
dns_search:
    - dc1.example.com
    - dc2.example.com
environment:环境变量配置,可以用数组或字典两种方式
environment:
    RACK_ENV: development
    SHOW: 'ture'
-------------------------
environment:
    - RACK_ENV=development
    - SHOW=ture
env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
env_file: .env
---------------
env_file:
    - ./common.env
expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
expose:
    - "3000"
    - "8000"
image:指定服务所使用的镜像
image: java
network_mode:设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
ports:对外暴露的端口定义,和 expose 对应
ports:   # 暴露端口信息  - "宿主机端口:容器暴露端口"
- "8763:8763"
- "8763:8763"
links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
links:    # 指定服务名称:别名 
    - docker-compose-eureka-server:compose-eureka
volumes:卷挂载路径
volumes:
  - /lib
  - /var
logs:日志输出信息
--no-color          单色输出,不显示其他颜.
-f, --follow        跟踪日志输出,就是可以实时查看日志
-t, --timestamps    显示时间戳
--tail              从日志的结尾显示,--tail=200

完整文件

version: "3.9"
services:
  redis:
    build: . #指定Dockerfile
    build:     #指定Dockerfile 目录
      context: ./dir
      dockerfile: Dockerfile-php
    image: redis:6.2.7-alpine
    user: root
    user: 0:0  #同时设置用户和组
    restart: always #重启策略
    restart_policy: always #swarm 集群模式重启策略
    network_mode: host #网络模式 host bridge none
    container_name: redis #自定义容器名称
    cap_add:  #添加容器拥有的宿主机的内核功能
      - ALL # 开启全部权限
    cap_drop: #删除容器拥有的宿主机的内核功能
      - SYS_PTRACE # 关闭 ptrace权限
    cgroup_parent: m-executor-abcd #指定父 cgroup 组,意味着将继承该组的资源限制
    volumes:
      - "./redis.conf:/usr/local/etc/redis/redis.conf:rw"
      - "./data:/data:ro"
      - "/postgres.sock:/var/run/postgres.sock"
      - type: volume  #挂载卷
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind      #绑定本地文件
        source: ./static
        target: /opt/app/static
      - type: tmpfs #挂载内存文件系统
          target: /app
          tmpfs:
            size: 10000 #定义大小 byte 1000*1000=1m
    ports:
      - "3000" # 暴露容器的 3000 端口, 宿主机随机映射一个没有被占用的端口
      - "3000-3005"  # 暴露容器的 3000 到 3005 端口, 宿主机随机映射没有被占用的端口
      - "8000:8000" # 容器的 8000 端口和宿主机的 8000 端口建立映射关系
      - "9090-9091:8080-8081"
      - "127.0.0.1:8001:8001" # 指定映射宿主机的指定地址的
      - "127.0.0.1:5000-5010:5000-5010"
      - "6060:6060/udp"   # 指定协议
    #command: ["bundle", "exec"]#覆盖容器启动的默认命令
    command: bundle exec thin -p 3000
    command: ["bundle", "exec", "thin", "-p", "3000"]
    command:#或者
       /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf" 
    command: sh -c "yarn install && yarn run dev"
    command: /bin/bash -c "cp xx.yml xx2.yml && python -u ./tcc.py"
    command: 
       - /bin/bash
       - -c
       - | 
         while true;
         do echo 1; 
         sleep 30;
         done 
    image: alpine
    command: #或者这样
      - "ping"
      - "www.baidu.com"
    entrypoint: /code/entrypoint.sh  #覆盖容器默认的 entrypoint
    command: ["echo", "Hello"]
    entrypoint:
        - php
        - -d
    env_file: .env #文件添加环境变量
    env_file: 
        - ./common.env
        - ./apps/web.env
    environment:    #添加环境变量
      - TZ=Asia/Shanghai
    working_dir: /code

    privileged:true

    expose: #暴露端口,但不映射到宿主机        
         - "2049"
         - "111/upd"
         - "32765-32767/udp"
    extra_hosts: #添加主机名映射
        - "somehost:162.242.195.82"
        - "otherhost:50.31.209.229"
    depends_on:  #设置依赖关系
      - db
    devices:    #设备映射列表
         - "/dev/ttyUSB0:/dev/ttyUSB0"  
    dns: #自定义 DNS 服务器
        - 8.8.8.8
        - 9.9.9.9
    dns_search: #自定义 DNS 搜索域
        - dc1.example.com
        - dc2.example.com
    logging:
      driver: json-file #syslog none
      options:
        max-size: "5m" # 单个文件大小为200m 200k 2g
        max-file: "5" # 最多10个文件
    logging:
        driver: syslog
        options:
            syslog-address: "tcp://192.168.0.42:123"
    healthcheck: #检测 docker 服务是否健康运行
        test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
        interval: 1m30s # 设置检测间隔
        timeout: 10s # 设置检测超时时间
        retries: 3 # 设置重试次数
        start_period: 40s # 启动后,多少秒开始启动检测程序
    sysctls: #设置容器中的内核参数
        - net.core.somaxconn=1024
        - net.ipv4.tcp_syncookies=0
        - net.ipv6.conf.all.disable_ipv6=1
    tmpfs: /run
    tmpfs: #在容器内安装一个临时文件系统 内存文件目录
        - /run
        - /tmp
    ulimits: #覆盖容器默认的 ulimit
        nproc: 65535
        nofile:
            soft: 20000
            hard: 40000
    deploy: #集群部署配置 只在swarm 模式下才会有用
      mode:replicated/global #部署方式
      replicas: 6 #部署数量
      endpoint_mode: dnsrr 只能内部
      endpoint_mode: vip(默认)/dnsrr #负载方式 虚拟ip/轮询
          #vip  # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
          #dnsrr # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
      labels: #服务上设置标签
        description: "This redis service label"
      resources: #配置服务器资源使用的限制
        limits: #最大限制
          cpus: '0.50'
          memory: 50M #支持b k m g(或者kb,mb,gb
        reservations: #预留配置
          cpus: '0.25'
          memory: 20M 
      restart_policy: #重启策略
        condition: on-failure  #可选 none,on-failure在容器非正常退出时(退出状态非0),才会重启容器 或者 any(默认值:any)
        delay: 5s  #设置多久之后重启
        max_attempts: 3  #尝试重新启动容器的次数
        window: 120s  #设置容器重启超时时间
     placement: #约束,部署在
        #constraints:
        #  - node.role == manager |worker
        #constraints: [node.role == worker ] #manager
        #constraints: [node.hostname == node1 ]
        #constraints: [node.labels.isgpu == true]
        #constraints: [node.labels.mysql == true ]
    init:ture  # v3.7 中新增的参数, true 或 false 表示是否在容器中运行一个 init, 它接收信号并传递给进程
    logging: # 设置容器日志服务
        driver: 'json-file'# 指定日志记录驱动程序, 默认 json-file 
        options:             # 指定日志的相关参数 (等同于 docker run --log-opt 的作用)
            max-size            # 设置单个日志文件的大小, 当到达这个值后会进行日志滚动操作
            max-file              # 日志文件保留的数量
    networks:
        - ml0-network        
        m10-network:   #或者
            aliases
            ipv4_address: 10.0.0.3
            ipv6_address: xxxff
networks:
    ml0-network:
        driver:bridge  #bridge overlay host none
        name: net123
        external: true