当前位置: 首页 > news >正文

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

文章目录

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

概念简述

核心定义

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


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

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

  1. 创建一个 Docker 网络让容器可以通信。
  2. 单独启动 MySQL 容器,并指定网络、卷、环境变量等。
  3. 单独启动 Redis 容器,并指定网络、环境变量等。
  4. 构建你的 Web 应用的镜像。
  5. 启动 Web 应用容器,并链接到之前创建的网络,设置环境变量指向 Redis 和 PostgreSQL 的容器名。

你需要记住并输入一大堆 docker run 命令,这个过程非常繁琐且容易出错。

Docker Compose 解决了这个问题:

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

核心概念与工作流程

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

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

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


总结:Docker Compose 的优点

  1. 隔离环境:整个应用栈与主机环境完全隔离。
  2. 极简配置:一个命令替代了大量复杂的 docker run 命令。
  3. 快速部署:极大地简化了多容器应用的部署和测试流程,是开发、测试和 CI/CD 环境的理想选择。
  4. 服务发现:自动在服务之间创建网络,并通过服务名进行DNS解析,使容器间通信变得非常简单。

注意:Docker Compose 通常用于开发、测试和单机部署。对于生产环境中跨多台主机的集群管理和编排,更强大的工具如 KubernetesDocker 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
功能:指定容器镜像
示例:

  1. 创建prj1目录:
    • mkdir prj1
  2. 在prj1中创建文件docker-compose.yml
    • cd prj1
    • touch docker-compose.yml
  3. 编辑docker-compose文件
    • vim docker-compose.yml
    •  services: web:image: nginx:1.24.0
      
  4. 启动配置
    • docker compose up
  5. 清除容器
    • docker compose down

在这里插入图片描述

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

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

示例:

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

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

entrypoint: /code/entrypoint.sh

也可以是列表格式:

entrypoint:- php- -d- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so- -d- memory_limit=-1- vendor/bin/phpunit

示例:

services:web:image: nginx:1.24.0entrypoint:- tail- -f- /etc/os-release

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

# map 格式
environment:RACK_ENV: developmentSHOW: "true"USER_INPUT:
# 数组格式
environment:- RACK_ENV=development- SHOW=true- USER_INPUT=

示例:

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

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

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

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

#短语法
volumes:- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"- "/localhost/data:/var/lib/postgresql/data"
#完整语法
volumes:#命名卷- type: volumesource: db-datatarget: /datavolume:nocopy: true#绑定卷- type: bindsource: /var/run/postgres/postgres.socktarget: /var/run/postgres/postgres.sock

示例:

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

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

#完整语法
ports:- target: 80host_ip: 127.0.0.1published: 8080protocol: tcpmode: host- target: 80host_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.0ports:- 7070:80

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

expose:- "3000"- "8000"

depends_on
功能:设置依赖关系

  • docker compose up:以依赖性顺序启动服务。在以下示例中,先启动 dbredis,才会启动 web
  • docker compose up SERVICE:自动包含 SERVICE 的依赖项。在以下示例中,docker compose up web 还将创建并启动 dbredis
  • docker compose stop:按依赖关系顺序停止服务。在以下示例中,webdbredis 之前停止。
version: "3.7"
services:web:build: .depends_on:- db- redisredis:image: redisdb: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配置
在这里插入图片描述
启动,会先启动依赖的服务。
在这里插入图片描述
清理,与启动相反,先清理主要的服务,然后清理依赖的服务。
在这里插入图片描述

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


文章转载自:

http://BxLYCbTG.jmspy.cn
http://qyjCAyHd.jmspy.cn
http://aQEJHINb.jmspy.cn
http://RerJ68MM.jmspy.cn
http://WACBbHli.jmspy.cn
http://wDkxfnrc.jmspy.cn
http://fAQ732cK.jmspy.cn
http://Kuka19Ms.jmspy.cn
http://K0LEOi73.jmspy.cn
http://uSPvQhBf.jmspy.cn
http://GxoZTC6m.jmspy.cn
http://XYzU4Qem.jmspy.cn
http://2LQQOxPs.jmspy.cn
http://2O5gCMxz.jmspy.cn
http://tFj3jXLj.jmspy.cn
http://PSyptbqq.jmspy.cn
http://5zznAhYf.jmspy.cn
http://HUWdZCZS.jmspy.cn
http://KzVdGPPs.jmspy.cn
http://2jF3Pcs2.jmspy.cn
http://81uYKER1.jmspy.cn
http://ZmQ02cQs.jmspy.cn
http://NhZLAEry.jmspy.cn
http://RlsZ9PLg.jmspy.cn
http://7722lEnV.jmspy.cn
http://AnSZZRo8.jmspy.cn
http://X2o4ukxN.jmspy.cn
http://LxrXZbgp.jmspy.cn
http://p6Su95tZ.jmspy.cn
http://Amv9TZL5.jmspy.cn
http://www.dtcms.com/a/387400.html

相关文章:

  • StarRocks 助力数禾科技构建实时数仓:从数据孤岛到智能决策
  • 重构多任务爬虫
  • 语音DDS系统核心组件详解与实现方案
  • 部署CephFS文件存储
  • 元宇宙与物流产业:数字孪生重构物流全链路运营
  • 通信算法之328:Vivado中FIFO的IP核
  • Android MediaCodec 编解码
  • Resolve JSON Reference for ASP.NET backend
  • 十一、vue3后台项目系列——封装请求,存储token,api统一化管理,封装token的处理工具
  • 一个OC的十年老项目刚接手编译报错:No Accounts: Add a new account in Accounts settings.
  • 苹果个人开发者如何实现应用下载安装
  • 【CSS】文档流
  • App 自动化:从环境搭建到问题排查,全方位提升测试效率
  • 微信小程序转uni-app
  • 深入理解线性回归与 Softmax 回归:从理论到实践
  • SSM-----Spring
  • ubuntu 24.04.02安装android-studio
  • WebRTC 定时任务Process Module
  • 【服务器挂掉了】A40和A800:“性能不足”和“系统崩溃”
  • EJS(Embedded JavaScript)(一个基于JavaScript的模板引擎,用于在HTML中嵌入动态内容)
  • 前端路由模式:Vue Router的hash模式和history模式详解
  • 信创电脑采购指南:选型要点与避坑攻略
  • 前端高级开发工程师面试准备一
  • window下Qt设置生成exe应用程序的图标
  • Linux(三) | Vim 编辑器的模式化架构与核心操作机制研究
  • Kubernetes 安全与资源管理:Secrets、资源配额与访问控制实战
  • Java基础知识总结(超详细)持续更新中~
  • 原生js过滤出对象数组中重复id的元素,并将其放置于一个同一个数组中
  • 《Python 对象创建的秘密:从 __new__ 到单例模式的实战演绎》
  • k8s 与 docker 的相同点和区别是什么?