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

【Docker 08】Compose - 容器编排

🌈 一、Docker Compose 介绍

⭐ 1. Docker Compose 是什么

  • Docker Compose 是由 Docker 官方提供的一个用于定义和运行多容器应用的工具,它让用户可以通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用所需要的服务(如 Web 服务、数据库、缓存等),然后使用一条命令就可以启动整个应用栈。
  • 在 docker-compose 中,有以下两个非常重要的概念:
    1. 服务 service:由若干相同镜像容器组成的应用。
    2. 项目 project:由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义,整个 docker-compose.yml 定义一个项目。

⭐ 2. Docker Compose 的必要性

  • Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一个进程。
  • 假设当前要启动一个应用,它涉及到了 MySQL 和 Nginx,需要分别为应用、MySQL 和 Nginx 创建单独的 Docker 容器,然后将这些容器运行起来。当构建好 Docker 之后,每次启动这个应用都至少需要 docker run 三次,未免也太过繁琐。且这些容器都是分散独立的,也不方便镜像管理。
  • 此时就引入了 Docker Compose 来将那些为同一个应用服务的容器整合起来,方便进行管理。

Docker Compose 主要优势

  • 简化控制:Docker Compose 允许用户在单个 YAML 文件中定义和管理多容器应用程序。简化了编排和协调各种服务的复杂任务,从而更轻松地管理和复制用户的应用程序环境。
  • 高效协作:Docker Compose 的配置文件易于共享,促进了开发、运营、测试等项目相关者之间的协作。
  • 快速应用程序开发:Docker Compose 会缓存用于创建容器的配置。当重新启动未更改的服务时,Docker Compose 会重新使用现有容器。重复使用容器意味着可以非常快速的更改环境。
  • 跨环境的可移植性:Docker Compose 支持 Compose 文件中的变量,可以使用这些变量为不同的环境或不同的用户自定义合成。

⭐ 3. Docker Compose 的功能

  • Docker Compose 可以管理应用程序的整个生命周期。
功能分类具体内容示例命令
服务编排使用 docker-compose.yml 文件定义多个服务docker compose up
自动构建镜像可以自动根据 Dockerfile 文件构建镜像docker compose build
一键启动于停止一条命令就可以 启动 / 停止 整个应用docker compose up / down
服务依赖管理通过 depends_on 来定义服务之间的依赖关系depends_on: [db]
网络自动管理默认为服务创建隔离的虚拟网络,也支持自定义网络networks:
数据卷管理自动创建、挂载卷,实现数据持久化volumes:
日志集中查看查看所有服务容器的日志输出docker compose logs
配置参数统一管理可以使用 .env 文件来定义环境变量.env 文件 + %{VAR} 语法

⭐ 4. Docker Compose 的使用场景

  1. 本地开发环境构建:用于本地构建一个由多个服务组成的项目(如 Web + 数据库 + 缓存),通过一个 docker-compose.yml 文件可以一键启动所有组件,避免环境配置混乱。
  2. 多环境配置管理:结合多个 Compose 文件或环境变量管理不同部署环境下的配置,可以避免重复配置和代码污染,提升部署灵活性。
  3. 数据库备份 / 恢复演练:搭建一个隔离的数据库环境进行数据恢复、备份策略测试或异常演练,不会影响正式环境。

🌈 二、Docker Compose 文件

  • Docker Compose 可以通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用所需要的服务。

⭐ 1. 文件语法版本

  • 当前官方支持 3 个大版本(version1、version2、version3),其中的 version1 已经被废弃。
  • 建议始终使用 Docker 官方文档推荐的最新版语法,以获得最大兼容性和功能支持。
Compose 版本对应字段写法支持的最低 Docker Engine 版本说明
1不写 version 字段< 1.10功能有限,已废弃
2version: ‘2’1.10+引入了 depends_on 等基本功能
2.1 ~ 2.4version: ‘2.x’1.12 ~ 17.12增强了 healthcheck、资源限制等
3version: ‘3’1.13+为 Swarm 服务模式涉及
3.1 ~ 3.9version: ‘3.x’17.01 ~ 20.10添加 secrets、configs、runtime
3.8version: ‘3.8’19.03+最常用的稳定版本
3.9version: ‘3.9’20.10+最新 v3 版本,新增 profiles

⭐ 2. 文件基本结构

  • 一个标准的 docker-compose.yml 文件主要包括以下几个顶层字段(提示:xxx 仅作为占位,需根据具体服务进行填写)。
