docker-compose为docker三剑客之一,docker三剑客分别为:docker-machine、docker-compose、docker-swarm。

    • docker-machine: 解决docker的运行环境问题。平时docker在linux运行较为方便,当docker运行在windows或者mac系统上时,docker-machine就会派上用场
    • docker-compose:解决本地docker容器编排问题。其实早期版本的docker-compose并不具有编排能力,更像是批量启动和销毁容器的工具,后续v3版本增加了原本docker-swarm中才具有的一些功能,才勉强具备了编排的能力,后续会详细介绍
    • docker-swarm:解决多主机多个容器的调度部署问题,但整体地位比较尴尬,因为k8s在集群中对容器的编排显然比docker-swarm要好的多,虽说swarm模式开启比较方便,且与docker-compose的部分参数有重合,但还是更加推荐直接上手k8s

    docker-compose采用python编写,底层直接调用docker的api接口来与docker daemon进行交互,安装简单,直接从官网直接下载二进制文件,并且设置相关权限可立即使用。install docker-compose

    以minio为例来演示docker-compose如何使用,该例子包含.env、common.env、minio.yaml三个文件。

    • .env文件:minio本身需要用到的环境变量,该文件名字本身不能改变,且需要与用于容器启动的yaml文件存放在同一目录下,在yaml文件中通过${}获取,eg:${minio_image}获取文件中设置的minio 镜像值
      minio_image=minio:v1
      MINIO_ACCESS_KEY=minio
      MINIO_SECRET_KEY=minio
    • common.env文件:minio与项目中其余容器共同使用的环境变量。该文件名字可自定义,不要求必须与yaml文件处于同一目录下,只需在对env_file设置时写入正确的文件路径即可
      host_name=Linux
      ip=192.168.1.10
    • minio.yaml文件:minio容器描述文件。该文件中涉及到的适用于swarm模式的参数只作为展示说明,真正启动时并不生效

      1. version: "3.8"
      2. services:
      3. minio: # services名,同一个yaml文件可配置多个services
      4. restart: always #重启策略
      5. image: ${minio_image} # 从.env文件获取环境变量
      6. # build: . # 启动时从指定的路径先编译镜像
      7. command: server /data
      8. container_name: minio # 指定容器名字,若不指定
      9. depends_on: # 容器依赖,且会在依赖的容器启动后再启动该容器,但并不是说等待依赖的容器ready后再启动
      10. - busybox
      11. ports: # 容器与主机端口映射 主机端口:容器端口
      12. - "9000:9000"
      13. environment:
      14. MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} # 从.env文件获取环境变量
      15. MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} # 从.env文件获取环境变量
      16. host_name: Linux_test
      17. env: env_set
      18. env_file:
      19. - common.env # 将common.env文件的内容加载为环境变量
      20. volumes:
      21. - "/minio/data:/data" # 数据卷映射
      22. healthcheck:
      23. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] # 健康检测指令
      24. interval: 30s # 容器运行到执行健康检测的等待时间
      25. timeout: 20s # 超时时间
      26. retries: 3 # 重试次数
      27. deploy:
      28. resources:
      29. limits: # 容器的资源限制
      30. cpus: '2'
      31. memory: 4G
      32. reservations: # 容器启动时请求的资源,该参数在swarm模式下才生效,此处配置仅作为说明
      33. cpus: '0.5'
      34. memory: 200M
      35. networks: # 容器启动时指定的网络,同一网络下的容器可相互通信
      36. default:
      37. external:
      38. name: iotware

      compose文件可大致分为versionservicesnetwork三部分

    • version:compose文件的版本号,常见的有1、1.x,2, 2.x,3.x。不同版本的compose文件语法不同,功能也有差异,一般版本号越大功能越丰富,更多版本号差异的内容可访问docker-compose version

    • services:对容器进行描述,单个yaml文件中可以有多个services,但每个services中只能有一个容器
      • build: 该参数配置时表示启动时会先从指定路径构建镜像,与image参数只能设置一个
      • restart:容器重启策略。
        • no:禁止自动重启容器,默认值;
    • always:无论如何都会重启容器;
    • on-failure:出现on-failure报错时重启容器
    • container_name:容器名设置
    • command:覆盖Dockerfile中的CMD参数
    • environment:设置环境变量,相比env_file,该参数优先级更高

    image.png

    • healthcheck:类似于k8s中的就绪探针,当探针检测通过时才认为容器状态为ready
    • deploy:deploy中只有部分参数适用于docker-compose模式,其余则必须在swarm模式下才能生效。例如文件中给出的reservations参数在启动时会被自动忽略

    image.png

    • network:指定容器使用的网络,同一网络下的容器可通过容器名互相通信。指定的网络需在容器启动前提前创建docker network minio create

    补充:
    docker-compose中还有project(项目)的概念,项目名默认为docker-compose.yaml所在的目录名,也可在容器启动时通过-p进行指定。
    project的作用可在(但不仅仅在)未设置容器名或为指定network时体现出来

    • 未设置containername时会默认以**project名_services名序号**的形式对容器进行命名

    image.png

    • 未设置network时会默认以project名_default的形式创建默认的networkimage.png

    常用参数:

    • -f : 指定compose文件,若不指定默认寻找docker-compose.yaml文件
    • -p: 指定项目名,不知道则默认以当前目录名作为项目名
    • up -d : 后台启动compose文件中描述的所有容器
    • down:停止compose文件中描述的所有容器
    • ps -a:列出通过docker-compose启动的所有容器的状态