Fix and improve

This commit is contained in:
Baohua Yang
2026-02-12 16:51:50 -08:00
parent bae82e993a
commit 0835f8467a
100 changed files with 280 additions and 622 deletions

View File

@@ -8,7 +8,7 @@
通过第一部分中的介绍我们知道使用一个 `Dockerfile` 模板文件可以让用户很方便的定义一个单独的应用容器然而在日常工作中经常会碰到需要多个容器相互配合来完成某项任务的情况例如要实现一个 Web 项目除了 Web 服务容器本身往往还需要再加上后端的数据库服务容器甚至还包括负载均衡容器等
`Compose` 恰好满足了这样的需求它允许用户通过一个单独的 `docker-compose.yml` 模板文件YAML 格式来定义一组相关联的应用容器为一个项目project
`Compose` 恰好满足了这样的需求它允许用户通过一个单独的 `compose.yaml`历史默认名也常见为 `docker-compose.yml`模板文件YAML 格式来定义一组相关联的应用容器为一个项目project
### 模板文件规范
@@ -16,13 +16,13 @@ Compose 模板文件采用 YAML 格式,扩展名为 `.yml` 或 `.yaml`。
> **注意** Compose V2 `version` 字段已不再强制要求 Docker Compose v5 规范已完全不需要顶层 `version` 字段为了保持最佳兼容性建议不在新文件中使用该字段
Docker Compose 默认使用 `docker-compose.yml` 作为模板文件
Docker Compose 默认使用 `compose.yaml`也兼容 `compose.yml``docker-compose.yaml``docker-compose.yml` 文件
`Compose` 中有两个重要的概念
* 服务 (`service`)一个应用的容器实际上可以包括若干运行相同镜像的容器实例
* 项目 (`project`)由一组关联的应用容器组成的一个完整业务单元 `docker-compose.yml` 文件中定义
* 项目 (`project`)由一组关联的应用容器组成的一个完整业务单元 Compose 文件中定义
`Compose` 的默认管理对象是项目通过子命令对项目中的一组容器进行便捷地生命周期管理

View File

