Compose file配置文件常用配置

本文主要列举docker-compose的服务配置文件docker-compose.yml的常规配置项

详细说明参考官方网址:Compose file version 3 reference | Docker Documentation

注意:以下配置项均需遵守yaml格式

yaml格式常见注意事项如下:

  • 不支持制表符tab键缩进,需要使用空格缩进
  • 通常开头缩进2个空格
  • 字符后缩进1个空格,

常用配置

build

# 构建镜像上下文路径

#加载dir目录下的dockerfile,编译构建服务镜像
services:
  web:
    build: ./dir

services:
  web:
    build:
      context: ./dir     //上下文根目录,即项目构建路径
      dockerfile: Dockerfile-alternate    //指定编译的dockerfile
      args:     //编译入参,在Dockerfile中指定的参数
        buildno: 1

image

# 构建服务用的镜像

services:
  redis_service:
    image: redis

command

# 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式

services:
  web:
    command: cat /test.env
    command: ["cat","/test.env"]

 container_name 

#自定义容器名称

services:
  web:
    container_name: my-web-container

 deploy

# 指定与部署和运行相关的配置。限版本3,deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      replicas: 6
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

depend_on 

# 服务之间的依赖,控制服务启动顺序。正常是按顺序启动服务,依赖的服务优先启动,但不会等到依赖的服务启动完成再启动,而是依赖服务一启动,就立马启动当前服务

#web服务依赖redis和db,优先启动redis和db,然后启动web
version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

 dns

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

#支持单个值或列表
services:
  web:
    dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9

 entrypoint

 # 覆盖容器的默认 entrypoint 指令 (等同于 docker run --entrypoint 的作用),即覆盖dockerfile中的entrypoint指令

services:
  web:
    entrypoint: /code/entrypoint.sh
    entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]

env_file 

# 从指定文件添加环境变量,会将文件中的变量添加到服务中的environment配置项中,可以是单个值或列表

services:
  web:
    env_file:
      - ./common.env
      - ./apps/web.env
      - /opt/runtime_opts.env

#效果同
services:
  web:
    environment:
      - common_key:common_value
      - env_key:env_value

注意:如果指定添加的多个文件中,存在相同的属性变量,则后者覆盖前者

 environment

# 添加环境变量,可以是数组或字典。布尔值用引号括起来,该环境变量提供给容器中的服务使用

services:
  web:
    environment:
      - RACK_ENV=development
      - SHOW=true
      - SESSION_SECRET

expose

# 声明容器服务端口

services:
  web:
    expose:
     - "3000"
     - "8000"

 注意:和ports的区别是ports会构建主机和容器之间的端口的映射关系,而expose不会将端口暴露给主机,主机无法访问expose的端口,expose暴露的端口是提供给处于同一个容器网络平台的其他服务容器访问的(即同一编排文件中定义的服务)

links

# 连接到另一个容器,同depend_on相似,但links是version-2中使用的,当 docker-compose 执行 V2 文件时会自动在容器间创建一个网络,每一个容器都能够立即通过名字来访问到另外的容器。 因此,不再需要 links

services:
  web:
    links:
      - db
      - db:database
      - redis

 external_links

# 连接Compose之外的容器(非通过当前docker-compose.yml构建的服务容器),特别是对于提供共享或公共服务的容器,需遵循以下格式:CONTAINER:ALIAS

services:
  web:
    external_links:
      - redis_1
      - project_db_1:mysql
      - project_db_1:postgresql

extra_hosts 

# 添加主机名映射,其会在容器中的/etc/hosts文件中创建主机名和ip的映射关系

services:
  web:
    extra_hosts:
      - "somehost:162.242.195.82"
      - "otherhost:50.31.209.229"

 network_mode

# 网络模式,同docker客户端--network 的参数一致,包含(host,none,bridge和container模式)

services:
  web:
    network_mode: "bridge"
    network_mode: "host"
    network_mode: "none"
    network_mode: "service:[service name]"
    network_mode: "container:[container name/id]"

networks 

# 要加入的网络。可以通过加入自定义网络,隔离开同一compose构建的服务

#proxy和db之间的网络是相互隔离的,但app可以同时访问两个服务
services:
  proxy:
    build: ./proxy
    networks:
      - front
  app:
    build: ./app
    networks:
      - front
      - back
  db:
    image: postgres
    networks:
      - back

