我的博客

Docker Compose 多服务编排实战

上次学会了跑单个容器,但这周发现一个现实问题:我的博客需要 Nginx + PHP + MySQL 三个服务,难道要手动启动三个容器?Docker Compose 正是解决这个问题的。

安装 Docker Compose

# 用 apt 安装
sudo apt install docker-compose -y

# 验证
docker-compose --version

写第一个 docker-compose.yml

在项目目录下新建 docker-compose.yml

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - php

  php:
    image: php:8.1-fpm
    volumes:
      - ./html:/var/www/html

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_DATABASE: blog
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

启动和管理

# 启动所有服务(-d 后台运行)
docker-compose up -d

# 查看运行状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止
docker-compose down

# 重新构建并启动
docker-compose up -d --build

遇到的坑

1. PHP 连不上 MySQL——原来 Compose 自动创建了网络,要用服务名(db)而不是 localhost 连接。

2. 端口冲突——宿主机 80 端口已被占用时,改成 8080:80 就好。

3. 数据丢失——容器删了数据就没了,一定要用 volumes 持久化。

一个小技巧:.env 文件

密码直接写在 yml 里不安全,可以这样:

# .env 文件(不提交到 git)
DB_PASSWORD=mypassword

# docker-compose.yml
services:
  db:
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

Compose 是我觉得 Docker 生态里最实用的工具之一。有了它,管理多容器服务终于像样了。