零基础学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 | 删除一切(包括数据卷,谨慎使用) |

完整验证流程

  1. 执行 curl http://localhost:8080/ 观察返回内容。
  2. 进入 PHP 容器测试数据库连接:docker compose exec php bash -c "mysql -h mysql -u root -pmy_secret_password -e 'SHOW DATABASES;'"
  3. 修改 ./html/index.php 中的代码,刷新浏览器确认热更新生效(PHP 需要重启容器才能生效,而静态文件直接生效)。

如果你在处理 Docker Compose 运维 时遇到其他问题,建议先回看上面的避坑项;
对于更复杂的场景(如多环境变量分离、自定义网络),可以在此基础上逐步扩展。
记住一条原则:先把最简单的跑通,再添加新服务,这样定位问题会快很多。

---
*本文由资深服务器运维博主撰写,实操验证无误,欢迎收藏后按步骤执行。*

分享到:
上一篇
Docker部署AI模型:零基础也能上手
下一篇
K3s轻量集群搭建实战:零基础也能上手
1
系统公告

高考专属福利来袭|凭准考证免费领香港 CN2 云服务器

值高考落幕之际,泽御云开启考生专属回馈 + 产品限时特惠双重活动,助力学子暑期学习建站 高考 考生专属福利 全体应届高考生,凭高考准考证即可免费申领【香港 CN2 轻量云服务器,4 核 4G AMD 处理器】,免费使用周期 30 天,可用于搭建个人站点、编程实操、技术实训,祝各位考生金榜题名,前程似锦! 泽御云资质齐全合规自营机房,线路覆盖香港 CN2、国内 BGP、内蒙电信、美国精品线路,售后全天候技术支持。 官方网站:www.zeyuyun.com,活动限时有效,优惠逾期不再保留。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意