mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-12 21:01:07 +00:00
Fix and improve
This commit is contained in:
@@ -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` 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ Linux 系统请使用以下介绍的方法安装。
|
||||
|
||||
### Linux
|
||||
|
||||
在 Linux 上,你可以通过下载 `docker-compose` 二进制包来安装。
|
||||
在 Linux 上,你可以通过下载 Docker Compose CLI 插件(二进制文件名为 `docker-compose`)来安装。
|
||||
|
||||
从 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
|
||||
|
||||
|
||||
@@ -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 文件
|
||||
|
||||
运行以下命令:
|
||||
|
||||
|
||||
@@ -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>` 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
|
||||
|
||||
选项:
|
||||
|
||||
|
||||
@@ -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` 镜像的容器。
|
||||
|
||||
### 参考资料
|
||||
|
||||
|
||||
@@ -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 和数据持久化详解
|
||||
|
||||
@@ -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 .`
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user