Docker Compose:容器编排利器
使用docker run命令创建容器时,参数可能非常长,跨机器使用时不方便。Docker Compose将这些参数记录在YAML配置文件中,实现"一次编写,到处运行"。
docker-compose.yml文件格式
# docker-compose.yml(注意文件名必须小写)
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
ports:
- "3306:3306"
db1:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
ports:
- "3307:3306"
yaml
字段说明:
| 字段 | 说明 | 示例 |
|---|---|---|
image | 使用的镜像 | mysql:8.0 |
command | 容器启动时执行的参数 | --default-authentication-plugin=... |
restart | 重启策略 | always(Docker重启后自动启动) |
environment | 环境变量 | MYSQL_ROOT_PASSWORD: example |
ports | 端口映射(宿主机:容器) | "3306:3306" |
常用Docker Compose命令
# 创建并启动所有服务(-d后台运行)
docker compose up -d
# 查看运行中的容器
docker compose ps
# 查看日志
docker compose logs
# 停止并删除所有容器
docker compose down
# 重启服务
docker compose restart
# 停止服务(保留容器)
docker compose stop
# 启动已停止的服务
docker compose start
# 删除已停止的容器
docker compose rm
bash
多服务管理
Docker Compose的核心优势是一个文件管理多个服务。当配置文件中包含多个services时:
# 启动所有服务
docker compose up -d
# 只启动某个服务
docker compose up -d db
# 查看所有容器
docker ps | grep mysql
bash
注意事项:
- 多个service的名称不能重复
- 宿主机端口不能冲突(容器内部端口可以相同,因为容器有网络隔离)
- 例如两个MySQL实例:宿主机用3306和3307,容器内部都用3306
端口映射规则
宿主机端口:容器端口
3306 : 3306 ← 第一个MySQL
3307 : 3306 ← 第二个MySQL(宿主机端口不同,容器端口可以相同)
text
容器本身有网络隔离机制,不同容器的内部端口互不影响。
实战:创建MySQL容器集群
# 1. 创建目录
mkdir mysql && cd mysql
# 2. 创建配置文件
vim docker-compose.yml
# 粘贴上面的YAML配置
# 3. 启动
docker compose up -d
# 4. 验证连接
# 使用Navicat或命令行连接:
# Host: 192.168.31.77
# Port: 3306 或 3307
# Password: example
# 5. 使用完毕后清理
docker compose down
bash
VI编辑器快捷操作
在Linux服务器上编辑文件时常用VI命令:
| 操作 | 命令 | 说明 |
|---|---|---|
| 进入编辑模式 | i | 在光标位置插入 |
| 退出编辑模式 | Esc | 回到命令模式 |
| 保存退出 | :wq | 保存并退出 |
| 复制N行 | y数字y | 如y8y复制8行 |
| 粘贴 | p | 在光标后粘贴 |
| 删除行 | dd | 删除当前行 |
更多Docker Comose配置
Docker Compose支持完整的容器生命周期管理配置,包括网络、DNS、标签、挂载卷等。详细配置参考 Docker Compose官方文档。
当前使用的是Compose V3版本格式,以下是常用高级配置:
services:
app:
image: node:22
working_dir: /app
volumes:
- .:/app # 挂载当前目录
ports:
- "3000:3000"
environment:
NODE_ENV: development
depends_on:
- db # 依赖db服务
networks:
- app-network
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql # 数据持久化
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db-data:
yaml
↑