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自定义网卡

    version: "3"
    name: myapp
    networks:
      radius:
        driver: bridge
        ipam:
          config:
          - subnet: 172.31.4.0/24
    
  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 @ 2022-01-12 20:37  mingtian是吧  阅读(82)  评论(0编辑  收藏  举报