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
自定义网卡version: "3" name: myapp networks: radius: driver: bridge ipam: config: - subnet: 172.31.4.0/24
-
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