3.1 文件 compose.yaml
文件 compose.yaml
(或者以下任意一种:docker-compose.yaml
, docker-compose.yml
, compose.yml
)是一个主要的配置文件,Docker Compose用它来定义和管理多容器的应用程序。它描述了哪些容器(服务)需要运行、它们如何互相交互以及它们需要的资源。
为了统一,这节课我们会用compose.yaml
这个版本,因为它是现代版本Docker Compose推荐的格式。
文件 compose.yaml
的结构
文件 compose.yaml
包含多个部分,每个部分描述应用程序配置的不同方面。主要的部分包括:
- version: 指定Compose文件的版本(比如
'3.9'
)。 - services: 描述容器(服务)的设置和依赖关系。
- volumes: 定义容器和主机之间共享数据的存储卷。
- networks: 配置服务之间通信的网络。
3.2 基本指令
1. version
version指令定义了文件compose.yaml
中使用的Docker Compose语法版本。截至本文撰写时,最流行的是版本3,特别是更新的3.8和3.9。
version: '3.9'
2. services
services部分定义了Compose需要创建和运行的容器。每个service代表一个单独的容器,并具有特定的配置。
示例:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
在此示例中,定义了两个服务:web
和db
。web
服务使用nginx:latest
镜像并打开端口80。db
服务使用mongo:latest
镜像并连接一个用于存储数据的卷。
3. volumes
volumes部分用于定义可以连接到容器的数据卷。这对于在容器重新启动时保存数据非常有用。
示例:
volumes:
mongo-data:
4. networks
networks部分允许定义容器所属的自定义网络。这确保了隔离性以及网络连接的设置。如果未指定网络,Docker Compose将创建一个默认网络,所有服务都会连接到该网络。
示例:
networks:
front-end:
back-end:
3.3 配置服务的指令
配置服务的主要指令:
1. image
指令 image 指定用于创建容器的镜像。
示例:
services:
web:
image: nginx:latest
2. build
指令 build 用于指定 Dockerfile 的路径,用于构建镜像。
示例:
services:
app:
build: ./app
3. ports
指令 ports 定义主机与容器之间的端口映射。
示例:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
指令 volumes 将卷挂载到容器中,允许在容器重启之间保留数据。
示例:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
指令 environment 为容器设置环境变量。
示例:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
指令 depends_on 指出该服务依赖于其他服务,并应在它们之后启动。
重要!
启动服务时,不能100%保证所有必需的服务完全准备好。它们会启动——没错,但后续的运行稳定性不一定得到保证。这个问题可以通过 health-check 解决,但我们稍后会谈到。
示例:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
指令 command 允许覆盖容器启动时执行的命令。
示例:
services:
app:
image: myapp:latest
command: python app.py
8. networks
指令 networks 将服务连接到一个或多个网络。
示例:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 完整示例
完整的 compose.yaml
文件示例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
在这个示例中:
- 定义了三个服务:
web
、app
和db
。 -
web
使用 Nginx 镜像,挂载配置文件,并依赖于服务app
。 -
app
从本地 Dockerfile 构建,挂载应用程序源代码,并使用环境变量。 -
db
使用 MongoDB 镜像,并挂载一个用来存储数据的卷。 - 创建了两个卷和两个网络,用于隔离和管理服务之间的交互。
注意:一个卷是 mongo-data
,另一个是从主机机器挂载的目录(例如 ./app
)。
GO TO FULL VERSION