目录
基本结构
version: '3' # Docker Compose 文件的版本
services: # 定义服务
service_name:
image: image_name:tag # 使用的镜像和标签
build: . # 构建镜像的上下文目录
ports:
- "host_port:container_port" # 主机端口和容器端口的映射
volumes:
- ./local_path:/container_path # 主机目录和容器目录的挂载
environment:
- ENV_VAR_NAME=value # 设置环境变量
networks:
- network_name # 网络配置
depends_on:
- other_service # 依赖于其他服务
restart: always # 容器重启策略
command: command_to_run # 容器启动时运行的命令
volumes: # 定义数据卷
volume_name:
networks: # 定义网络
network_name:
配置示例
以下是一个包含常见配置的完整示例 docker-compose.yml
文件:
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydatabase
volumes:
- db_data:/var/lib/mysql
networks:
- webnet
redis:
image: redis:latest
networks:
- webnet
volumes:
db_data:
networks:
webnet:
主要配置选项说明
-
version
: 定义 Docker Compose 文件的版本。通常使用3
或3.x
版本。 -
services
: 定义所有服务。每个服务都可以有以下配置:image
: 指定要使用的 Docker 镜像。build
: 指定 Dockerfile 的上下文路径,如果需要构建镜像。ports
: 映射主机和容器的端口。volumes
: 挂载主机和容器的目录或数据卷。environment
: 设置环境变量。networks
: 连接到一个或多个网络。depends_on
: 指定依赖关系,确保服务启动顺序。restart
: 容器的重启策略。command
: 覆盖容器启动时的默认命令。
-
volumes
: 定义数据卷,用于持久化数据。 -
networks
: 定义网络,服务可以在这些网络中进行通信。
文件结构和主要配置项
1. version
- 说明: 指定 Docker Compose 文件的版本。
- 示例:
version: '3'
- 作用: 不同版本可能支持不同的功能,选择合适的版本可以确保与 Docker Engine 的兼容性。
2. services
-
说明: 定义一个或多个服务,每个服务对应一个 Docker 容器。
-
结构:
services: service_name: image: image_name:tag build: . ports: - "host_port:container_port" volumes: - ./local_path:/container_path environment: - ENV_VAR_NAME=value networks: - network_name depends_on: - other_service restart: always command: command_to_run
-
常见配置项:
image
: 使用的 Docker 镜像及其标签。示例:nginx:latest
。build
: 指定 Dockerfile 的上下文路径。如果不指定镜像而提供构建上下文,则会根据 Dockerfile 构建镜像。示例:build: .
表示当前目录。ports
: 端口映射,将主机的端口映射到容器的端口。示例:- "80:80"
。volumes
: 挂载目录或数据卷。示例:- ./data:/data
将主机的./data
目录挂载到容器的/data
目录。container_name:
是一个用来指定容器名称的字段。它的作用是为通过 Docker Compose 启动的容器指定一个自定义的名称,而不是让 Docker 自动分配一个名称。environment
: 设置环境变量。示例:- ENV_VAR_NAME=value
。networks
: 指定容器连接到的网络。示例:- webnet
。depends_on
: 指定服务之间的依赖关系,确保启动顺序。示例:- db
。restart
: 定义容器的重启策略。选项包括no
、always
、unless-stopped
、on-failure
。示例:restart: always
。command
: 启动容器时运行的命令。如果指定,覆盖 Dockerfile 中的默认命令。示例:command: ["python", "app.py"]
。
3. volumes
- 说明: 定义 Docker 卷,用于持久化和共享数据。
- 示例:
volumes: db_data:
- 作用: 数据卷可以跨容器共享,并在容器重启或删除后保持数据。
4. networks
- 说明: 定义网络,服务可以在这些网络中进行通信。
- 示例:
networks: webnet:
- 作用: 创建自定义网络可以帮助服务之间进行隔离和通信。
总结
docker-compose.yml
文件的配置项帮助我们定义和管理多容器应用程序的各个方面。通过以下方式进行管理:
- 版本 (
version
): 确保 Docker Compose 文件的兼容性。 - 服务 (
services
): 定义和配置容器服务,包括镜像、端口、卷、环境变量等。 - 数据卷 (
volumes
): 提供持久化存储,确保数据在容器之间共享和保留。 - 网络 (
networks
): 定义容器的网络配置,允许容器之间的通信和隔离。
知识点扩展:
在 docker-compose.yml
文件中,volumes
和 volumes
块(或 volumes:
)之间有一些区别:
1. volumes
字段:
在 service
的定义中,可以直接指定一个 volumes
字段来指定挂载的卷。例如:
version: '3'
services:
web:
image: nginx
volumes:
- /path/on/host:/path/in/container
这里的 volumes
字段直接将 /path/on/host
挂载到了 /path/in/container
。这种方式是最简单和常见的方式来指定挂载卷。
2. volumes
块:
volumes
块通常用于在 docker-compose.yml
文件的顶层定义卷,可以在多个服务之间共享。它的作用是预先声明卷,然后在服务的定义中引用它们。例如:
version: '3'
services:
web:
image: nginx
volumes:
- shared-data:/path/in/container
db:
image: mysql
volumes:
- shared-data:/var/lib/mysql
volumes:
shared-data:
这里的 volumes
块定义了一个名为 shared-data
的卷。在 web
和 db
两个服务的定义中,通过 volumes
字段引用了这个卷。这种方式可以确保多个服务可以访问和共享相同的卷。
volumes
字段 在服务定义中直接指定了挂载的卷,适用于单个服务的简单场景。volumes
块 用于在docker-compose.yml
文件的顶层定义卷,允许多个服务共享相同的卷,提供了更大的灵活性和重用性。