@@ -12,7 +12,7 @@ Linux 系统请使用以下介绍的方法安装。
### Linux
Linux 你可以通过下载 `docker-compose` 二进制包来安装
Linux 你可以通过下载 Docker Compose CLI 插件二进制文件名为 `docker-compose`来安装
[官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。

View File

@@ -50,14 +50,12 @@ RUN pip install redis flask
CMD ["python", "app.py"]
```
#### docker-compose.yml
#### compose.yaml
编写 `docker-compose.yml` 文件 Compose 使用的主模板文件
编写 `compose.yaml` 文件这是 Compose 推荐使用的主模板文件也兼容 `docker-compose.yml` 等历史文件名
```yaml
services:
web:
build: .
ports:
@@ -139,7 +137,7 @@ $ docker compose start
$ docker compose run web python app.py
```
#### 验证 `docker-compose.yml`
#### 验证 Compose 文件
运行以下命令

View File

@@ -16,7 +16,7 @@ docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
### 命令选项
* `-f, --file FILE` 指定使用的 Compose 模板文件默认 `docker-compose.yml`可以多次指定
* `-f, --file FILE` 指定使用的 Compose 模板文件默认会自动识别 `compose.yaml`也兼容 `docker-compose.yml` 并且可以多次指定
* `-p, --project-name NAME` 指定项目名称默认将使用所在目录名称作为项目名
@@ -264,7 +264,7 @@ $ docker compose scale web=3 db=2
如果使用 `docker compose up -d`将会在后台启动并运行所有的容器一般推荐生产环境下使用该选项
默认情况如果服务容器已经存在`docker compose up` 将会尝试停止容器然后重新创建保持使用 `volumes-from` 挂载的卷以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容如果用户不希望容器被停止并重新创建可以使用 `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>` 来重新创建服务并后台停止旧服务启动新服务并不会影响到其所依赖的服务
选项

View File

@@ -2,11 +2,9 @@
模板文件是使用 `Compose` 的核心涉及到的指令关键字也比较多但大家不用担心这里面大部分指令跟 `docker run` 相关参数的含义都是类似的
默认的模板文件名称为 `docker-compose.yml`格式为 YAML 格式
默认的模板文件名称为 `compose.yaml`也兼容 `docker-compose.yml` 等历史文件名格式为 YAML
```yaml
services:
webapp:
image: examples/web
@@ -18,18 +16,16 @@ services:
注意每个服务都必须通过 `image` 指令指定镜像或 `build` 指令需要 Dockerfile等来自动构建生成镜像
如果使用 `build` 指令 `Dockerfile` 中设置的选项(例如`CMD`, `EXPOSE`, `VOLUME`, `ENV` ) 将会自动被获取无需在 `docker-compose.yml` 中重复设置
如果使用 `build` 指令 `Dockerfile` 中设置的选项例如`CMD``EXPOSE``VOLUME``ENV` 将会自动被获取无需在 Compose 文件中重复设置
下面分别介绍各个指令的用法
### `build`
指定 `Dockerfile` 所在文件夹的路径可以是绝对路径或者相对 docker-compose.yml 文件的路径 `Compose` 将会利用它自动构建这个镜像然后使用这个镜像
指定 `Dockerfile` 所在文件夹的路径可以是绝对路径或者相对 Compose 文件的路径`Compose` 将会利用它自动构建这个镜像然后使用这个镜像
```yaml
services:
webapp:
build: ./dir
```
@@ -41,9 +37,7 @@ services:
使用 `arg` 指令指定构建镜像时的变量
```yaml
services:
webapp:
build:
context: ./dir
@@ -130,8 +124,6 @@ devices:
解决容器的依赖启动先后的问题以下例子中会先启动 `redis` `db` 再启动 `web`
```yaml
services:
web:
build: .
@@ -187,7 +179,7 @@ tmpfs:
从文件中获取环境变量可以为单独的文件路径或列表
如果通过 `docker-compose -f FILE` 方式来指定 Compose 模板文件 `env_file` 中变量的路径会基于模板文件路径
如果通过 `docker compose -f FILE` 方式来指定 Compose 模板文件 `env_file` 中变量的路径会基于模板文件路径
如果有变量名称与 `environment` 指令冲突则按照惯例以后者为准
@@ -246,7 +238,7 @@ expose:
>注意不建议使用该指令
链接到 `docker-compose.yml` 外部的容器甚至并非 `Compose` 管理的外部容器
链接到 Compose 文件外部的容器甚至并非 `Compose` 管理的外部容器
```yaml
external_links:
@@ -475,8 +467,6 @@ volumes:
如果路径为数据卷名称必须在文件中配置数据卷
```yaml
services:
my_src:
image: mysql:8.0
@@ -561,9 +551,9 @@ db:
image: "mongo:${MONGO_VERSION}"
```
如果执行 `MONGO_VERSION=3.2 docker-compose up` 则会启动一个 `mongo:3.2` 镜像的容器如果执行 `MONGO_VERSION=2.8 docker-compose up` 则会启动一个 `mongo:2.8` 镜像的容器
如果执行 `MONGO_VERSION=3.2 docker compose up` 则会启动一个 `mongo:3.2` 镜像的容器如果执行 `MONGO_VERSION=2.8 docker compose up` 则会启动一个 `mongo:2.8` 镜像的容器
若当前目录存在 `.env` 文件执行 `docker-compose` 命令时将从该文件中读取变量
若当前目录存在 `.env` 文件执行 `docker compose` 命令时将从该文件中读取变量
在当前目录新建 `.env` 文件并写入以下内容
@@ -573,7 +563,7 @@ db:
MONGO_VERSION=3.6
```
执行 `docker-compose up` 则会启动一个 `mongo:3.6` 镜像的容器
执行 `docker compose up` 则会启动一个 `mongo:3.6` 镜像的容器
### 参考资料

View File

@@ -42,12 +42,10 @@
$ mkdir django-docker && cd django-docker
```
我们需要创建三个文件`Dockerfile``requirements.txt` `docker-compose.yml`
我们需要创建三个文件`Dockerfile``requirements.txt` `compose.yaml`
### Step 1: 创建 Dockerfile
具体内容如下
```docker
FROM python:3.12-slim
@@ -86,8 +84,6 @@ COPY . /code/
### Step 2: 创建 requirements.txt
具体内容如下
```txt
Django>=5.0,<6.0
psycopg[binary]>=3.1,<4.0
@@ -102,9 +98,9 @@ gunicorn>=21.0,<22.0
| `psycopg[binary]` | PostgreSQL 数据库驱动推荐使用 psycopg 3 |
| `gunicorn` | 生产环境 WSGI 服务器可选开发时可不用 |
### Step 3: 创建 docker-compose.yml
### Step 3: 创建 compose.yaml
Step 3: 创建 docker-compose.yml 配置如下
Step 3: 创建 `compose.yaml` 配置如下
```yaml
services:
@@ -204,7 +200,7 @@ $ docker compose run --rm web django-admin startproject mysite .
```
django-docker/
├── docker-compose.yml
├── compose.yaml
├── Dockerfile
├── requirements.txt
├── manage.py
@@ -317,7 +313,7 @@ $ docker compose logs db
**可能原因**
1. **开发服务器没有自动重载**确保使用 `runserver` 而不是 `gunicorn`
2. **Volume 挂载问题**检查 `docker-compose.yml` 中的 volumes 配置
2. **Volume 挂载问题**检查 `compose.yaml` 中的 volumes 配置
3. **缓存问题**尝试 `docker compose restart web`
#### Q3: 权限问题Linux
@@ -342,10 +338,10 @@ $ sudo chown -R $USER:$USER .
| **Volume** | 挂载代码目录 | 代码直接 COPY 进镜像 |
| **ALLOWED_HOSTS** | `['*']` | 具体域名 |
**生产环境 docker-compose.yml 示例**
**生产环境 Compose 文件示例**
```yaml
## docker-compose.prod.yml
## compose.prod.yaml
services:
web:
@@ -360,7 +356,7 @@ services:
### 延伸阅读
- [Compose 模板文件详解](10.5_compose_file.md)深入理解 docker-compose.yml 的所有配置项
- [Compose 模板文件详解](10.5_compose_file.md)深入理解 Compose 文件的所有配置项
- [使用 WordPress](10.8_wordpress.md)另一个 Compose 实战案例
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)构建更小更安全的镜像
- [数据管理](../08_data_network/README.md)Volume 和数据持久化详解

