• 核心逻辑:用 Compose 定义多容器关系 → 挂载代码 / 配置 → 初始化数据库权限 → 验证访问;
  • 核心价值:环境隔离、一键部署、可移植(换服务器只需复制 myweb 目录 + 启动命令)。

前置条件:服务器已安装 Docker + Docker Compose

# 快速安装(以 CentOS/OpenEuler 为例)

yum install -y docker-compose docker
systemctl start docker && systemctl enable docker

创建目录结构

mkdir -p /root/myweb/{php,www}
cd /root/myweb

编写 PHP 的 Dockerfile

# 编辑 php/Dockerfile
cat > php/Dockerfile << EOF
FROM php:8.1-fpm
RUN apt-get update && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libzip-dev \
    zlib1g-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j\$(nproc) gd pdo_mysql mysqli \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
EOF

编写 docker-compose.yml 注:MySQL 8.0 密码必须复杂(大小写 + 数字 + 特殊字符),否则自定义密码失效;

# 编辑 docker-compose.yml
cat > docker-compose.yml << EOF
version: '3'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./www:/var/www/html
    depends_on:
      - php

  php:
    build: ./php
    volumes:
      - ./www:/var/www/html

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: '@Root110120'  # 复杂密码,避免初始化失败
      MYSQL_DATABASE: myweb               # 自动创建数据库
      MYSQL_ROOT_HOST: "%"                # 允许root远程登录
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
EOF

编写 Nginx 配置文件(解析 PHP)

# 编辑 nginx.conf
cat > nginx.conf << EOF
server {
    listen 80;
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files \$uri \$uri/ /index.php?\$query_string;
    }

    location ~ \.php\$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
    }
}
EOF

创建测试 PHP 文件(验证环境)

# 编辑 www/index.php
cat > www/index.php << EOF
<?php
echo "✅ 网站运行成功!<br>";
echo "PHP 版本:" . phpversion() . "<br>";
// 测试 MySQL 连接
\$link = mysqli_connect('mysql', 'root', '@Root110120', 'myweb');
if (\$link) {
    echo "✅ MySQL 连接成功!";
} else {
    echo "❌ MySQL 连接失败:" . mysqli_connect_error();
}
?>
EOF

启动整套服务

# 先删除旧数据卷(避免密码残留,首次启动可跳过,若之前失败必执行)
docker volume rm myweb_mysql_data 2>/dev/null

# 启动服务(--build 重建 PHP 镜像)
docker compose up -d --build

验证最终效果(3 个容器均为 Up)

docker compose ps

浏览器访问:http://你的服务器IP/index.php,显示:

✅ 网站运行成功!
PHP 版本:8.1.34
✅ MySQL 连接成功!

常用运维命令(后续管理环境用)

# 重启所有服务
docker compose restart

# 停止所有服务(保留容器)
docker compose stop

# 停止并删除容器(保留数据卷)
docker compose down

# 查看日志(排错用)
docker compose logs nginx  # 看 Nginx 日志
docker compose logs mysql  # 看 MySQL 日志

更多推荐