Docker Compose 使用指南(详尽教程)
一、什么是 Docker Compose?
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个名为 docker-compose.yml 的 YAML 文件,你可以配置应用服务。然后使用一条命令,就可以创建并启动所有服务。
它特别适合本地开发、测试以及小型部署环境。
二、安装 Docker Compose
1. Docker Desktop(推荐)
如果你使用的是 Docker Desktop(Windows/Mac),Docker Compose 已集成在其中。
2. Linux 用户安装(独立 CLI)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
三、基础概念
-
服务(services):你应用的一个组件,例如 web、db。
-
网络(networks):多个服务间的通信桥梁。
-
卷(volumes):持久化服务数据,如数据库数据。
四、编写 docker-compose.yml 文件
下面是一个使用 Nginx + PHP + MySQL 的典型 LEMP 栈例子:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx:/etc/nginx/conf.d
- ./html:/var/www/html
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./html:/var/www/html
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: exampledb
MYSQL_USER: user
MYSQL_PASSWORD: userpass
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
五、常用命令
启动服务
docker-compose up # 启动所有服务
docker-compose up -d # 后台运行(推荐)
当你运行:
docker-compose up -d
它会默认在当前目录下自动查找一个名为 docker-compose.yml 的文件,并基于该文件启动服务。
查找规则:
-
默认文件名是
docker-compose.yml(或.yaml,但.yml是推荐写法)。 -
必须在执行命令的当前目录下存在。
-
如果你使用的是 Docker Compose V2(现代版本,其实就是
docker compose而非docker-compose),也适用相同规则。
停止服务
docker-compose down # 停止并移除容器、网络
docker-compose stop # 仅停止容器
查看日志
docker-compose logs
docker-compose logs -f nginx # 跟踪 nginx 日志
执行命令
docker-compose exec php bash # 进入 php 容器终端
构建服务(适用于包含 Dockerfile 的项目)
docker-compose build
docker-compose up --build
六、项目目录结构建议
project/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── html/
│ └── index.php
示例 default.conf 内容(nginx 配置):
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
七、进阶使用
1. .env 文件支持
可以使用 .env 文件定义变量,在 docker-compose.yml 中使用:
.env 文件:
MYSQL_ROOT_PASSWORD=supersecret
docker-compose.yml 中使用:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
2. 多环境配置(override)
默认 Compose 会合并 docker-compose.override.yml。
你也可以使用多个配置文件:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
3. 容器之间通信
Compose 默认为所有服务创建一个自定义网络,服务间可以直接通过服务名通信,例如 php 容器中连接 mysql 容器:
$pdo = new PDO("mysql:host=mysql;dbname=exampledb", "user", "userpass");
八、调试技巧
-
docker-compose ps:查看当前运行的容器状态。 -
docker-compose config:检查配置是否正确(合并结果)。 -
docker network ls、docker volume ls:查看网络和数据卷。
九、最佳实践
-
按功能模块拆分服务:如 web、db、cache 等。
-
使用环境变量:提升移植性。
-
版本控制配置文件:如
docker-compose.yml和.env。 -
使用命名卷而不是路径挂载,减少权限问题。
-
避免在生产中使用默认网络,使用自定义网络提升安全性。
