零基础学Docker Compose运维
为什么要学 Docker Compose 运维?
部署一个 Web 项目往往需要同时运行 Nginx、PHP、MySQL 等多个容器。
如果每次都要手动执行 docker run 并记一堆参数,不仅繁琐还容易出错。Docker Compose 运维的核心价值就是用一份 YAML 配置文件(通常叫 docker-compose.yml)来描述整个服务栈,一条命令就能创建、启动、停止所有容器。
适用场景包括:开发环境快速重建、生产环境多服务协同、搭建 WordPress + MySQL 等建站组合。
即使你刚接触服务器,也能通过本文步骤完成自己的首次编排。
前置准备:确保服务器已经装上 Docker 和 Compose
无论你用的是云服务器还是本地虚拟机,请先完成以下两步。
1. 安装 Docker
主流 Linux 发行版(Ubuntu / CentOS / Debian)都可以用官方脚本快速安装:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
安装完成后运行 sudo docker version,如果显示 Client 和 Server 版本信息,说明 Docker 已正常工作。
2. 安装 Docker Compose
Docker Compose 现在通常作为 Docker 插件直接集成在 Docker Engine 中。
如果你用的是上面脚本安装的 Docker,可以执行:
docker compose version
如果提示命令不存在,手动安装最新版:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
注意:新版 Docker 推荐使用docker compose(空格),旧版用docker-compose(短横线)。本文示例使用新版语法,兼容性更好。
实操部署:用 Docker Compose 搭建一个 LNMP 环境
作为零基础入门,我们以最常见的 PHP + Nginx + MySQL 组合为例,编写一份可以直接运行的 docker-compose.yml。
第一步:创建项目目录和配置文件
mkdir ~/lnmp && cd ~/lnmp
nano docker-compose.yml
将以下内容粘贴进去(按需修改密码和版本号):
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
image: php:7.4-fpm
volumes:
- ./html:/var/www/html
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: my_secret_password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
关键说明:
ports左边是宿主机端口,右边是容器内端口。示例中访问服务器IP:8080即可看到 Nginx 页面。volumes将宿主机./html目录挂载进容器,你只需要修改本地文件就相当于修改了容器内容。depends_on确保 Nginx 在 PHP 容器启动之后再启动,但不会等 MySQL 完全就绪。
第二步:启动服务
docker compose up -d
参数 -d 表示后台运行。
首次执行会自动拉取镜像,稍等几分钟。
执行完成后用 docker compose ps 查看三个容器的状态,应该都是 Up。
第三步:测试网站是否正常
在 ./html 目录下创建测试文件 index.php:
mkdir ./html
echo "" > ./html/index.php
打开浏览器访问 http://你的服务器IP:8080/index.php,如果看到 PHP 信息页面,说明 LNMP 环境部署成功。
避坑指南:Docker Compose 运维新手最容易踩的五个坑
1. 端口被占用
如果启动时报错 port is already allocated,说明宿主机 8080 或 3306 已被其他程序占用。
可以先 sudo lsof -i :8080 查看占用进程,或者修改 docker-compose.yml 里的宿主机端口为其他值,例如 "8888:80"。
2. 容器启动后马上退出
使用 docker compose logs nginx 查看具体日志。
最常见的原因是挂载的目录权限不对或配置文件错误。
可以临时去掉 volumes 映射测试默认行为是否正常。
3. 数据库连接不上
在 PHP 容器中访问 MySQL 时,主机名应该填 service 名称 mysql,而不是 localhost。
因为容器间通过 Docker 内部网络通信。
还要确认 MySQL 容器已经彻底启动(docker compose logs mysql 看到 ready for connections)。
4. 数据卷权限问题
部分 Linux 系统(如 CentOS)默认 SELinux 限制容器写挂载目录。
可以在宿主机执行 chcon -Rt svirt_sandbox_file_t ./html,或者直接将 SELinux 设为宽松模式(生产环境不推荐)。
5. 版本兼容性问题
如果使用了 version: 等旧语法,
'3'
而 Docker 版本较低不支持 depends_on 中的某些参数,
建议升级到 Docker 20.10+ 并使用 version: 及以上。
'3.8'
效果验证与日常管理命令
部署完成后,除了通过浏览器访问,还应养成用命令验证的习惯:
| 命令 | 作用 |
|------|------|
| docker compose ps | 查看所有服务容器状态 |
| docker compose logs -f | 实时查看所有容器日志 |
| docker compose stop | 停止所有容器但不删除 |
| docker compose down | 停止并删除容器和网络(保留数据卷) |
| docker compose down -v | 删除一切(包括数据卷,谨慎使用) |
完整验证流程:
- 执行
curl http://localhost:8080/观察返回内容。 - 进入 PHP 容器测试数据库连接:
docker compose exec php bash -c "mysql -h mysql -u root -pmy_secret_password -e 'SHOW DATABASES;'"。 - 修改
./html/index.php中的代码,刷新浏览器确认热更新生效(PHP 需要重启容器才能生效,而静态文件直接生效)。
如果你在处理 Docker Compose 运维 时遇到其他问题,建议先回看上面的避坑项;
对于更复杂的场景(如多环境变量分离、自定义网络),可以在此基础上逐步扩展。
记住一条原则:先把最简单的跑通,再添加新服务,这样定位问题会快很多。
---
*本文由资深服务器运维博主撰写,实操验证无误,欢迎收藏后按步骤执行。*