在线浏览思维导图

  • 是什么?

    可以管理多个Docker容器,组成一个应用。需要定义配置一个YAML格式的配置文件docker-compose.yml

  • 概念

    • 服务service 一个容器对应提供对应的服务
    • 项目project 若干个对应的容器组成的一个完整的业务,在docker-compose.yml文件中定义
  • 安装流程

    • 以下安装流程已经过时
      最新安装流程参考官方Docker Compose Install

    • curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

    • 放开读写权限 chmod +x /usr/local/bin/docker-compose

    • 检查安装状态 docker-compose --version

      image-20230228101925554

    • 卸载命令rm /usr/local/bin/docker-compose

  • docker compose使用步骤

    • 使用Dockerfile配置容器环境
    • 编辑dokcer-compose.yml配置服务
    • 运行docker compose up启动程序
  • 模板文件(部分)

    每一个服务都必须通过image指令或者build指令来自动构建生成镜像

    • version

      版本信息

    • build

      指定Dockerfile所在的文件夹路径

      version: '3'
      services:
       webapp:
        build: ./dir

      同时build可以详细配置

      version: '3'
      service:
       webapp:
        build:
         context: ./dir #指定Dockerfile所在文件夹
         dockerfile: Dockerfile-alternate #指定Dockerfile文件
         args:
          buildno: 1 #构建镜像时的变量
         cache_from: #指定镜像缓存
          - alpine:latest
    • container_name

      指定容器名称

      默认的是项目名称_服务名称_序号

      container_name: docker-web-container

      定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。

    • devices

      指定设备映射关系

      devices:
       - "/dev/ttyUSB1:/dev/ttyUSB0"
    • depends_on

      解决容器的依赖、启动先后的问题

      version: '3'
      services: 
       web:
        build: .
        depends_on:
         - db
         - redis
        redis: 
         image: redis
        db:
         image: postgres
    • env_file

      从文件中获取环境变量,可以是单独的文件路径或者列表

      当与environment指令发生冲突,则以environment为准

      env_file: .env
      
      env_file:
       - ./commin.env
       - ./apps/web.env
       - /opt/secrets.env
      #这是注释
      PROG_ENV=development
    • environment

      设置环境变量。可以使用字典或者数组两种格式

      environment:
       USERNAME: xxcheng
       PASSWORD: 12345678
      
      environment:
       - USERNAME: xxcheng
       - PASSWORD: 12345678
    • exposr

      暴露端口,但是不映射到宿主机。

      expose: 
       - "3000"
       - "8080"
    • image

      指定使用的镜像名称或者镜像ID

      image: ubuntu
      image: a4bc65fd
    • labels

      为容器添加元数据信息。

      labels: 
       com.startupteam.description: "webapp for a startup team"
       com.startupteam.department: "devops department"
       com.startupteam.release: "rc3 for v1.0"
    • logging

      配置日志选项

      logging: 
       driver: syslog
       options:
        syslog-address: "tcp://192.168.0.1:123"

      可选的日志驱动类型

      • driver: "json-file"
      • deiver: "syslog"
      • driver: "none"
    • network_mode

      设置网络模式,与docker run--network的值一样

      network_mode: bridge
      network_mode: host
      network_mode: none
    • networks

      配置容器连接的网络

      version: "3"
      services: 
       some-service:
        networks:
         - some-network
         - other-network
      networks: 
       some-network:
       other-network:
    • ports

      设置暴露端口信息

      ports: 
       - "3000"
       - "8080:8080"
       - "2222:22"
       - "127.0.0.1:80:80"
    • secrets

      存储敏感数据

      version: "3.1"
      services:
       mysql:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
        secrets:
          - db_root_password
          - my_other_secret
       secrets:
        my_secret:
          file: ./my_secret.txt
        my_other_secret:
          external: true
    • volumes

      设置容器卷

      volumes: 
       - /var/lib/mysql
       - cache/:/tmp/cache
       - /root/abc:/abc:ro
  • 命令

    • -f --fiel FIELPATH 指定使用的Compose模板文件

    • -p --project-name NAME 指定项目名称,默认为所在目录为项目名

    • config

      验证compose文件格式是否正确

    • up 启动

    • down 停止

    • pause 暂停

  • 实战

    搭建CIG监控平台

    CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表

    version: '3.1'
    
    volumes:
    
      grafana_data: {}
    
    services:
    
     influxdb:
    
      image: tutum/influxdb:0.9
    
      restart: always
    
      environment:
    
        - PRE_CREATE_DB=cadvisor
    
      ports:
    
        - "8083:8083"
    
        - "8086:8086"
    
      volumes:
    
        - ./data/influxdb:/data
    
     cadvisor:
    
      image: google/cadvisor
    
      links:
    
        - influxdb:influxsrv
    
      command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
    
      restart: always
    
      ports:
    
        - "8080:8080"
    
      volumes:
    
        - /:/rootfs:ro
    
        - /var/run:/var/run:rw
    
        - /sys:/sys:ro
    
        - /var/lib/docker/:/var/lib/docker:ro
    
     grafana:
    
      user: "104"
    
      image: grafana/grafana
    
      user: "104"
    
      restart: always
    
      links:
    
        - influxdb:influxsrv
    
      ports:
    
        - "3000:3000"
    
      volumes:
    
        - grafana_data:/var/lib/grafana
    
      environment:
    
        - HTTP_USER=admin
    
        - HTTP_PASS=admin
    
        - INFLUXDB_HOST=influxsrv
    
        - INFLUXDB_PORT=8086
    
        - INFLUXDB_NAME=cadvisor
    
        - INFLUXDB_USER=root
    
        - INFLUXDB_PASS=root

    image-20230301140120662

    image-20230301140204103

    image-20230301140231247

    image-20230301140405117

    image-20230301140428750

    image-20230301142833601

  • 参考