欢迎光临
我们一直在努力

Docker多容器编排:Compose 实战教程

文章目录

  • 概念简述
  • 配置文件格式
  • 参数详解
  • docker compose指令
  • 综合案例

概念简述

核心定义

  Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用一个单独的配置文件(通常是 .yml 格式)来配置应用程序的所有服务、网络和卷,然后通过一条简单的命令就能创建和启动所有服务。 可以把它想象成一个自动化脚本或编排工具,专门用于在单台主机上部署由多个容器组成的应用。


为什么要使用 Docker Compose?解决什么问题?

在理解 Compose 之前,先想想如果不用它,会多麻烦: 假设应用由以下服务组成:Web 应用、Redis 缓存服务、MySQL 数据库服务,如果没有 Docker Compose,你需要手动完成以下步骤:

  • 创建一个 Docker 网络让容器可以通信。
  • 单独启动 MySQL 容器,并指定网络、卷、环境变量等。
  • 单独启动 Redis 容器,并指定网络、环境变量等。
  • 构建你的 Web 应用的镜像。
  • 启动 Web 应用容器,并链接到之前创建的网络,设置环境变量指向 Redis 和 PostgreSQL 的容器名。
  • 你需要记住并输入一大堆 docker run 命令,这个过程非常繁琐且容易出错。

    Docker Compose 解决了这个问题:

    • 简化流程:用一个文件(docker-compose.yml)描述整个应用栈的架构。
    • 一键操作:通过一条命令(docker compose up)就能同时创建、启动所有服务,并处理好它们之间的依赖关系。
    • 配置即代码:将你的应用基础设施(服务、网络、存储)用配置文件管理起来,可以纳入版本控制系统,方便协作和追溯。

    核心概念与工作流程

  • 定义 docker-compose.yml 文件: 这是 Docker Compose 的核心。你在这个 YAML 文件中定义你的应用所需的服务、网络和卷。

    • 服务:对应一个容器。你可以指定使用哪个镜像、暴露哪些端口、挂载哪些卷、设置哪些环境变量、依赖哪些其他服务等。
    • 网络:定义容器之间通信的网络。
    • 卷:定义持久化数据存储的位置。
  • 执行 docker compose up 命令: 在包含 docker-compose.yml 文件的目录下运行此命令。Compose 会:

    • 自动构建或拉取所需的镜像。
    • 按依赖顺序创建并启动所有定义的服务。
    • 将所有服务的日志输出聚合到一个流中,方便查看。
  • 执行 docker compose down 命令: 当你想要停止并清理整个应用时,运行此命令。它会停止所有容器,并删除创建的容器和网络(默认情况下不删除卷)。


  • 总结:Docker Compose 的优点

  • 隔离环境:整个应用栈与主机环境完全隔离。
  • 极简配置:一个命令替代了大量复杂的 docker run 命令。
  • 快速部署:极大地简化了多容器应用的部署和测试流程,是开发、测试和 CI/CD 环境的理想选择。
  • 服务发现:自动在服务之间创建网络,并通过服务名进行DNS解析,使容器间通信变得非常简单。
  • 注意:Docker Compose 通常用于开发、测试和单机部署。对于生产环境中跨多台主机的集群管理和编排,更强大的工具如 Kubernetes 或 Docker Swarm 更为合适。不过,Compose 文件可以作为学习这些更复杂工具的基础。

    配置文件格式

    version:指定Docker Compose文件的版本格式,不同版本支持的功能和语法有所不同,高版本兼容低版本 services: 服务,可以存在多个  servicename: 服务名字,它也是内部bridge网络可以使用的DNS name,如果不是集群模式相当于docker run的时候指定的一个名称,集群(Swarm)模式是多个容器的逻辑抽象   image: 镜像的名字(必选)   command: 如果设置,则会覆盖默认镜像里的CMD命令   environment: 等价于docker container run里的–env选项,设置环境变量   volumes: 等价于docker container run里的-v选项,绑定数据卷   networks: 等价于docker container run里的–network选项,指定网络   ports: 等价于docker container run里的-p选项,指定端口映射   expose: 可选,指定容器暴露的端口   build: 构建目录   depends_on: 服务依赖配置   env_file: 环境变量文件  servicename2:   image:   command:   networks:   ports:  servicename3: #… volumes: # 可选,等价于 docker volume create networks: # 可选,等价于 docker network create

    参数详解

    准备这样一个目录结构:

    mycompose/
    ├── prj1
    │ └── docker-compose.yml
    ├── prj2
    │ └── docker-compose.yml
    └── prj3
    └── docker-compose.yml
    ......

    image 功能:指定容器镜像 示例:

  • 创建prj1目录:
    • mkdir prj1
  • 在prj1中创建文件docker-compose.yml
    • cd prj1
    • touch docker-compose.yml
  • 编辑docker-compose文件
    • vim docker-compose.yml
    • services:
      web:
      image: nginx:1.24.0
  • 启动配置
    • docker compose up
  • 清除容器
    • docker compose down
  • 在这里插入图片描述

    接下来就不再详细展示每个步骤,重点讲解第3步文件的配置。 command 功能:覆盖容器启动的默认指令 格式:

    command: ["bundle", "exec", "thin", "-p", "3000"]
    //或
    command: bundle exec thin p 3000

    示例:

    serveices:
    web:
    image: nginx:1.24.0
    command: bundle exec thin p 3000

    这些内容都写在配置文件docker-compose.yml里面 在这里插入图片描述 entrypoint 功能:覆盖容器默认的 entrypoint。 格式:

    entrypoint: /code/entrypoint.sh

    也可以是列表格式:

    entrypoint:
    php
    d
    zend_extension=/usr/local/lib/php/extensions/nodebugnonzts20100525/xdebug.so
    d
    memory_limit=1
    vendor/bin/phpunit

    示例:

    services:
    web:
    image: nginx:1.24.0
    entrypoint:
    tail
    f
    /etc/osrelease

    environment environment 功能:   添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。 格式:

    # map 格式
    environment:
    RACK_ENV: development
    SHOW: "true"
    USER_INPUT:

    # 数组格式
    environment:
    RACK_ENV=development
    SHOW=true
    USER_INPUT=

    示例:

    services:
    web:
    image: nginx:1.24.0
    environment:
    TEST: 1

    在这里插入图片描述 networks 功能:配置容器网络 示例:

    services:
    web:
    image: nginx:1.24.0
    networks:
    web1
    web2

    networks:
    web1:
    web2:

    在这里插入图片描述 volume 功能:配置容器的存储卷

    #短语法
    volumes:
    "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
    "/localhost/data:/var/lib/postgresql/data"
    #完整语法
    volumes:
    #命名卷
    type: volume
    source: dbdata
    target: /data
    volume:
    nocopy: true
    #绑定卷
    type: bind
    source: /var/run/postgres/postgres.sock
    target: /var/run/postgres/postgres.sock

    示例:

    services:
    web:
    image: nginx:1.24.0
    volumes:
    /home/qsy/gitDocker/data/myvolumes:/usr/share/nginx/html/

    ports 功能:配置容器的端口映射

    #完整语法
    ports:
    target: 80
    host_ip: 127.0.0.1
    published: 8080
    protocol: tcp
    mode: host
    target: 80
    host_ip: 127.0.0.1
    #短语法
    ports:
    "3000"
    "3000-3005"
    "8000:8000"
    "9090-9091:8080-8081"
    "49100:22"
    "127.0.0.1:8001:8001"
    "127.0.0.1:5000-5010:5000-5010"
    "6060:6060/udp"

    示例:

    services:
    web:
    image: nginx:1.24.0
    ports:
    7070:80

    expose 功能:暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数. 格式/示例:

    expose:
    "3000"
    "8000"

    depends_on 功能:设置依赖关系

    • docker compose up:以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis,才会启动 web。
    • docker compose up SERVICE:自动包含 SERVICE 的依赖项。在以下示例中,docker compose up web 还将创建并启动 db 和 redis。
    • docker compose stop:按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。

    version: "3.7"
    services:
    web:
    build: .
    depends_on:
    db
    redis
    redis:
    image: redis
    db:
    image: postgres

    env_file 从文件添加环境变量。可以是单个值或列表的多个值。

    env_file: xxx.env

    也可以是列表格式:

    env_file:
    ./.env
    ./apps/web.env
    /opt/secrets.env

    docker compose指令

    docker compose 指令与容器操作相似,只不过把容器改成了服务 命令格式: docker-compose 命令的基本的使用格式为

    docker compose [OPTIONS] COMMAND [ARGS...]

    命令清单:

    • docker compose build – 构建服务
    • docker compose config – 以规范格式显示服务配置
    • docker compose cp – 在本地系统和服务容器之间拷贝文件
    • docker compose create – 创建服务的容器
    • docker compose down – 停止所有容器并删除容器
    • docker compose events – 从服务器获取实时事件
    • docker compose exec – 在容器中执行命令
    • docker compose images – 列出所有容器使用的镜像
    • docker compose kill – 强制停止服务的容器
    • docker compose logs – 显示容器日志
    • docker compose ls – 显示所有项目
    • docker compose pause – 暂停服务
    • docker compose port – 列出所有的端口映射
    • docker compose ps – 列出项目中目前的所有容器
    • docker compose pull – 拉取服务镜像
    • docker compose push – 推送服务镜像
    • docker compose restart – 重启服务
    • docker compose rm – 删除已停止的服务容器
    • docker compose run – 在指定服务容器上执行命令
    • docker compose start – 启动当前停止的容器
    • docker compose stop – 停止当前运行的容器
    • docker compose top – 显示运行的进程
    • docker compose unpause – 恢复服务
    • docker compose up – 构建、创建、启动和链接服务相关的容器(支持 –no-recreate 参数避免重新创建,-d 后台运行)
    • docker compose version – 查看版本信息

    用法和功能与容器的相关指令类似,只是docker compose的操作对象是服务而已。 参考文章:Docker容器核心指令 关键命令选项 up 功能:   该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。 语法:

    docker compose up [options] [service...]

    选项说明:

    • -d 在后台运行服务器,推荐在生产环境下使用该选项
    • –force-recreate 强制重新创建容器,不能与 –no-recreate 同时使用
    • –no-recreate 如果容器已经存在了,则不重新创建,不能与 –force-recreate 同时使用

    down 功能:停止所有容器,并删除容器和网络。 语法:

    docker compose down [options] [SERVICE...]

    选项说明:

    • -v, –volumes:删除容器同时删除目录映射。

    run 功能:该命令可以在指定服务器上执行相关的命令 语法:

    # 例如:启动一个 ubuntu 服务容器,并执行 ping docker.com 命令
    # docker compose run ubuntu ping docker.com
    docker compose run [options] SERVICE [COMMAND] [ARGS...]

    与docker run的区别,该指令是用服务启动容器,而不是镜像 选项说明:

    • -d 后台运行容器
    • –name NAME 为容器指定一个名字
    • –entrypoint CMD 覆盖默认的容器启动指令
    • -e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量
    • -u, –user="" 指定运行容器的用户名或者 uid
    • –rm 运行命令后自动删除容器
    • -p, –publish=[] 映射容器端口到本地主机

    示例: 在这里插入图片描述

    综合案例

    docker-compose.yml配置 在这里插入图片描述 启动,会先启动依赖的服务。 在这里插入图片描述 清理,与启动相反,先清理主要的服务,然后清理依赖的服务。 在这里插入图片描述

    非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » Docker多容器编排:Compose 实战教程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址