[{"data":1,"prerenderedAt":669},["ShallowReactive",2],{"content:\u002Fposts\u002Fdocker-compose-yml":3,"surround:\u002Fposts\u002Fdocker-compose-yml":659},{"id":4,"title":5,"body":6,"categories":637,"date":639,"description":640,"draft":641,"extension":642,"image":643,"meta":644,"navigation":646,"path":647,"permalink":643,"pinned":641,"published":643,"readingTime":648,"recommend":643,"references":643,"seo":653,"sitemap":654,"stem":655,"tags":656,"type":657,"updated":639,"__hash__":658},"content\u002Fposts\u002Fposts\u002Fdocker-compose-yml.md","docker-compose配置文件详解",{"type":7,"value":8,"toc":634},"minimark",[9,19,22,25,28,31,34,45,48,54,73,76,79,85,88,91,97,100,103,109,112,115,121,124,127,138,144,147,150,153,159,162,169,175,181,187,201,207,213,219,233,239,259,265,284,290,293,296,302,305,308,314,317,320,326,329,332,338,341,347,350,353,359,362,368,371,374,380,383,386,389,395,398,401,407,410,416,419,422,428,431,434,440,443,446,449,455,458,464,467,470,476,479,482,488,491,494,500,506,509,523,529,532,535,538,544,547,550,556,559,562,568,571,574,577,580,586,589,592,598,601,604,610,613,616,622,625,628],[10,11,15],"alert",{"icon":12,"title":13,"type":14},"tabler:robot","AI 迁移提示","info",[16,17,18],"p",{},"本文由 AI 协助从旧站迁移，尚未完成逐篇人工审校；内容如有疏漏，将在复核后修订。",[16,20,21],{},"version",[16,23,24],{},"指定本 yml 依从的 compose 哪个版本制定的。",[16,26,27],{},"build",[16,29,30],{},"指定为构建镜像上下文路径：",[16,32,33],{},"例如 webapp 服务，指定为从上下文路径 .\u002Fdir\u002FDockerfile 所构建的镜像：",[35,36,42],"pre",{"className":37,"code":39,"language":40,"meta":41},[38],"language-yaml","version: \"3.7\"\nservices:\n  webapp:\n    build: .\u002Fdir\n","yaml","",[43,44,39],"code",{"__ignoreMap":41},[16,46,47],{},"或者，作为具有在上下文指定的路径的对象，以及可选的 Dockerfile 和 args：",[35,49,52],{"className":50,"code":51,"language":40,"meta":41},[38],"version: \"3.7\"\nservices:\n  webapp:\n    build:\n      context: .\u002Fdir\n      dockerfile: Dockerfile-alternate\n      args:\n        buildno: 1\n      labels:\n        - \"com.example.description=Accounting webapp\"\n        - \"com.example.department=Finance\"\n        - \"com.example.label-with-empty-value\"\n      target: prod\n",[43,53,51],{"__ignoreMap":41},[55,56,57,61,64,67,70],"ul",{},[58,59,60],"li",{},"context：上下文路径。",[58,62,63],{},"dockerfile：指定构建镜像的 Dockerfile 文件名。",[58,65,66],{},"args：添加构建参数，这是只能在构建过程中访问的环境变量。",[58,68,69],{},"labels：设置构建镜像的标签。",[58,71,72],{},"target：多层构建，可以指定构建哪一层。",[16,74,75],{},"cap_add，cap_drop",[16,77,78],{},"添加或删除容器拥有的宿主机的内核功能。",[35,80,83],{"className":81,"code":82,"language":40,"meta":41},[38],"cap_add:\n  - ALL # 开启全部权限\n\ncap_drop:\n  - SYS_PTRACE # 关闭 ptrace权限\n",[43,84,82],{"__ignoreMap":41},[16,86,87],{},"cgroup_parent",[16,89,90],{},"为容器指定父 cgroup 组，意味着将继承该组的资源限制。",[35,92,95],{"className":93,"code":94,"language":40,"meta":41},[38],"cgroup_parent: m-executor-abcd\n",[43,96,94],{"__ignoreMap":41},[16,98,99],{},"command",[16,101,102],{},"覆盖容器启动的默认命令。",[35,104,107],{"className":105,"code":106,"language":40,"meta":41},[38],"command: [\"bundle\", \"exec\", \"thin\", \"-p\", \"3000\"]\n",[43,108,106],{"__ignoreMap":41},[16,110,111],{},"container_name",[16,113,114],{},"指定自定义容器名称，而不是生成的默认名称。",[35,116,119],{"className":117,"code":118,"language":40,"meta":41},[38],"container_name: my-web-container\n",[43,120,118],{"__ignoreMap":41},[16,122,123],{},"depends_on",[16,125,126],{},"设置依赖关系。",[55,128,129,132,135],{},[58,130,131],{},"docker-compose up ：以依赖性顺序启动服务。在以下示例中，先启动 db 和 redis ，才会启动 web。",[58,133,134],{},"docker-compose up SERVICE ：自动包含 SERVICE 的依赖项。在以下示例中，docker-compose up web 还将创建并启动 db 和 redis。",[58,136,137],{},"docker-compose stop ：按依赖关系顺序停止服务。在以下示例中，web 在 db 和 redis 之前停止。",[35,139,142],{"className":140,"code":141,"language":40,"meta":41},[38],"version: \"3.7\"\nservices:\n  web:\n    build: .\n    depends_on:\n      - db\n      - redis\n  redis:\n    image: redis\n  db:\n    image: postgres\n",[43,143,141],{"__ignoreMap":41},[16,145,146],{},"注意：web 服务不会等待 redis db 完全启动 之后才启动。",[16,148,149],{},"deploy",[16,151,152],{},"指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。",[35,154,157],{"className":155,"code":156,"language":40,"meta":41},[38],"version: \"3.7\"\nservices:\n  redis:\n    image: redis:alpine\n    deploy:\n      mode：replicated\n      replicas: 6\n      endpoint_mode: dnsrr\n      labels: \n        description: \"This redis service label\"\n      resources:\n        limits:\n          cpus: '0.50'\n          memory: 50M\n        reservations:\n          cpus: '0.25'\n          memory: 20M\n      restart_policy:\n        condition: on-failure\n        delay: 5s\n        max_attempts: 3\n        window: 120s\n",[43,158,156],{"__ignoreMap":41},[16,160,161],{},"可以选参数：",[16,163,164,168],{},[165,166,167],"strong",{},"endpoint_mode","：访问集群服务的方式。",[35,170,173],{"className":171,"code":172,"language":40,"meta":41},[38],"endpoint_mode: vip \n# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。\nendpoint_mode: dnsrr\n# DNS 轮询（DNSRR）。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。\n",[43,174,172],{"__ignoreMap":41},[16,176,177,180],{},[165,178,179],{},"labels","：在服务上设置标签。可以用容器上的 labels（跟 deploy 同级的配置） 覆盖 deploy 下的 labels。",[16,182,183,186],{},[165,184,185],{},"mode","：指定服务提供的模式。",[55,188,189,195],{},[58,190,191,194],{},[165,192,193],{},"replicated","：复制服务，复制指定服务到集群的机器上。",[58,196,197,200],{},[165,198,199],{},"global","：全局服务，服务将部署至集群的每个节点。",[16,202,203,206],{},[165,204,205],{},"replicas：mode"," 为 replicated 时，需要使用此参数配置具体运行的节点数量。",[16,208,209,212],{},[165,210,211],{},"resources","：配置服务器资源使用的限制，例如上例子，配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。",[16,214,215,218],{},[165,216,217],{},"restart_policy","：配置如何在退出容器时重新启动容器。",[55,220,221,224,227,230],{},[58,222,223],{},"condition：可选 none，on-failure 或者 any（默认值：any）。",[58,225,226],{},"delay：设置多久之后重启（默认值：0）。",[58,228,229],{},"max_attempts：尝试重新启动容器的次数，超出次数，则不再尝试（默认值：一直重试）。",[58,231,232],{},"window：设置容器重启超时时间（默认值：0）。",[16,234,235,238],{},[165,236,237],{},"rollback_config","：配置在更新失败的情况下应如何回滚服务。",[55,240,241,244,247,250,253,256],{},[58,242,243],{},"parallelism：一次要回滚的容器数。如果设置为0，则所有容器将同时回滚。",[58,245,246],{},"delay：每个容器组回滚之间等待的时间（默认为0s）。",[58,248,249],{},"failure_action：如果回滚失败，该怎么办。其中一个 continue 或者 pause（默认pause）。",[58,251,252],{},"monitor：每个容器更新后，持续观察是否失败了的时间 (ns|us|ms|s|m|h)（默认为0s）。",[58,254,255],{},"max_failure_ratio：在回滚期间可以容忍的故障率（默认为0）。",[58,257,258],{},"order：回滚期间的操作顺序。其中一个 stop-first（串行回滚），或者 start-first（并行回滚）（默认 stop-first ）。",[16,260,261,264],{},[165,262,263],{},"update_config","：配置应如何更新服务，对于配置滚动更新很有用。",[55,266,267,270,273,276,278,281],{},[58,268,269],{},"parallelism：一次更新的容器数。",[58,271,272],{},"delay：在更新一组容器之间等待的时间。",[58,274,275],{},"failure_action：如果更新失败，该怎么办。其中一个 continue，rollback 或者pause （默认：pause）。",[58,277,252],{},[58,279,280],{},"max_failure_ratio：在更新过程中可以容忍的故障率。",[58,282,283],{},"order：回滚期间的操作顺序。其中一个 stop-first（串行回滚），或者 start-first（并行回滚）（默认stop-first）。",[16,285,286,289],{},[165,287,288],{},"注","：仅支持 V3.4 及更高版本。",[16,291,292],{},"devices",[16,294,295],{},"指定设备映射列表。",[35,297,300],{"className":298,"code":299,"language":40,"meta":41},[38],"devices:\n  - \"\u002Fdev\u002FttyUSB0:\u002Fdev\u002FttyUSB0\"\n",[43,301,299],{"__ignoreMap":41},[16,303,304],{},"dns",[16,306,307],{},"自定义 DNS 服务器，可以是单个值或列表的多个值。",[35,309,312],{"className":310,"code":311,"language":40,"meta":41},[38],"dns: 8.8.8.8\n\ndns:\n  - 8.8.8.8\n  - 9.9.9.9\n",[43,313,311],{"__ignoreMap":41},[16,315,316],{},"dns_search",[16,318,319],{},"自定义 DNS 搜索域。可以是单个值或列表。",[35,321,324],{"className":322,"code":323,"language":40,"meta":41},[38],"dns_search: example.com\n\ndns_search:\n  - dc1.example.com\n  - dc2.example.com\n",[43,325,323],{"__ignoreMap":41},[16,327,328],{},"entrypoint",[16,330,331],{},"覆盖容器默认的 entrypoint。",[35,333,336],{"className":334,"code":335,"language":40,"meta":41},[38],"entrypoint: \u002Fcode\u002Fentrypoint.sh\n",[43,337,335],{"__ignoreMap":41},[16,339,340],{},"也可以是以下格式：",[35,342,345],{"className":343,"code":344,"language":40,"meta":41},[38],"entrypoint:\n    - php\n    - -d\n    - zend_extension=\u002Fusr\u002Flocal\u002Flib\u002Fphp\u002Fextensions\u002Fno-debug-non-zts-20100525\u002Fxdebug.so\n    - -d\n    - memory_limit=-1\n    - vendor\u002Fbin\u002Fphpunit\n",[43,346,344],{"__ignoreMap":41},[16,348,349],{},"env_file",[16,351,352],{},"从文件添加环境变量。可以是单个值或列表的多个值。",[35,354,357],{"className":355,"code":356,"language":40,"meta":41},[38],"env_file: .env\n",[43,358,356],{"__ignoreMap":41},[16,360,361],{},"也可以是列表格式：",[35,363,366],{"className":364,"code":365,"language":40,"meta":41},[38],"env_file:\n  - .\u002Fcommon.env\n  - .\u002Fapps\u002Fweb.env\n  - \u002Fopt\u002Fsecrets.env\n",[43,367,365],{"__ignoreMap":41},[16,369,370],{},"environment",[16,372,373],{},"添加环境变量。您可以使用数组或字典、任何布尔值，布尔值需要用引号引起来，以确保 YML 解析器不会将其转换为 True 或 False。",[35,375,378],{"className":376,"code":377,"language":40,"meta":41},[38],"environment:\n  RACK_ENV: development\n  SHOW: 'true'\n",[43,379,377],{"__ignoreMap":41},[16,381,382],{},"expose",[16,384,385],{},"暴露端口，但不映射到宿主机，只被连接的服务访问。",[16,387,388],{},"仅可以指定内部端口为参数：",[35,390,393],{"className":391,"code":392,"language":40,"meta":41},[38],"expose:\n - \"3000\"\n - \"8000\"\n",[43,394,392],{"__ignoreMap":41},[16,396,397],{},"extra_hosts",[16,399,400],{},"添加主机名映射。类似 docker client --add-host。",[35,402,405],{"className":403,"code":404,"language":40,"meta":41},[38],"extra_hosts:\n - \"somehost:162.242.195.82\"\n - \"otherhost:50.31.209.229\"\n",[43,406,404],{"__ignoreMap":41},[16,408,409],{},"以上会在此服务的内部容器中 \u002Fetc\u002Fhosts 创建一个具有 ip 地址和主机名的映射关系：",[35,411,414],{"className":412,"code":413,"language":40,"meta":41},[38],"162.242.195.82  somehost\n50.31.209.229   otherhost\n",[43,415,413],{"__ignoreMap":41},[16,417,418],{},"healthcheck",[16,420,421],{},"用于检测 docker 服务是否健康运行。",[35,423,426],{"className":424,"code":425,"language":40,"meta":41},[38],"healthcheck:\n  test: [\"CMD\", \"curl\", \"-f\", \"http:\u002F\u002Flocalhost\"] # 设置检测程序\n  interval: 1m30s # 设置检测间隔\n  timeout: 10s # 设置检测超时时间\n  retries: 3 # 设置重试次数\n  start_period: 40s # 启动后，多少秒开始启动检测程序\n",[43,427,425],{"__ignoreMap":41},[16,429,430],{},"image",[16,432,433],{},"指定容器运行的镜像。以下格式都可以：",[35,435,438],{"className":436,"code":437,"language":40,"meta":41},[38],"image: redis\nimage: ubuntu:14.04\nimage: tutum\u002Finfluxdb\nimage: example-registry.com:4000\u002Fpostgresql\nimage: a4bc65fd # 镜像id\n",[43,439,437],{"__ignoreMap":41},[16,441,442],{},"logging",[16,444,445],{},"服务的日志记录配置。",[16,447,448],{},"driver：指定服务容器的日志记录驱动程序，默认值为json-file。有以下三个选项",[35,450,453],{"className":451,"code":452,"language":40,"meta":41},[38],"driver: \"json-file\"\ndriver: \"syslog\"\ndriver: \"none\"\n",[43,454,452],{"__ignoreMap":41},[16,456,457],{},"仅在 json-file 驱动程序下，可以使用以下参数，限制日志得数量和大小。",[35,459,462],{"className":460,"code":461,"language":40,"meta":41},[38],"logging:\n  driver: json-file\n  options:\n    max-size: \"200k\" # 单个文件大小为200k\n    max-file: \"10\" # 最多10个文件\n",[43,463,461],{"__ignoreMap":41},[16,465,466],{},"当达到文件限制上限，会自动删除旧的文件。",[16,468,469],{},"syslog 驱动程序下，可以使用 syslog-address 指定日志接收地址。",[35,471,474],{"className":472,"code":473,"language":40,"meta":41},[38],"logging:\n  driver: syslog\n  options:\n    syslog-address: \"tcp:\u002F\u002F192.168.0.42:123\"\n",[43,475,473],{"__ignoreMap":41},[16,477,478],{},"network_mode",[16,480,481],{},"设置网络模式。",[35,483,486],{"className":484,"code":485,"language":40,"meta":41},[38],"network_mode: \"bridge\"\nnetwork_mode: \"host\"\nnetwork_mode: \"none\"\nnetwork_mode: \"service:[service name]\"\nnetwork_mode: \"container:[container name\u002Fid]\"\n",[43,487,485],{"__ignoreMap":41},[16,489,490],{},"networks",[16,492,493],{},"配置容器连接的网络，引用顶级 networks 下的条目 。",[35,495,498],{"className":496,"code":497,"language":40,"meta":41},[38],"services:\n  some-service:\n    networks:\n      some-network:\n        aliases:\n         - alias1\n      other-network:\n        aliases:\n         - alias2\nnetworks:\n  some-network:\n    # Use a custom driver\n    driver: custom-driver-1\n  other-network:\n    # Use a custom driver which takes special options\n    driver: custom-driver-2\n",[43,499,497],{"__ignoreMap":41},[16,501,502,505],{},[165,503,504],{},"aliases"," ：同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。",[16,507,508],{},"restart",[55,510,511,514,517,520],{},[58,512,513],{},"no：是默认的重启策略，在任何情况下都不会重启容器。",[58,515,516],{},"always：容器总是重新启动。",[58,518,519],{},"on-failure：在容器非正常退出时（退出状态非0），才会重启容器。",[58,521,522],{},"unless-stopped：在容器退出时总是重启容器，但是不考虑在Docker守护进程启动时就已经停止了的容器",[35,524,527],{"className":525,"code":526,"language":40,"meta":41},[38],"restart: \"no\"\nrestart: always\nrestart: on-failure\nrestart: unless-stopped\n",[43,528,526],{"__ignoreMap":41},[16,530,531],{},"注：swarm 集群模式，请改用 restart_policy。",[16,533,534],{},"secrets",[16,536,537],{},"存储敏感数据，例如密码：",[35,539,542],{"className":540,"code":541,"language":40,"meta":41},[38],"version: \"3.1\"\nservices:\n\nmysql:\n  image: mysql\n  environment:\n    MYSQL_ROOT_PASSWORD_FILE: \u002Frun\u002Fsecrets\u002Fmy_secret\n  secrets:\n    - my_secret\n\nsecrets:\n  my_secret:\n    file: .\u002Fmy_secret.txt\n",[43,543,541],{"__ignoreMap":41},[16,545,546],{},"security_opt",[16,548,549],{},"修改容器默认的 schema 标签。",[35,551,554],{"className":552,"code":553,"language":40,"meta":41},[38],"security-opt：\n  - label:user:USER   # 设置容器的用户标签\n  - label:role:ROLE   # 设置容器的角色标签\n  - label:type:TYPE   # 设置容器的安全策略标签\n  - label:level:LEVEL  # 设置容器的安全等级标签\n",[43,555,553],{"__ignoreMap":41},[16,557,558],{},"stop_grace_period",[16,560,561],{},"指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号)，等待多久后发送 SIGKILL 信号关闭容器。",[35,563,566],{"className":564,"code":565,"language":40,"meta":41},[38],"stop_grace_period: 1s # 等待 1 秒\nstop_grace_period: 1m30s # 等待 1 分 30 秒 \n",[43,567,565],{"__ignoreMap":41},[16,569,570],{},"默认的等待时间是 10 秒。",[16,572,573],{},"stop_signal",[16,575,576],{},"设置停止容器的替代信号。默认情况下使用 SIGTERM 。",[16,578,579],{},"以下示例，使用 SIGUSR1 替代信号 SIGTERM 来停止容器。",[35,581,584],{"className":582,"code":583,"language":40,"meta":41},[38],"stop_signal: SIGUSR1\n",[43,585,583],{"__ignoreMap":41},[16,587,588],{},"sysctls",[16,590,591],{},"设置容器中的内核参数，可以使用数组或字典格式。",[35,593,596],{"className":594,"code":595,"language":40,"meta":41},[38],"sysctls:\n  net.core.somaxconn: 1024\n  net.ipv4.tcp_syncookies: 0\n\nsysctls:\n  - net.core.somaxconn=1024\n  - net.ipv4.tcp_syncookies=0\n",[43,597,595],{"__ignoreMap":41},[16,599,600],{},"tmpfs",[16,602,603],{},"在容器内安装一个临时文件系统。可以是单个值或列表的多个值。",[35,605,608],{"className":606,"code":607,"language":40,"meta":41},[38],"tmpfs: \u002Frun\n\ntmpfs:\n  - \u002Frun\n  - \u002Ftmp\n",[43,609,607],{"__ignoreMap":41},[16,611,612],{},"ulimits",[16,614,615],{},"覆盖容器默认的 ulimit。",[35,617,620],{"className":618,"code":619,"language":40,"meta":41},[38],"ulimits:\n  nproc: 65535\n  nofile:\n    soft: 20000\n    hard: 40000\n",[43,621,619],{"__ignoreMap":41},[16,623,624],{},"volumes",[16,626,627],{},"将主机的数据卷或者文件挂载到容器里。",[35,629,632],{"className":630,"code":631,"language":40,"meta":41},[38],"version: \"3.7\"\nservices:\n  db:\n    image: postgres:latest\n    volumes:\n      - \"\u002Flocalhost\u002Fpostgres.sock:\u002Fvar\u002Frun\u002Fpostgres\u002Fpostgres.sock\"\n      - \"\u002Flocalhost\u002Fdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\"\n",[43,633,631],{"__ignoreMap":41},{"title":41,"searchDepth":635,"depth":635,"links":636},4,[],[638],"容器","2026-01-25","详解如何使用 docker-compose.yml 配置文件，来管理多个容器的部署。",false,"md",null,{"slots":645},{},true,"\u002Fposts\u002Fdocker-compose-yml",{"text":649,"minutes":650,"time":651,"words":652},"11 min read",10.66,639600,2132,{"title":5,"description":640},{"loc":647},"posts\u002Fposts\u002Fdocker-compose-yml",[],"tech","A4s8lB-WAhy2z8UpUzGFtTLWjaSEUsYFTdbHt_lv0Oo",[660,664],{"title":661,"path":662,"stem":663,"date":639,"type":657,"children":-1},"多个docker-compose实例共享网络","\u002Fposts\u002Fdocker-compose-network","posts\u002Fposts\u002Fdocker-compose-network",{"title":665,"path":666,"stem":667,"date":668,"type":657,"children":-1},"PostgreSQL 远程访问与数据目录迁移","\u002Fposts\u002Fpostgresql-config","posts\u002Fposts\u002Fpostgresql-config","2026-01-25 00:00:00",1788712224840]