Docker Compose
Docker Compose介绍
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许你通过一个 YAML 文件来配置应用程序的服务、网络和卷等资源,然后使用简单的命令来启动、停止和管理这些服务。
主要功能:
- 多容器管理:通过一个配置文件定义多个容器及其依赖关系。
- 简化部署:使用
docker-compose up命令一键启动所有服务。 - 环境隔离:可以为不同的环境(如开发、测试、生产)创建不同的配置文件。
- 服务依赖:通过
depends_on配置服务启动顺序。
核心概念:
- services:定义应用程序的各个服务,如 Web 服务器、数据库等。
- build: 指定Dockerfile路径
- image: 使用现有镜像
- ports: 端口映射(HOST:CONTAINER)
- volumes: 数据卷配置
- environment: 环境变量
- networks: 自定义网络
- depends_on: 服务依赖顺序
- networks:定义容器之间的网络连接。
- volumes:定义数据卷,用于持久化数据。
示例:
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DEBUG=1
depends_on:
- redis
redis:
image: redis:alpine
volumes:
- redis_data:/data
volumes:
redis_data:
在这个示例中,定义了一个 Web 服务和一个 Redis 服务,Web 服务依赖于 Redis 服务。
常用命令
docker-compose up -d # 安装并启动服务
docker-compose down # 停止并删除容器
docker-compose start
docker-compose stop
docker-compose build # 重新构建镜像
docker-compose logs -f # 查看日志
docker-compose ps # 查看服务状态
通过 Docker Compose 启动的容器在关闭之后,能够再次使用 Docker Compose 启动这些已关闭的容器
-
如果容器之前是通过
docker compose up启动,之后被关闭,再次使用该命令时,它会检查容器的状态,若容器只是停止状态,会重新启动这些容器;若容器已被删除,则会重新创建并启动容器。 -
docker compose start该命令专门用于启动已经存在但处于停止状态的容器。它不会重新创建容器,只是简单地启动那些之前通过 Docker Compose 创建但当前处于停止状态的容器。
命名
在 Docker Compose 中,当你使用 docker compose up -d 启动服务时,Docker 会自动为每个服务容器生成一个 唯一名称。你看到的 zabbix-zabbix-server-mysql-1 这种格式的名字是由 Docker Compose 自动生成的命名规则决定的。
✅ 容器名后缀 -1 的含义
🧠 简单解释:
这个 -1 是 Docker Compose 自动分配的服务实例编号。
📌 命名规则如下:
<项目名>-<服务名>-<序号>
| 部分 | 含义 |
|---|---|
项目名 |
默认是当前目录名(也可以通过 -p 指定) |
服务名 |
来自 docker-compose.yml 文件中定义的服务名称(如 zabbix-server-mysql) |
序号 |
表示该服务运行了多少个副本(默认从 1 开始) |
所以:
zabbix-zabbix-server-mysql-1→ 项目名为zabbix,服务名为zabbix-server-mysql,第1个实例- 如果你启动了多个副本(例如使用
--scale),就会出现-2,-3等
🔁 示例说明
假设你的目录结构如下:
~/zabbix/
└── docker-compose.yml
你执行命令:
docker compose up -d
Docker Compose 会将项目名设为当前目录名 zabbix,然后根据 docker-compose.yml 创建以下容器:
| 服务名 | 容器名 |
|---|---|
| zabbix-server-mysql | zabbix-zabbix-server-mysql-1 |
| zabbix-web-nginx-mysql | zabbix-zabbix-web-nginx-mysql-1 |
| zabbix-agent | zabbix-zabbix-agent-1 |
💡 可以手动控制容器名称吗?
可以!你可以通过 container_name 字段显式指定容器名:
zabbix-server-mysql:
image: zabbix/zabbix-server-mysql:centos-6.4.0
container_name: zabbix-server
restart: always
...
这样它的名字就是 zabbix-server,不会带 -1。
但注意:使用 container_name 后就不能再用 scale 扩展该服务,因为名字必须唯一。
🚫 注意事项
- 如果你多次执行
docker compose down && docker compose up -d,旧容器会被删除,新容器仍会使用-1。 - 如果你想运行多个相同服务(比如测试集群),可以使用
--scale,它会创建-2,-3等。
🧾 总结
| 问题 | 解释 |
|---|---|
为什么有 -1? |
Docker Compose 自动给服务实例添加的编号 |
| 能不能去掉? | 可以,使用 container_name 显式命名 |
| 多实例怎么办? | 使用 --scale 或 deploy.replicas(适用于 Swarm 模式) |

浙公网安备 33010602011771号