style: apply global formatting fixes (struct, spacing, zhlint)

This commit is contained in:
Baohua Yang
2026-02-21 11:08:52 -08:00
parent ad68b2d973
commit 79ac9c639a
159 changed files with 1708 additions and 882 deletions

View File

@@ -4,11 +4,15 @@
其代码目前在 [https://github.com/docker/compose](https://github.com/docker/compose) 上开源。
`Compose` 定位是 定义和运行多个 Docker 容器的应用Defining and running multi-container Docker applications其前身是开源项目 Fig
`Compose` 定位是 定义和运行多个 Docker 容器的应用 (Defining and running multi-container Docker applications)其前身是开源项目 Fig
通过第一部分中的介绍我们知道使用一个 `Dockerfile` 模板文件可以让用户很方便的定义一个单独的应用容器然而在日常工作中经常会碰到需要多个容器相互配合来完成某项任务的情况例如要实现一个 Web 项目除了 Web 服务容器本身往往还需要再加上后端的数据库服务容器甚至还包括负载均衡容器等
`Compose` 恰好满足了这样的需求它允许用户通过一个单独的 `compose.yaml`历史默认名也常见为 `docker-compose.yml`模板文件YAML 格式来定义一组相关联的应用容器为一个项目project
`Compose` 恰好满足了这样的需求它允许用户通过一个单独的 `compose.yaml` (历史默认名也常见为 `docker-compose.yml`) 模板文件 (YAML 格式) 来定义一组相关联的应用容器为一个项目 (project)
### 概述
总体概述了以下内容
### 模板文件规范

View File

@@ -12,13 +12,13 @@ Linux 系统请使用以下介绍的方法安装。
### Linux
Linux 你可以通过下载 Docker Compose CLI 插件二进制文件名为 `docker-compose`来安装
Linux 你可以通过下载 Docker Compose CLI 插件 (二进制文件名为 `docker-compose`) 来安装
[官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
[官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
> **提示**版本更新较快请访问上述链接获取最新版本号替换下方命令中的版本号
例如 Linux 64 位系统上直接下载对应的二进制包 v5.0.2 为例
例如 Linux 64 位系统上直接下载对应的二进制包 ( v5.0.2 为例)
```bash
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}

View File

@@ -10,7 +10,7 @@
* 项目 (`project`)由一组关联的应用容器组成的一个完整业务单元
可见一个项目可以由多个服务容器关联而成`Compose` 面向项目进行管理
可见一个项目可以由多个服务 (容器) 关联而成`Compose` 面向项目进行管理
### 场景
@@ -52,7 +52,7 @@ CMD ["python", "app.py"]
#### compose.yaml
编写 `compose.yaml` 文件这是 Compose 推荐使用的主模板文件也兼容 `docker-compose.yml` 等历史文件名
编写 `compose.yaml` 文件这是 Compose 推荐使用的主模板文件 (也兼容 `docker-compose.yml` 等历史文件名)
```yaml
services:

View File

@@ -16,7 +16,7 @@ docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
### 命令选项
* `-f, --file FILE` 指定使用的 Compose 模板文件默认会自动识别 `compose.yaml`也兼容 `docker-compose.yml` 并且可以多次指定
* `-f, --file FILE` 指定使用的 Compose 模板文件默认会自动识别 `compose.yaml` (也兼容 `docker-compose.yml` )并且可以多次指定
* `-p, --project-name NAME` 指定项目名称默认将使用所在目录名称作为项目名
@@ -26,11 +26,13 @@ docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
### 命令使用说明
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### `build`
格式为 `docker compose build [options] [SERVICE...]`
构建重新构建项目中的服务容器
构建 (重新构建) 项目中的服务容器
服务容器一旦构建后将会带上一个标记名例如对于 web 项目中的一个 db 容器可能是 web_db
@@ -40,7 +42,7 @@ docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
* `--force-rm` 删除构建过程中的临时容器
* `--no-cache` 构建镜像过程中不使用 cache这将加长构建过程
* `--no-cache` 构建镜像过程中不使用 cache (这将加长构建过程)
* `--pull` 始终尝试通过 pull 来获取更新版本的镜像
@@ -98,9 +100,9 @@ $ docker compose kill -s SIGINT
选项
* `--protocol=proto` 指定端口协议tcp默认值或者 udp
* `--protocol=proto` 指定端口协议tcp (默认值) 或者 udp
* `--index=index` 如果同一服务存在多个容器指定命令对象容器的序号默认为 1
* `--index=index` 如果同一服务存在多个容器指定命令对象容器的序号 (默认为 1)
#### `ps`
@@ -134,13 +136,13 @@ $ docker compose kill -s SIGINT
选项
* `-t, --timeout TIMEOUT` 指定重启前停止容器的超时默认为 10
* `-t, --timeout TIMEOUT` 指定重启前停止容器的超时 (默认为 10 )
#### `rm`
格式为 `docker compose rm [options] [SERVICE...]`
删除所有停止状态的服务容器推荐先执行 `docker compose stop` 命令来停止容器
删除所有 (停止状态的) 服务容器推荐先执行 `docker compose stop` 命令来停止容器
选项
@@ -216,7 +218,7 @@ $ docker compose scale web=3 db=2
将启动 3 个容器运行 web 服务2 个容器运行 db 服务
> **提示**部分版本的 Compose 可能不再提供独立的 `scale` 子命令或不推荐使用此时可使用 `docker compose up` `--scale` 选项达到同样效果
> **提示**部分版本的 Compose 可能不再提供独立的 `scale` 子命令 (或不推荐使用)此时可使用 `docker compose up` `--scale` 选项达到同样效果
>
> ```bash
> $ docker compose up -d --scale web=3 --scale db=2
@@ -226,7 +228,7 @@ $ docker compose scale web=3 db=2
选项
* `-t, --timeout TIMEOUT` 停止容器时候的超时默认为 10
* `-t, --timeout TIMEOUT` 停止容器时候的超时 (默认为 10 )
#### `start`
@@ -242,7 +244,7 @@ $ docker compose scale web=3 db=2
选项
* `-t, --timeout TIMEOUT` 停止容器时候的超时默认为 10
* `-t, --timeout TIMEOUT` 停止容器时候的超时 (默认为 10 )
#### `top`
@@ -258,7 +260,7 @@ $ docker compose scale web=3 db=2
格式为 `docker compose up [options] [SERVICE...]`
该命令十分强大它将尝试自动完成包括构建镜像重新创建服务启动服务并关联服务相关容器的一系列操作
该命令十分强大它将尝试自动完成包括构建镜像(重新) 创建服务启动服务并关联服务相关容器的一系列操作
链接的服务都将会被自动启动除非已经处于运行状态
@@ -270,7 +272,7 @@ $ docker compose scale web=3 db=2
如果使用 `docker compose up -d`将会在后台启动并运行所有的容器一般推荐生产环境下使用该选项
默认情况如果服务容器已经存在`docker compose up` 将会尝试停止容器然后重新创建保持使用 `volumes-from` 挂载的卷以保证新启动的服务匹配 Compose 文件的最新内容如果用户不希望容器被停止并重新创建可以使用 `docker compose up --no-recreate`这样将只会启动处于停止状态的容器而忽略已经运行的服务如果用户只想重新部署某个服务可以使用 `docker compose up --no-deps -d <SERVICE_NAME>` 来重新创建服务并后台停止旧服务启动新服务并不会影响到其所依赖的服务
默认情况如果服务容器已经存在`docker compose up` 将会尝试停止容器然后重新创建 (保持使用 `volumes-from` 挂载的卷)以保证新启动的服务匹配 Compose 文件的最新内容如果用户不希望容器被停止并重新创建可以使用 `docker compose up --no-recreate`这样将只会启动处于停止状态的容器而忽略已经运行的服务如果用户只想重新部署某个服务可以使用 `docker compose up --no-deps -d <SERVICE_NAME>` 来重新创建服务并后台停止旧服务启动新服务并不会影响到其所依赖的服务
选项
@@ -286,7 +288,7 @@ $ docker compose scale web=3 db=2
* `--no-build` 不自动构建缺失的服务镜像
* `-t, --timeout TIMEOUT` 停止容器时候的超时默认为 10
* `-t, --timeout TIMEOUT` 停止容器时候的超时 (默认为 10 )
#### `version`

View File

@@ -2,7 +2,7 @@
模板文件是使用 `Compose` 的核心涉及到的指令关键字也比较多但大家不用担心这里面大部分指令跟 `docker run` 相关参数的含义都是类似的
默认的模板文件名称为 `compose.yaml`也兼容 `docker-compose.yml` 等历史文件名格式为 YAML
默认的模板文件名称为 `compose.yaml` (也兼容 `docker-compose.yml` 等历史文件名)格式为 YAML
```yaml
services:
@@ -14,15 +14,15 @@ services:
- "/data"
```
注意每个服务都必须通过 `image` 指令指定镜像或 `build` 指令需要 Dockerfile等来自动构建生成镜像
注意每个服务都必须通过 `image` 指令指定镜像或 `build` 指令 (需要 Dockerfile) 等来自动构建生成镜像
如果使用 `build` 指令 `Dockerfile` 中设置的选项例如`CMD``EXPOSE``VOLUME``ENV` 将会自动被获取无需在 Compose 文件中重复设置
如果使用 `build` 指令 `Dockerfile` 中设置的选项 (例如`CMD``EXPOSE``VOLUME``ENV` ) 将会自动被获取无需在 Compose 文件中重复设置
下面分别介绍各个指令的用法
### `build`
指定 `Dockerfile` 所在文件夹的路径可以是绝对路径或者相对 Compose 文件的路径`Compose` 将会利用它自动构建这个镜像然后使用这个镜像
指定 `Dockerfile` 所在文件夹的路径 (可以是绝对路径或者相对 Compose 文件的路径)`Compose` 将会利用它自动构建这个镜像然后使用这个镜像
```yaml
services:
@@ -58,7 +58,7 @@ build:
### `cap_add, cap_drop`
指定容器的内核能力capacity分配
指定容器的内核能力 (capacity) 分配
例如让容器拥有所有能力可以指定为
@@ -104,7 +104,7 @@ cgroup_parent: cgroups_1
container_name: docker-web-container
```
>注意: 指定容器名称后该服务将无法进行扩展scale因为 Docker 不允许多个容器具有相同的名称
>注意指定容器名称后该服务将无法进行扩展 (scale)因为 Docker 不允许多个容器具有相同的名称
### `deploy`
@@ -138,7 +138,7 @@ services:
image: postgres
```
>注意`web` 服务不会等待 `redis` `db` 完全启动之后才启动
>注意`web` 服务不会等待 `redis` `db` 完全启动 之后才启动
### `dns`
@@ -216,7 +216,7 @@ environment:
- SESSION_SECRET
```
如果变量名称或者值中用到 `true|falseyes|no` 等表达 [布尔](https://yaml.org/type/bool.html) 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括
如果变量名称或者值中用到 `true|falseyes|no` 等表达[布尔](https://yaml.org/type/bool.html)含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括
```bash
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
@@ -288,7 +288,7 @@ image: a4bc65fd
### `labels`
为容器添加 Docker 元数据metadata信息例如可以为容器添加辅助说明信息
为容器添加 Docker 元数据 (metadata) 信息例如可以为容器添加辅助说明信息
```yaml
labels:
@@ -299,7 +299,7 @@ labels:
### `links`
>注意不推荐使用该指令容器之间应通过 Docker 网络networks进行互联
>注意不推荐使用该指令容器之间应通过 Docker 网络 (networks) 进行互联
### `logging`
@@ -370,7 +370,7 @@ pid: "host"
暴露端口信息
使用宿主端口容器端口 `(HOST:CONTAINER)` 格式或者仅仅指定容器的端口宿主将会随机选择端口都可以
使用宿主端口容器端口 `(HOST:CONTAINER)` 格式或者仅仅指定容器的端口 (宿主将会随机选择端口) 都可以
```yaml
ports:
@@ -407,7 +407,7 @@ secrets:
### `security_opt`
指定容器模板标签label机制的默认属性用户角色类型级别等例如配置标签的用户名和角色名
指定容器模板标签 (label) 机制的默认属性 (用户角色类型级别等)例如配置标签的用户名和角色名
```yaml
security_opt:
@@ -441,7 +441,7 @@ sysctls:
指定容器的 ulimits 限制值
例如指定最大进程数为 65535指定文件句柄数为 20000软限制应用可以随时修改不能超过硬限制 40000系统硬限制只能 root 用户提高
例如指定最大进程数为 65535指定文件句柄数为 20000 (软限制应用可以随时修改不能超过硬限制) 40000 (系统硬限制只能 root 用户提高)
```yaml
ulimits:
@@ -453,7 +453,7 @@ sysctls:
### `volumes`
数据卷所挂载路径设置可以设置为宿主机路径(`HOST:CONTAINER`)或者数据卷名称(`VOLUME:CONTAINER`)并且可以设置访问模式 `HOST:CONTAINER:ro`
数据卷所挂载路径设置可以设置为宿主机路径 (`HOST:CONTAINER`) 或者数据卷名称 (`VOLUME:CONTAINER`)并且可以设置访问模式 (`HOST:CONTAINER:ro`)
该指令中路径支持相对路径

View File

@@ -6,7 +6,7 @@
### 架构概览
在开始之前先看整体架构如图 10-1 所示
在开始之前先看整体架构 (如图 10-1 所示)
```mermaid
flowchart TD
@@ -37,7 +37,7 @@ flowchart TD
- `web` 服务运行 Django 应用对外暴露 8000 端口
- `db` 服务运行 PostgreSQL 数据库只在内部网络可访问
- 两个服务通过 Docker Compose 自动创建的网络相互通信
- `web` 服务可以通过服务名 `db` 访问数据库Docker 内置 DNS
- `web` 服务可以通过服务名 `db` 访问数据库 (Docker 内置 DNS)
### 准备工作
@@ -51,6 +51,8 @@ $ mkdir django-docker && cd django-docker
### 步骤 1创建 Dockerfile
如下代码块所示展示了相关示例
```docker
FROM python:3.12-slim
@@ -89,6 +91,8 @@ COPY . /code/
### 步骤 2创建 requirements.txt
如下代码块所示展示了相关示例
```txt
Django>=5.0,<6.0
psycopg[binary]>=3.1,<4.0
@@ -144,7 +148,7 @@ volumes:
#### db 服务
db 服务 配置如下
db 服务配置如下
```yaml
db:
@@ -164,7 +168,7 @@ db:
#### web 服务
web 服务 配置如下
web 服务配置如下
```yaml
web:
@@ -255,7 +259,7 @@ $ docker compose up
```
你会看到
1. 首先构建 web 镜像第一次运行
1. 首先构建 web 镜像 (第一次运行)
2. 启动 db 服务等待健康检查通过
3. 启动 web 服务
@@ -294,9 +298,11 @@ $ docker compose exec db psql -U django_user -d django_db
### 常见问题排查
#### Q1: 数据库连接失败
本节涵盖了相关内容与详细描述主要探讨以下几个方面
**错误信息**`django.db.utils.OperationalError: could not connect to server`**可能原因与解决方案**
#### Q1数据库连接失败
**错误信息**`django.db.utils.OperationalError: could not connect to server` **可能原因与解决方案**
| 原因 | 解决方案 |
|------|---------|
@@ -311,7 +317,7 @@ $ docker compose ps
$ docker compose logs db
```
#### Q2: 代码修改没有生效
#### Q2代码修改没有生效
**可能原因**
@@ -319,7 +325,7 @@ $ docker compose logs db
2. **Volume 挂载问题**检查 `compose.yaml` 中的 volumes 配置
3. **缓存问题**尝试 `docker compose restart web`
#### Q3: 权限问题Linux
#### Q3权限问题
运行以下命令

View File

@@ -45,6 +45,8 @@ $ mkdir rails-docker && cd rails-docker
### 步骤 1创建 Dockerfile
如下代码块所示展示了相关示例
```docker
FROM ruby:3.2
@@ -143,7 +145,7 @@ $ docker compose run --rm web rails new . --force --database=postgresql --skip-b
- `--rm`执行后删除临时容器
- `--force`覆盖已存在的文件
- `--database=postgresql`配置使用 PostgreSQL
- `--skip-bundle`暂不安装依赖稍后统一安装
- `--skip-bundle`暂不安装依赖 (稍后统一安装)
生成的目录结构
@@ -249,7 +251,9 @@ $ docker compose exec web bash
### 常见问题
#### Q: 数据库连接失败
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q数据库连接失败
检查 `DATABASE_URL` 环境变量格式是否正确确保 db 服务已启动
@@ -258,7 +262,7 @@ $ docker compose ps
$ docker compose logs db
```
#### Q: server.pid 文件导致启动失败
#### Qserver.pid 文件导致启动失败
错误信息`A server is already running`
@@ -268,7 +272,7 @@ $ docker compose logs db
$ docker compose exec web rm -f tmp/pids/server.pid
```
#### Q: Gem 安装失败
#### QGem 安装失败
可能需要更新 bundler 或清理缓存

View File

@@ -1,11 +1,13 @@
## 10.8 实战 WordPress
WordPress 是全球最流行的内容管理系统CMS使用 Docker Compose 可以在几分钟内搭建一个包含数据库Web 服务和持久化存储的生产级 WordPress 环境
WordPress 是全球最流行的内容管理系统 (CMS)使用 Docker Compose 可以在几分钟内搭建一个包含数据库Web 服务和持久化存储的生产级 WordPress 环境
---
### 项目结构
如下代码块所示展示了相关示例
```
wordpress/
├── compose.yaml
@@ -79,7 +81,9 @@ networks:
### 配置文件详解
#### 1. 环境变量.env
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1环境变量 (env)
为了安全不要在 `compose.yaml` 中直接写密码创建 `.env` 文件
@@ -90,15 +94,15 @@ DB_PASSWORD=somestronguserpassword
Compose 会自动读取此同级目录下的文件
#### 2. 数据持久化
#### 2数据持久化
我们定义了两个命名卷
- `db_data`: 确保 MySQL 容器重建后数据不丢失
- `wp_data`: 保存 WordPress 的核心文件插件主题和上传的媒体文件
- `db_data`确保 MySQL 容器重建后数据不丢失
- `wp_data`保存 WordPress 的核心文件插件主题和上传的媒体文件
#### 3. PHP 配置优化
#### 3PHP 配置优化
默认的 WordPress 镜像上传文件限制较小通常 2MB创建 `uploads.ini`
默认的 WordPress 镜像上传文件限制较小 (通常 2MB)创建 `uploads.ini`
```ini
file_uploads = On
@@ -131,7 +135,9 @@ $ docker compose logs -f
### 生产环境最佳实践
#### 1. 数据库备份
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1数据库备份
不要只依赖 Volume建议定期备份数据库
@@ -161,11 +167,11 @@ $ docker exec wordpress_db mysqldump -u wordpress -pwordpress wordpress > backup
- wp_net
```
#### 2. 使用 Nginx 反向代理
#### 2使用 Nginx 反向代理
在生产环境中不要直接暴露 WordPress 端口而是通过 Nginx 进行反向代理并配置 SSL
#### 3. 使用 Redis 缓存
#### 3使用 Redis 缓存
WordPress 支持 Redis 缓存以提高性能
@@ -187,15 +193,17 @@ WordPress 支持 Redis 缓存以提高性能。
### 常见问题
#### Q: 数据库连接错误
本节涵盖了相关内容与详细描述主要探讨以下几个方面
**现象**访问页面显示 "Error establishing a database connection"**排查**
#### Q数据库连接错误
**现象**访问页面显示 Error establishing a database connection**排查**
1. 检查 `docker compose logs wordpress`
2. 确认 `.env` 中的密码与 YAML 文件引用一致
3. 确认 `WORDPRESS_DB_HOST` 也是 `db`服务名
3. 确认 `WORDPRESS_DB_HOST` 也是 `db` (服务名)
4. MySQL 8.0 可能需要几秒钟启动WordPress 会自动重试稍等片刻即可
#### Q: 无法上传大文件
#### Q无法上传大文件
**解决**确保挂载了 `uploads.ini` 配置并且重启了容器
```bash

View File

@@ -1,6 +1,6 @@
# 第十章 Docker Compose
`Docker Compose` Docker 官方编排Orchestration项目之一负责快速的部署分布式应用
`Docker Compose` Docker 官方编排 (Orchestration) 项目之一负责快速的部署分布式应用
本章将介绍 `Compose` 项目情况以及安装和使用