networks:
  front:
    # Use a custom driver
    driver: custom-driver-1
  back:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

 alias

# 网络上此服务的别名(备用主机名),即同一服务在不同的网络上可以存在多个不同的别名

# 在网络new方面,可以通过db或database访问到db容器;在legacy网络,可以通过db或mysql访问到db容器
version: "3.9"

services:
  web:
    image: "nginx:alpine"
    networks:
      - new

  worker:
    image: "my-worker-image:latest"
    networks:
      - legacy

  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql

networks:
  new:
  legacy:

 ipv4_address,ipv6_address

 # 加入网络时,为此服务的容器指定静态 IP 地址。

# 指定当前容器处于app_net网桥上分配的ip为172.16.238.10,必须处于配置的子网网段
version: "3.9"

services:
  app:
    image: nginx:alpine
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  app_net:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

pid 

# 将PID模式设置为主机PID模式。这将打开容器和主机操作系统之间的PID地址空间共享,即容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。

services:
  web:
    pid: "host"

 ports

# 暴露端口,与-p相同。但端口不低于60(端口映射不兼容network_mode: host)

#短语法
ports:
 - "3000"    //主机会随机开启一个端口和容器3000端口进行映射
 - "3000-3005"   //主机随机开启几个端口和容器3000-3005端口进行映射
 - "8000:8000"   //主机8000端口映射容器8000端口
 - "9090-9091:8080-8081"  //主机9090-9091端口映射容器8080-8081
 - "127.0.0.1:8001:8001"  //主机127.0.0.1:8001端口进入的流量分配到容器的8001端口
 - "127.0.0.1:5000-5010:5000-5010"  //主机127.0.0.1:5000-5001端口进入的流量分配到容器5000-5001端口
 - "6060:6060/udp"   //主机6060端口映射容器udp连接端口6060

#长语法,version-3.2开始启用
ports:
  - target: 80   //容器内的端口
    published: 8080   //主机端口
    protocol: tcp    //端口协议(tcp,udp)
    mode: host

 profiles

# 配置规划要启用的一系列服务

version: "3.9"
services:
  frontend:
    image: frontend
    profiles: ["frontend"]

  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug

  backend:
    image: backend

  db:
    image: mysql

在这里,服务frontendphpmyadmin被分配给配置文件 frontend,并且debug仅在启用它们各自的配置文件时才启动。

没有profiles属性的服务将始终启用,即在这种情况下运行docker-compose up只会启动backenddb

通过docker-compose --profile frontend up 会启动frontend、backend和db

通过docker-compose --profile debug up会启动phpmyadmin、backend和db

sysctls

# 在容器内设置内核参数,可以是数组或字典

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

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

 ulimits

# 覆盖容器的默认ulimits

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

volumes 

# 挂载一个目录或一个已存在的数据卷容器到容器

version: "3.9"
services:
  #数据卷长语法
  web:
    image: nginx:alpine
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

  #数据卷短语法
  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "dbdata:/var/lib/postgresql/data"

volumes:
  mydata:
  dbdata:

 短语法:

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/mysql

 长语法:(version-3.2开始加入)

长格式语法允许配置无法以短格式表示的附加字段。

  • type: 挂载类型volumebind,tmpfsnpipe
  • source: 挂载的来源,主机上用于绑定挂载的路径,或者在 顶级volumeskey中定义的卷的名称。不适用于 tmpfs 挂载。
  • target: 容器中安装卷的路径
  • read_only: 将卷设置为只读的标志
  • bind: 配置额外的绑定选项
    • propagation:用于绑定的传播模式
  • volume:配置额外的volume选项
    • nocopy: 创建卷时禁止从容器复制数据的标志
  • tmpfs: 配置额外的 tmpfs 选项
    • size: tmpfs 挂载的大小(以字节为单位)
version: "3.9"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

networks:
  webnet:

volumes:
  mydata:

 restart

 # 默 认 no , 主要包含几种模式:always|onfailure|unless-stopped

  • always:容器总是重新启动
  • on-failure:如果故障退出,则重启
  • unless-stopped:总是重新启动容器,除非容器停止(手动或其他方式)

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir

# 其中每一个值,都类似于它的 docker run对应项。请注意,这mac_address是一个旧选项。

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

privileged: true

read_only: true
shm_size: 64M
stdin_open: true
tty: true

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值