version: '3.8'           # 指定语法版本
services:                # 服务定义块(核心),可以存在多个servicename:           # 服务名称,内部 bridge 网络下可作为 DNS 名称image:        xxx    # 必选,镜像的名字command:      xxx    # 可选,覆盖默认镜像里的 CMD 命令environment:  xxx    # 可选,设置环境变量,等价于 docker run 的 --envvolumes:      xxx    # 可选,挂载数据卷,等价于 docker run 的 -vnetworks:     xxx    # 可选,加入的网络,等价于 docker run 的 --networkports:        xxx    # 可选,端口映射,等价于 docker run 的 -pexpose:       xxx    # 可选,仅声明容器暴露的端口,等价于 --exposedepends_on:   xxx    # 可选,设置服务间的依赖顺序,类似于 --linkrestart:      xxx    # 可选,容器重启策略,等价于 --restartbuild:        xxx    # 可选,构建镜像路径,等价于 docker build 的 -fservicename2:# ...servicename3:# ...
volumes:                # 可选,数据卷定义块,等价于 docker volume create# volume_name:#   driver: xxx
networks:               # 可选,网络定义块,等价于 docker network create# network_name:#   driver: bridge

⭐ 3. 常见字段格式语法

🌙 3.1 image

  • 用于指定容器运行的镜像,以下格式都可以:
image: image_name                                 # 镜像名(默认最新版本)
image: image_name:tag                             # 镜像 + 标签(版本号)
image: image_name@sha256:digest                   # 镜像 + 摘要哈希
image: namespace/image_name                       # 指定命名空间镜像
image: registry_host:port/namespace/image_name    # 私有仓库中的镜像

🌙 3.2 command

  • 用于覆盖镜像默认的启动命令,以下格式都可以:
command: "executable param1 param2"               # 字符串形式命令
command: ["executable", "param1", "param2"]       # 列表形式命令(推荐)

🌙 3.3 entrypoint

  • 用于覆盖容器默认的 entrypoint,以下格式都可以:
entrypoint: "/entry.sh"                           # 字符串形式入口点
entrypoint: ["sh", "/entry.sh"]                   # 列表形式入口点(推荐)

🌙 3.4 environment

  • 用于设置容器的环境变量,以下格式都可以:
environment:- VAR_NAME=value                                # 字符串列表格式- VAR_NAME                                      # 从宿主环境继承变量environment:VAR_NAME: value                                 # 映射格式(推荐使用)ANOTHER_VAR: "true"

🌙 3.5 networks

  • 指定容器运行的网络,可用于服务发现,以下格式都可以:
networks:- network_name                                   # 加入已有网络(简写形式)networks:custom_net:aliases:- service_alias                              # 在网络中定义别名

🌙 3.6 volumes

  • 用于将宿主机的存储卷 / 文件挂载到容器中:
volumes:- host_path:container_path                       # 将宿主机路径挂载到容器中- volume_name:container_path                     # 使用命名卷挂载数据- container_path                                 # 创建匿名卷并挂载到容器路径- type: volume|bind                              # 指定挂载类型(volume 或 bind)source: volume_name_or_host_path               # 数据来源(卷名或宿主路径)target: container_path                         # 容器内的目标挂载路径read_only: true|false                          # 是否只读挂载

🌙 3.7 ports

  • 用于配置宿主机和容器之间的端口映射:
ports:- "host_port:container_port"                     # 宿主端口映射到容器端口- "host_ip:host_port:container_port"             # 限定绑定主机 IP- "container_port"                               # 随机分配宿主机端口映射容器端口- target: container_port                         # 容器暴露端口(Swarm 专用格式)published: host_port                           # 映射到宿主机的端口protocol: tcp|udp                              # 协议类型mode: ingress|host                             # 发布模式(负载均衡或主机直连)

🌙 3.8 expose

  • 用于暴露容器端口,仅在网络中可访问:
expose:- container_port                                 # 向同一网络中的容器暴露端口- another_container_port                         # 不对主机暴露,仅内部访问

🌙 3.9 build

  • 用于从源码构建镜像,以下几种格式都可以:
build: context_path                                # 简写,指定构建上下文路径build:context: context_path                            # 构建上下文路径(目录)dockerfile: Dockerfile_name                      # Dockerfile 文件名(默认是 Dockerfile)args:                                            # 构建时传入的参数(ARG)ARG_NAME: valuetarget: build_stage_name                         # 多阶段构建时的目标阶段cache_from:- image_name:tag                               # 用于加速构建的缓存镜像来源

🌙 3.10 depends_on

  • 用于声明依赖服务的启动顺序(仅控制启动顺序,不保证服务已就绪):
depends_on:- service_a                                      # 当前服务依赖 service_a 启动- service_b                                      # 当前服务依赖 service_b 启动

🌙 3.11 env_file

  • 用于引入 .env 文件来设置环境变量:
env_file:- .env                                           # 默认环境文件,当前路径- config/dev.env                                 # 自定义路径下的 .env 文件

🌈 三、Docker Compose 命令

⭐ 1. 命令清单

命令功能
01docker compose build构建服务所需要的镜像
02docker compose config检查 docker-compose.yml 文件格式是否正确,并以规范的格式来显示配置
03docker compose cp在本地系统和服务容器之间拷贝文件
04docker compose create创建服务的容器,但不启动它们
05docker compose up构建,(重新)创建,启动,链接一个服务相关的容器
06docker compose down停止所有容器,并删除容器、网络、卷等资源
07docker compose exec在运行中的容器内执行命令
08docker compose images列出所有容器当前使用的镜像
09docker compose kill强制停止服务的容器
10docker compose logs查看服务容器输出的日志
11docker compose ls显示当前主机上的所有 Compose 项目
12docker compose pause暂停服务容器
13docker compose unpause恢复被暂停的服务容器
14docker compose ps列出当前项目中运行的所有容器
15docker compose pull从远程仓库拉取服务镜像
16docker compose push推送服务镜像到远程仓库
17docker compose restart重启 / 重启某个服务
18docker compose rm删除服务停止的容器
19docker compose run在指定服务容器上执行相关的命令(一次性)
20docker compose start启动当前停止的某个容器
21docker compose stop停止当前运行的某个容器
22docker compose top显示服务容器中运行的进程
23docker compose port列出所有的服务端口映射
24docker compose events从服务获取实时事件
25docker compose version查看 Compose 版本信息

⭐ 2. 命令通用格式

  • 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或容器。
    • 如果没有特别说明,命令对象默认是项目,这意味着项目中所有的服务都会受到命令影响。
  • Docker Compose 命令的基本使用格式如下:
docker compose [options] command [args...]
options 的常见选项说明
-f 或 --file指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定
-p 或 --project-name指定项目名称,默认将所在目录的目录名作为项目名

⭐ 3. docker compose up

  • 该命令用于启动并创建 Compose 文件中定义的所有服务容器。
  • 它会尝试自动完成包括购进啊镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作。

1. 基础语法

docker compose up [options] [service_name...]
options 的可选项功能
-d在后台运行服务容器
--force-recreate强制重新创建容器,不能和 --no-recreate 同时使用
--no-recreate如果容器已经存在,则不重新创建,不能和 --force-recreate 同时存在

2. 使用示例

docker compose up -d web	# 后台启动名为 web 的服务

⭐ 4. docker compose down

  • 用于停止并删除所有 / 指定的服务容器、网络、卷(可选)和镜像(可选),用于彻底清理 Compose 启动的资源。

1. 基础语法

docker compose down [options] [service_name...]
options 的可选项功能
-v 或 --volumes删除所有的目录映射

2. 使用示例

docker compose down -v # 删除所有的服务容器、网络、卷

⭐ 5. docker compose run

  • 临时运行一个服务容器,并在其中执行命令,不影响原有容器的生命周期。

1. 基础语法

docker compose run [options] service_name [command] [args...]
options 的可选项功能
-d在后台运行容器
--name NAME自定义容器名称(默认为 项目_服务_序号)
--entrypoint CMD覆盖默认的容器启动指令
-e KEY=VAL设置环境变量的值
-u 或 --user=""指定运行容器的用户 UID 或 用户名
--rm命令执行完后,自动删除容器
-p 或 --publish=[]将主机端口映射到容器端口,格式为 host_port:container_port

2. 使用示例

docker compose run --rm db sh                    # 临时进入 db 服务执行 sh
docker compose run app npm install               # 对 app 服务执行 npm 安装

🌈 四、Docker Compose 部署 WordPress

⭐ 1. WordPress 介绍

  • WordPress 是一个免费、开源的内容管理系统(CMS),用户可以通过直观的管理页面创建、管理、发布数字内容,主要用于构建和管理网站

WordPress 的核心功能

功能模块说明
文章与页面创建并发布博客文章和页面,支持分类、标签、草稿、发布时间等
插件系统提供扩展功能,例如 SEO 优化、安全防护、缓存、联系表单、电商功能等
主题系统可切换外观风格,支持免费/付费主题,开发者也可自定义开发主题
媒体管理上传和插入图片、视频、PDF 等媒体资源,有图库管理
用户与权限管理支持多个用户角色:管理员、编辑、作者、投稿者、订阅者
评论系统内建文章评论功能,支持反垃圾评论插件如 Akismet
多语言支持支持多语言网站,可配合插件如 Polylang、WPML 构建多语种页面

⭐ 2. WordPress 部署

  1. 编写 Docker Compose:创建一个 docker-compose.yml 文件,内容如下:
version: "3.8"                                     # 指定 Docker Compose 文件语法版本services:                                          # 所有服务容器定义块wordpress:                                       # WordPress 服务(Web前端)image: wordpress                               # 使用官方 WordPress 镜像restart: always                                # 始终重启(容器异常退出时自动恢复)depends_on:                                    # 设置服务依赖关系db:                                          # 依赖名为 db 的服务(MySQL)condition: service_healthy                 # 等待 db 服务变为健康后才启动本服务ports:- 8080:80                                    # 将主机 8080 端口映射到容器 80 端口(HTTP)environment:                                   # 设置环境变量供 WordPress 安装初始化使用WORDPRESS_DB_HOST:     db                    # 数据库主机(服务名)WORDPRESS_DB_USER:     MyWordPressUser       # 数据库用户名WORDPRESS_DB_PASSWORD: MyWordPressPass       # 数据库密码WORDPRESS_DB_NAME:     WordPress             # 要使用的数据库名volumes:- ./WordPress:/var/www/html                  # 映射本地目录到容器网站目录,实现持久化db:                                              # MySQL 服务(数据库)image: mysql:5.7                               # 使用官方 MySQL 5.7 镜像(兼容性良好)restart: always                                # 始终重启(数据库异常后自动恢复)environment:                                   # 设置数据库初始化参数(首次运行有效)MYSQL_DATABASE:      WordPress               # 初始化创建的数据库名MYSQL_USER:          MyWordPressUser         # 自定义数据库用户MYSQL_PASSWORD:      MyWordPressPass         # 数据库用户密码MYSQL_ROOT_PASSWORD: MyRootPass              # 数据库 root 用户密码volumes:- ./MysqlVarLib:/var/lib/mysql               # 映射本地目录到容器数据库目录,实现数据持久化healthcheck:                                   # 健康检查(用于依赖启动判断)test:     mysql -u root -pMyRootPass -e "SELECT 1;" # 测试 MySQL 是否响应查询timeout:  5s                                        # 每次检查最大等待时间retries:  10                                        # 最大重试次数
  1. 让站点在后台运行:
docker compose up -d

image-20250621223242234

  1. 在浏览器内通过访问服务器的 8080 端口来访问容器内的 web 页面。

image-20250621223605257

  1. 配置参数,点击安装:

image-20250621224014197

image-20250621224042749

  1. 使用创建的用户名和密码进行登录:

image-20250621224131772

  1. 进入后台,发布一篇 blog 看看功能是否正常。

image-20250621224828322

  1. 清理资源:先停应用,再停数据库。

image-20250621225210513

http://www.lryc.cn/news/573399.html

相关文章:

  • C#测试调用EPPlus根据批注设置excel单元格内容
  • JavaEE初阶第三期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(一)
  • 【开源项目】当大模型推理遇上“性能刺客”:LMCache 实测手记
  • linux安装minio并使用
  • 在Docker、KVM、K8S常见主要命令以及在Centos7.9中部署的关键步骤学习备存
  • XCUITest + Objective-C 详细示例
  • FastGPT:开启大模型应用新时代(4/6)
  • Springboot 配置 FastJson 替换 Jackson
  • Rabbitmq集成springboot,手动确认消息basicAck、basicNack、basicReject的使用
  • 在 MyBatis 的xml中,什么时候大于号和小于号可以不用转义
  • Axios 在 Vue3 项目中的使用:从安装到组件中的使用
  • 升级到 .NET 9 分步指南
  • “最浅”的陷阱:聊聊二叉树最小深度的递归坑点与解法哲学
  • 秋招Day14 - MySQL - SQL优化
  • c++11标准(5)——并发库(互斥锁)
  • 一、什么是生成式人工智能
  • 终端里的AI黑魔法:OpenCode深度体验与架构揭秘
  • Java ArrayList集合和HashSet集合详解
  • 【论文笔记】【强化微调】TinyLLaVA-Video-R1:小参数模型也能视频推理
  • 人人都是音乐家?腾讯开源音乐生成大模型SongGeneration
  • 旧物回收小程序开发:开启绿色生活新方式
  • Python列表常用操作方法
  • 从语义到推荐:大语言模型(LLM)如何驱动智能选车系统?
  • 首页实现多级缓存
  • AWS-SAA 第二部份:安全性和权限管理
  • 《map和set的使用介绍》
  • Linux TCP/IP协议栈中的TCP输入处理:net/ipv4/tcp_input.c解析
  • TCP 三次握手与四次挥手全流程详解
  • 【智能体】n8n聊天获取链接后爬虫知乎
  • 设计模式精讲 Day 9:装饰器模式(Decorator Pattern)