docker-compose
docker-compose
docker-compose 是docker官方的单机编排工具,适用于多个容器配合工作的场景,Compose项目由Python编写。实际上调用了Docker服务提供的API来对容器进管理 。
时隔至今我再次使用docker-compose 时自v1.26 后官方已经使用go重写了docker-compose。
[INFO]
Compose 中有两个重要的概念︰
服务(service):一个应用的容器﹐实际上可以包括若干运行相同镜像的容器实例。
项目(project)∶由一组关联的应用容器组成的一个完整业务单元﹐在docker-compose.yml文件中定义。Compose的默认管理对象是项目﹐通过子命令对项目中的一组容器进行便捷地生命周期管理。
安装docker-compose
方法一:通过仓库安装 pip install docker-compose yum install docker-compose 方法二:二进制安装 方法三:在容器中运行 docker-compose version
我们来熟悉下docker-compose.yml 的基本格式
wordpress: images: wiki:latest name: wordpress restart: always ports: "80:80" mysql: images: 1209233066/mysql:v8.1 volumes: /var/lib/mysql/:/var/lib/mysql/ restart: always env: MYSQL_ROOT_PASSWORD=123 name: mysql net: "container:wordpress"
接下来一步步构建自己的docker-compese.yml项目
-
Version
声明项目使用的版本,不声明也不会出现错误。建议省略version: "3" -
name
指定project 名称。如果忽略则自动使用docker-compose.yml 所在的目录名作为项目名称version: "3" name: myapp -
services
每一个需要启动的容器都是一个服务version: "3" name: myapp services: python: image: python -
command
命令会覆盖image中的CMD 命令,如果不声明默认使用image的CMDversion: "3" name: myapp services: web: image: python command: /bin/sh -c "python -m http.server" #command: ["python","-m","http.server"] -
ports
指定了端口的映射version: "3" name: myapp services: web: image: python ports: - "500:8000" command: /bin/sh -c "python -m http.server" #command: ["python","-m","http.server"] -
working_dir
version: "3" name: myapp services: web: image: python ports: - "500:8000" # 覆盖image中的WORKDIR working_dir: /tmp command: /bin/sh -c "python -m http.server" -
build
和image
指定容器使用那个镜像或dockerfileversion: "3" name: myapp services: web: build: . ports: ["500:80"] # 覆盖image中的WORKDIR working_dir: /tmp # 覆盖镜像中的CMD command: /bin/sh -c "python -m http.server 80" # Dockerfile FROM python WORKDIR /bin CMD ["python","-m","http.server"] -
expose
指定容器对外暴露的端口version: "3" name: myapp services: web: build: . expose: - "80" ports: ["500:80"] # 覆盖image中的WORKDIR working_dir: /root # 覆盖镜像中的CMD command: /bin/sh -c "python -m http.server 80" # Dockerfile FROM python WORKDIR /bin CMD ["python","-m","http.server"] -
volumes
文件挂载[INFO]
docker-compose down --volumes #移除挂载
version: "3" name: myapp services: web: build: . expose: - "8000" ports: - "500:8000" volumes: - "/tmp:/tmp" working_dir: "/tmp" command: /bin/sh -c "python -m http.server" -
network_mode
host 、bridge、none、container:containernameversion: "3" name: myapp services: web: image: python expose: - "8000" ports: - "500:8000" volumes: - "/tmp:/tmp" working_dir: "/tmp" command: /bin/sh -c "python -m http.server" network_mode: host -
extra_hosts
域名映射extra_hosts: - "elasticsearch:10.4.7.10" -
restart
重启策略version: "3" name: myapp services: web: image: python expose: - "8000" ports: - "500:8000" volumes: - "/tmp:/tmp" working_dir: "/tmp" command: /bin/sh -c "python -m http.server" network_mode: host restart: unless-stopped #restart: always -
pid
与宿主机的共享ipc名称空间version: "3" name: myapp services: web: image: python expose: - "8000" ports: - "500:8000" volumes: - "/tmp:/tmp" working_dir: "/tmp" command: /bin/sh -c "python -m http.server" network_mode: host restart: unless-stopped #restart: always pid: host -
depends_on
不保证被依赖的服务正常,之后的版本中支持更多参数depends_on: - mongodb1 - mongodb2 - mongodb3 -
links
-
environment
环境变量- 第一种:从文件中加载
- 第二种:从系统变量中获取
- 第三种:容器中设定变量
- 第四种:在容器中指定envfile
- 第五种:在使用docker-compose -e
[INFO]
1.28版本之前从当前目录中查找.env
1.28 之后从project 的目录下寻找.env
可以通过
docker-compose --env-file ./config/.env.dev up
指定环境变量的文件第一种:从文件中加载
# 从文件中加载,enviriment优先级更高 cat .env port=8000 host=500 #可以通过 `docker-compose config ` 验证变量的解析情况 version: "3" services: test: image: python command: ["sh","-c","python -m http.server --bind $host ${port}"]
第二种:从系统变量中获取
# 从系统变量中获取变量 ]# export port=9000 #可以通过 `docker-compose config ` 验证变量的解析情况 version: "3" services: test: image: python command: ["python","-m","http.server","${port:-8000}"] 第三种:
environment
容器中设定变量#可以通过 `docker-compose config ` 验证变量的解析情况 # 容器中设定变量environment version: "3" services: test: image: python environment: - port=8888 - host=0.0.0.0 # environment 支持两种格式 # environment: # port: 8888 # host: 0.0.0.0 # 需要使用$$ 并使用sh -c command: ["sh","-c","python -m http.server --bind $$host $${port}"] 第四种:在容器中指定
envfile
cat ./file.env port=8000 host=500 # 在容器中指定envfile #可以通过 `docker-compose config ` 验证变量的解析情况 version: "3" services: test: image: python env_file: - ./file.env command: ["sh","-c","python -m http.server --bind $$host $${port}"] 第五种:在使用
docker-compose -e
#在使用docker-compose -e docker-compose run -e host=127.0.0.1 -e port=8888 test version: "3" services: test: image: python env_file: - ./file.env command: ["sh","-c","python -m http.server --bind $$host $${port}"] -
profiles
给服务打上标签[INFO]
当docker-compose up 时不启用带有profiles标签的服务
docker-compose --profile profile的标签 up 才会启用
如下例子docker-compose up
只会启动backend和db 容器,
docker-compose --profile frontend --profile debug up
启动所有容器
COMPOSE_PROFILES=frontend,debug docker-compose up
启动所有容器version: "3" services: frontend: image: frontend profiles: ["frontend"] phpmyadmin: image: phpmyadmin depends_on: - db profiles: - debug backend: image: backend db: image: mysql -
mem_limit/cpus
资源限制version: "3" services: frontend: image: frontend mem_limit: 2048m cpus: 2.0 -
ulimits
设定version: "3" services: frontend: image: frontend profiles: ["frontend"] ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000 -
logging
指定日志驱动和保存策略version: "3" name: myapp services: mongodb: image: mongo:6.0.14 # 指定日志文件大小和日志驱动 # 日志保存在 /var/lib/docker/containers/<container-id>/*-json.log logging: driver: json-file options: max-size: "10m" max-file: "3" 其他日志驱动供参考
logging: driver: syslog options: syslog-address: "tcp://192.168.0.16:514" tag: "my-docker-container" logging: driver: "none" logging: driver: fluentd options: fluentd-address: "localhost:24224" tag: "my-docker.{{.ID}}" logging: options: tag: "{{.ImageName}}/{{.Name}}" -
networks
自定义网卡docker-compose 定义网络
.... networks: envoy: driver: bridge ipam: config: - subnet: "192.168.3.0/24" ... # 引用其他docker-compose.yaml 中的网络驱动 networks: envoy_demo_envoy: external: true docker-compose 服务引用网络
network_mode: "service:mainserver" networks: envoy: ipv4_address: 192.168.3.100 # 定义了该服务的dns名称,多个服务可以定义相同名称,达到DNS高可用的效果 aliases: - envoy docker-compose 为容器/etc/hosts中添加dns解析
... extra_hosts: dubbo-service-provider: 192.168.0.100 version: '3' services: envoy: image: envoyproxy/envoy-alpine:v1.11.1 volumes: - ./envoy.yaml:/etc/envoy/envoy.yaml network_mode: "service:mainserver" depends_on: - mainserver mainserver: image: ikubernetes/mini-http-server:v0.3 networks: envoymesh: aliases: - webserver - httpserver networks: envoymesh: {} -
x-define-*
公共代码块的锚定,通过该方法提取公共代码块version: "3" x-define-log: &log logging: driver: json-file options: max-size: "256m" max-file: "3" x-define-mongosvc: &mongosvc <<: *log extra_hosts: - "mongodb1:172.31.4.11" - "mongodb2:172.31.4.12" - "mongodb3:172.31.4.13" restart: always image: mongo:6.0.14 command: - "/usr/bin/mongod" - "-f" - "/etc/mongod/mongod.conf" healthcheck: test: ["CMD", "sh", "/etc/mongod/healthcheck.sh"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: seagull: driver: bridge ipam: config: - subnet: 172.31.4.0/24 services: mongodb1: networks: seagull: ipv4_address: 172.31.4.11 aliases: - mongodb hostname: mongodb1 volumes: - "./config/mongo/mongod.conf:/etc/mongod/mongod.conf" - "./config/mongo/init/healthcheck.sh:/etc/mongod/healthcheck.sh" - "./config/mongo/keyfile:/data/mongodb/keyfile" - "./data/mongo/data/mongodb1:/data/mongodb/data" - "./data/mongo/log/mongodb1:/data/mongodb/log" <<: *mongosvc
附录
示例
version: "3" services: envoy_proxy: image: envoyproxy/envoy:v1.21.4 volumes: - "./envoy.yaml:/etc/envoy/envoy.yaml" - "./certs:/etc/envoy/certs" ports: - "10000:10000" - "9000:9000" - "9901:9901" networks: radius: ipv4_address: 172.31.4.2 aliases: - envoy_proxy radius_web: image: 1209233066/radius_web:v2.1 entrypoint: sh -c "sleep 60 && python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000 --insecure" depends_on: - mysql-db - mysql-client # network_mode: service:envoy_proxy networks: radius: aliases: - radius_web radiusd: image: 1209233066/radiusd:3.0.13 volumes: - ./config/default:/etc/raddb/sites-enabled/default - ./config/radiusd.conf:/etc/raddb/radiusd/radiusd.conf - ./config/sql:/etc/raddb/mods-available/sql - ./config/clients.conf:/etc/raddb/clients.conf ports: - "1812:1812/udp" - "1813:1813/udp" depends_on: - mysql-db - mysql-client networks: radius: ipv4_address: 172.31.4.3 aliases: - radiusd mysql-client: image: mysql:5.7 volumes: - ./sql:/opt/sql command: ["sh","/opt/sql/init.sh"] network_mode: "service:mysql-db" depends_on: - mysql-db mysql-db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=123 networks: radius: ipv4_address: 172.31.4.10 aliases: - mysql-db networks: radius: driver: bridge ipam: config: - subnet: 172.31.4.0/24
docker-compose 命令
docker-compose up docker-compose up -d docker-compose run web env docker-compose up -d --scale web=5 docker-compose ps docker-compose down docker-compose stop docker-compose --env-file ./config/.env.dev up docker-compose --profile debug up docker-compose --profile frontend --profile debug up #使用docker-compose config查看docker-compose.yml 中变量解析后的内容 docker-compose --env-file ./config/.env.dev config docker-compose config -f test.yaml docker-compose config -f test.yaml
https://docs.docker.com/compose/compose-file/05-services/#aliases
https://docs.docker.com/compose/compose-file/05-services/
样例 https://github.com/docker/awesome-compose
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