在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文对集群部署相关的一概不做介绍 版本约束
结构介绍
version # docker compose版本 networks # 网络,用于docker容器内部通讯 x-{name} # 模版命名规则 以x-开头 用于复用 volumes # 挂载卷 services # 服务模块,内部定义容器信息 其内部参数相当于docker run时的参数 模块介绍 version 设定
network_mode 使用与 network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]" networks 为当前 不一定存在于和version同级,也可以在各个其他模块中,例如services中 内部网络 services: some-service: networks: - some-network - other-network 公用网络 version: "3" networks: default-network: aliases(待补充) 网络的别名 version: "3.8" 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(待补充) version: "3.8" 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" services 最主要的部分,用来配置各个服务 build 用于构建镜像,当build和image字段都存在时,使用image指定的镜像名和tag作为build镜像的name和tag version: "3.8" # docker compose版本 services: webapp: # docker-compose定义的服务(容器)名,主要是针对docker-compose命令的参数,与docker ps看到的容器名不一定一致 build: # 使用Dockerfile构建镜像 context: ./dir 上下文路径,相对路径则是相对于compose文件路径 dockerfile: Dockerfile-alternate # 指定Dockerfile文件名 args: # 指定Dockerfile的参数 环境变量 buildno: 1 # directory写法和list写法均可 context 可以使用相对路径或者git仓库的url build: context: ./dir Dockerfile 指定Dockerfile文件名,必须指定context build: context: . dockerfile: Dockerfile-alternate args Dockerfile中的 ARG buildno ARG gitcommithash RUN echo "Build number: $buildno" # bash-like风格的写法 RUN echo "Based on commit: $gitcommithash" 可以使用list或者map来设定args build: context: . args: # map buildno: 1 gitcommithash: cdc3b19 build: context: . args: # list - buildno=1 - gitcommithash=cdc3b19 tips cache_from 为build过程指定cache build: context: . cache_from: - alpine:latest - corp/web_app:3.14 labels 同Dockerfile中的 build: context: . labels: # map com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: "" build: context: . labels: # list - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" network 同 build: context: . network: host # host模式,网络延迟最低,性能与宿主机一致 build: context: . network: custom_network_1 # 自创network build: context: . network: none # 无网络 shm_size 设置容器内
build: context: . shm_size: '2gb' # 使用字符串设置大小 build: context: . shm_size: 10000000 # 设置字节大小 command 相当于Dockerfile中的 command: bundle exec thin -p 3000 # shell-like command: ["bundle", "exec", "thin", "-p", "3000"] # json-like container_name 相当于 container_name: my-web-container depends_on 用于表述服务之间的依赖关系 在 version: "3.8" services: web: build: . depends_on: # 先启动 db 和 redis - db - redis redis: image: redis db: image: postgres tips:
devices 挂载的外接设备,与 devices: - "/dev/ttyUSB0:/dev/ttyUSB0" dns 自定义dns地址 dns: 8.8.8.8 # 单个string值 dns: # list - 8.8.8.8 - 9.9.9.9 dns_search 自定义dns搜索域名 dns_search: example.com # 单个string值 dns_search: - dc1.example.com - dc2.example.com entrypoint 覆盖重写默认的 entrypoint entrypoint: /code/entrypoint.sh 同Dockerfile中的写法 entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"] tips: env_file 为 env_file: .env # single value env_file: # list - ./common.env - ./apps/web.env - /opt/runtime_opts.env tips: # Set Rails/Rack environment # '#'为注释, # 空行会被忽略 RACK_ENV=development # 格式为 VAR=VAL .env 文件中的环境变量无法在build过程中被显示读取,只会被docker-compose.yaml文件读取,如果需要在build时使用该环境变量,请在build后加args子参数。 对于指定多个.env文件的情况,官网的这句话贼复杂 Keep in mind that the order of files in the list is significant in determining the value assigned to a variable that shows up more than once. 直译过来是 请记住,列表中文件的顺序对于确定分配给多次显示的变量的值很重要。 因为对环境参数文件的处理是自上而下的,所以翻译成人话就是,多个参数文件中包含同一个环境变量,以最后一个为准。 environment 添加环境变量 environment: # map RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: # list - RACK_ENV=development - SHOW=true - SESSION_SECRET tips: func getEnvInfo() string { rackEnv := os.Getenv("RACK_ENV") fmt.Println(rackEnv) } output: development expose 暴露端口,但是仅限于服务之间的通信,暴露的是内部端口,类似Dockerfile的 expose: - "3000" - "8000"
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql tips: extra_hosts 添加自定义域名,同 extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229" 也可以在容器内的 162.242.195.82 somehost 50.31.209.229 otherhost healthcheck 同Dockerfile中的 healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s 使用 healthcheck: disable: true image 指定需要拉取或使用的镜像,也可以使用 image: redis # 默认标签 latest image: ubuntu:18.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd init 在容器内运行一个初始化程序,以转发信号开获取进程。 version: "3.8" services: web: image: alpine:latest init: true tips: isolation 指定容器隔离技术,Linux只支持 labels 同Dockerfile中的 build: context: . labels: # map com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: "" build: context: . labels: # list - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" links 旧版的功能,不推荐使用 logging 为当前服务设置日至参数 logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
driver: "json-file" driver: "syslog" driver: "none" tips: 指定日志设置,同 driver: "syslog" options: syslog-address: "tcp://192.168.0.42:123" 默认的日志驱动是 options: max-size: "200k" # 单文件最大存储 max-file: "10" # 文件最大数量 tips: 支持的驱动列表
tips: ports 对外暴露端口 short syntax: ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp" - "12400-12500:1240" tips: long syntax 长语法允许出现短语法不允许出现的字段
ports: - target: 80 published: 8080 protocol: tcp mode: host restart 容器重启策略 restart: "no" # 失败不重启 restart: always # 失败后总是重启 restart: on-failure # 错误码为 on-failure 时才重启 restart: unless-stopped # 手动停止后不重启 secrets(待补充) volumes 用来挂载数据卷 short syntax
如果使用宿主机的相对路径,则以 volumes: # 指定容器内路径,docker 自动创建路径 - /var/lib/mysql # 挂载绝对路径 - /opt/data:/var/lib/mysql # 挂载相对路径 - ./cache:/tmp/cache # 用户目录相对路径 - ~/configs:/etc/configs/:ro # 命名挂载 - datavolume:/var/lib/mysql long syntax 长语法允许使用短语法无法表达的字段
version: "3.8" 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: 到此这篇关于浅谈docker compose书写规则的文章就介绍到这了,更多相关docker compose书写规则内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论