View File

@@ -6,8 +6,6 @@
### 架构概览
具体内容如下
```
┌─────────────────────────────────────────────────────────────┐
│ Docker Compose 网络 │
@@ -35,12 +33,10 @@
$ mkdir rails-docker && cd rails-docker
```
需要创建三个文件`Dockerfile``Gemfile` `docker-compose.yml`
需要创建三个文件`Dockerfile``Gemfile` `compose.yaml`
### Step 1: 创建 Dockerfile
具体内容如下
```docker
FROM ruby:3.2
@@ -89,9 +85,9 @@ gem 'rails', '~> 7.1'
$ touch Gemfile.lock
```
### Step 3: 创建 docker-compose.yml
### Step 3: 创建 compose.yaml
Step 3: 创建 docker-compose.yml 配置如下
Step 3: 创建 `compose.yaml` 配置如下
```yaml
services:
@@ -147,7 +143,8 @@ $ docker compose run --rm web rails new . --force --database=postgresql --skip-b
$ ls
Dockerfile Gemfile Rakefile config lib tmp
Gemfile.lock README.md app config.ru log vendor
docker-compose.yml bin db public
compose.yaml bin db public
```
> **Linux 用户**如遇权限问题执行 `sudo chown -R $USER:$USER .`

View File

@@ -6,11 +6,9 @@ WordPress 是全球最流行的内容管理系统CMS。使用 Docker Compo
### 项目结构
具体内容如下
```
wordpress/
├── docker-compose.yml
├── compose.yaml
├── .env # 环境变量(敏感信息)
└── nginx/ # 可选:反向代理配置
└── nginx.conf
@@ -18,7 +16,7 @@ wordpress/
---
### 编写 `docker-compose.yml`
### 编写 `compose.yaml`
这是一个生产可用的最小化配置
@@ -79,7 +77,7 @@ networks:
#### 1. 环境变量.env
为了安全不要在 `docker-compose.yml` 中直接写密码创建 `.env` 文件
为了安全不要在 `compose.yaml` 中直接写密码创建 `.env` 文件
```ini
DB_ROOT_PASSWORD=somestrongrootpassword