• home > tools > Virtual > Docker >

    Docker-compose学习杂记

    Author:zhoulujun Date:

    Docker-Compose 就是专门用来管理多个 docker 容器的工具,它弥补了 docker 不易管理多容器的缺陷,提高协助 docker 做好运维工作。

    Docker-compose 是一个定义和运行多个 Docker 应用的工具,你可以使用YMAL文件来配置你的服务,然后使用docker-compose 命令,创建和启动、编排所有你配置的的服务。

    1173617-20231024173944070-1664543542.png


    compose 可以在任何工作环境中使用,生产环境,开发环境,持续集成等等。

    为何要使用Docker-Compose?

    默认情况下,docker 每次执行命令,只能负责单个镜像文件的构建、单个容器的管理,但一个实际应用程序中,可能需要同时运行多个容器一起工作,例如 Web后端项目通常需要:Koa + MongoDB,并且两个容器之间进行通信,此时若继续使用 docker 来运行管理则相对显得复杂繁琐一些。

    Docker-Compose 就是专门用来管理多个 docker 容器的工具,它弥补了 docker 不易管理多容器的缺陷,提高协助 docker 做好运维工作。

    事实上,比 Docker-Compose 更加灵活,功能更强大、对集群、负载平衡更好的程序是 k8s (Kubernetes)。

    微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,效率低、维护量大

    为了提高效率,我们就需要一种像 Dockerfile 定义 Docker 容器一样,能够定义容器(多个)编排和部署工具。

    于是,Docker Compose 出现了(其实应该说 Fig 出现了,Docker 收购了 Fig 并改名为 compose)。


    Docker Compose vs. K8s

    • Docker Compose是Docker公司推出的开源工具,它允许用户在单个主机上定义和运行多个容器应用程序。

    • Kubernetes(K8s)是一个由Google维护的开源系统,它用于自动化部署、扩展和管理容器化应用程序。

      • 使用K8s,用户可以轻松地在集群中运行容器应用程序。

    Docker Compose和K8s都用于部署和管理容器应用程序,但它们的功能有所不同。

    Docker Compose主要用于在单个主机上管理和运行多个容器应用程序。

    使用Docker Compose,用户可以轻松地定义多个容器和它们之间的依赖关系,并在单个主机上部署和运行它们。


    相比之下,K8s更灵活,它不仅可以在单个主机上运行容器应用程序,还可以在多个主机上运行这些应用程序。

    此外,K8s提供了许多高级功能,例如:服务发现和自动扩缩容等,使用户可以更轻松地管理容器应用程序。

    Docker Compose使用

    Compose模板文件格式

    • Docker Compose 使用 YAML 文件来定义多服务的应用。

    • Docker Compose 默认 使用文件名 docker-compose.yml。当然,也可以使用 -f 参数指定具体文件

    模板案例:

    version: "3.7"services:
      redis:
        image: redis:alpine
        ports:
          - "6379:6379"
        networks:
          - frontend
        deploy:
          # 指定运行容器的数量
          replicas: 2
          update_config:
            # 一次性更新的容器数量
            parallelism: 2
            # 更新一组容器之间的等待时间
            delay: 10s
          restart_policy:
            condition: on-failure
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            constraints: [node.role == manager]
      vote:
        image: dockersamples/examplevotingapp_vote:before
        ports:
          - 5000:80
        networks:
          - frontend
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            # 一次性更新的容器数量
            parallelism: 2
          restart_policy:
            condition: on-failure
      result:
        image: dockersamples/examplevotingapp_result:before
        ports:
          - 5001:80
        networks:
          - backend
        depends_on:
          - db
        deploy:
          replicas: 1
          update_config:
            # 一次性更新的容器数量
            parallelism: 2
            # 更新一组容器之间的等待时间
            delay: 10s
          restart_policy:
            condition: on-failurenetworks:
      frontend:
      backend:volumes:
      db-data:



    服务(容器)配置参数

    在配置文件中,services 下面每一个服务(容器)都需要根据需求添加对应的设置,docker-compose 中每一个服务(容器)的参数和 dockerfile 相似,但又有不同。

    参数名值类型对应含义
    build字符串构建镜像的 dockerfile 文件路径
    (通常情况下不要这样操作,而是通过 image 参数指定镜像名)
    image字符串镜像文件名
    (通常情况下直接使用镜像名,而不使用 build 参数构建镜像)
    container_name字符串创建容器的名字
    working_dir字符串容器中的工作根目录
    volumes数组服务器实际目录与容器目录映射关系,可以设置多条映射关系
    (服务器实际目录:容器虚拟目录)
    ports数组服务器端口与容器内部端口映射关系,可设置多条映射关系
    (服务器实际端口:容器虚拟端口)
    depends_on数组本容器运行依赖的其他容器
    docker-compose 会优先启动运行依赖的容器,之后再启动本容器
    例如 web 容器依赖于数据库(db)容器,因此先启动 db 容器,再启动 web 容器
    tty布尔值表明是否以后台运行
    command字符串执行的命令
    restart字符串docker-compose 重启时,容器是否也跟着重启,通常会设置值为:always
    (注意是 docker-compose restart,而不是 docker-compose up)
    environment数组环境变量(数组中每个元素都为 key=value,这些变量是给容器使用的,并且优先级高于在 dockerfile 中定义的变量)
    env_file数组配置变量的文件列表(env文件中定义的变量是给 docker-compose.yml 使用的)


    Docker 总体架构


    1173617-20231024174108363-1026332590.png


    1173617-20231024174114633-35660507.png

    Docker Compose 运行架构

    1173617-20231024174245464-288377102.png

     Docker Compose 核心概念


    • Docker Compose将所管理的容器分为三层,这三个概念均为Compose抽象的数据类型,其中 project 会包含service以及container:

      • 项目/工程(project)

      • 服务(service)

      • 容器(contaienr)

    • 项目(project):代表用户需要完成的一个项目。

      • 一个project拥有特定的名称,并且包含多个或一个service,同时还带有一个Docker Client。

      • 何为项目?Compose的一个配置文件可以解析为一个项目。

      • 即:Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。

      • 例如:用户在当前目录下执行docker-compose up -d,配置文件为当前目录下的配置文件docker-compose.yml,命令请求类型为up,-d为命令参数,对于配置文件中的内容,compose会将其解析为一个project。

      • 通过 Docker Compose 管理的一个项目被抽象称为一个 project

      • project 里包括多个 service

    • service,代表配置文件中的每一项服务,何为服务?

      • 一个service包含的内容,无非是用户对服务的定义。定义一个服务,可以为服务容器指定镜像,设定构建的Dockerfile,可以为其指定link的其他容器,还可以为其指定端口的映射等。

      • 比如,前面的配置文件中包含了两个service,第一个为web,第二个为redis。

      • 即以容器为粒度,用户需要Compose所完成的任务。

      • 每个 service 定义了容器运行的镜像(或构建镜像)、网络端口、文件挂载、参数、依赖等

      • 每个 service 可包括同一个镜像的多个容器实例。

    • 容器(container)


    docker-compose下启动容器的过程

    首先,用户执行 docker-compose up 命令调用命令行中的启动方法

    然后,如果当前宿主机已存在与该应用对应的容器,docker-compose 则进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose 就会执行 service 模块的容器重启方法,否则就直接启动已有容器。这两种操作的区别在于前者会停止旧的容器,创建并启动新的容器,并把旧容器移除掉。

    最后,contaier 模块会调用 docker-py 客户端来执行向 docker daemon 发起创建容器的 POST 请求。

    1173617-20231024174341813-125622049.png


    Docker-Compose命令

    docker-compose 命令格式为:docker-compose [-f <arg>] [options] [COMMAND] [ARGS]

    [-f <arg>]:配置文件(docker-compose.yml)路径,也可以在 [options] 中设置,若都不设置则默认为当前目录下的 docker-compose.yml

    • [options]:其他配置选项

    • [COMMAND]:命令

    • [ARGS]:命令的参数


    配置项对应值对应含义
    -f | --file路径配置文件路径,默认为当前目录下的 docker-compose.yml
    -p | --project-name名称配置项目别名,默认为当前目录名
    -c | --context名称配置内容名称
    --verbose不需要设置显示更多输出内容(详细细节)
    --log-level5选1配置日志的级别,值为:
    DEBUG(调试)、INFO(信息)、WARNING(警告)、ERROR(错误)、CRITICAL(严重)
    --no-ansi不需要设置不打印显示 ANSI 字符
    -v | --version不需要设置打印当前 docker-compose 版本并退出
    -H | --hosthost值守护进程 docket 连接的 host
    --tls不需要设置使用 TLS 协议 (安全传输层协议),参数 --tlsverify 默认会设置该值
    --tlscacert路径仅相信由此 CA 签署的证书
    --tlscert路径TLS 证书路径
    --tlskey路径TLS 证书key 路径
    --tlsverify不需要设置使用 TLS 并验证远程
    --skip-hostname-check不需要设置跳过证书检查
    --project-directory路径配置目录的别名,默认使用 docker-compose.yml 所在的目录名
    --compatibility不需要设置如果设置该项,则将尝试将 配置文件中的 deploy 秘钥转化为他们的非swarm 等价项
    --env-file路径配置环境参数(定义的环境变量)文件路径

    全部命令

    命令对应含义
    build构建或重建服务
    bundle从 配置文件(docker-compose.yml) 生成多个容器(容器束)
    config验证和查看配置文档
    create创建服务
    down停止并删除容器、网络、镜像、映射关系
    events从容器接收实时事件
    exec在正在运行的容器中执行命令
    help获得命令帮助
    images查看镜像列表
    kill杀死容器
    logs查看容器的输出内容
    pause暂停服务
    port查看内部端口映射的本机端口
    ps查看容器列表
    pull拉取镜像
    push推送镜像
    restart重启服务
    rm移除已停止的容器
    run执行一次性命令
    scale设置容器数量
    start启动服务
    stop停止服务
    unpause显示正在运行的容器(非暂停容器)
    up创建并启动容器
    version显示 docker-compose 版本号,以及 docker-compose 依赖其他模块的版本号
    (docker-compose -v 仅打印 docker-compose 的版本号)



    参考文章:

    Docker Compose 基础教程(概念/基础操作 https://www.cnblogs.com/johnnyzen/p/17785405.html

    https://github.com/puxiao/notes/blob/master/Docker-Compose安装与使用.md




    转载本站文章《Docker-compose学习杂记》,
    请注明出处:https://www.zhoulujun.cn/html/tools/Virtual/docker/9481.html