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项目

  1. Version声明项目使用的版本,不声明也不会出现错误。建议省略

    version: "3"
  2. name 指定project 名称。如果忽略则自动使用docker-compose.yml 所在的目录名作为项目名称

    version: "3"
    name: myapp
  3. services每一个需要启动的容器都是一个服务

    version: "3"
    name: myapp
    services:
    python:
    image: python
  4. command命令会覆盖image中的CMD 命令,如果不声明默认使用image的CMD

    version: "3"
    name: myapp
    services:
    web:
    image: python
    command: /bin/sh -c "python -m http.server"
    #command: ["python","-m","http.server"]
  5. 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"]
  6. 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"
  7. buildimage指定容器使用那个镜像或dockerfile

    version: "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"]
  8. 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"]
  9. 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"
  10. network_mode host 、bridge、none、container:containername

    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
  11. extra_hosts域名映射

    extra_hosts:
    - "elasticsearch:10.4.7.10"
  12. 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
  13. 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
  14. depends_on 不保证被依赖的服务正常,之后的版本中支持更多参数

    depends_on:
    - mongodb1
    - mongodb2
    - mongodb3
  15. links

  16. 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}"]
  17. 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
  18. mem_limit/cpus 资源限制

    version: "3"
    services:
    frontend:
    image: frontend
    mem_limit: 2048m
    cpus: 2.0
  19. ulimits 设定

    version: "3"
    services:
    frontend:
    image: frontend
    profiles: ["frontend"]
    ulimits:
    nproc: 65535
    nofile:
    soft: 20000
    hard: 40000
  20. 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}}"
  21. 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: {}
  22. 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

posted @   mingtian是吧  阅读(105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示