CentOS 9 Stream 中 Docker Compose 部署多容器应用(Nginx+MySQL+PHP)

1. 环境准备
  • 安装 Docker
    sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
    sudo dnf install docker-ce docker-ce-cli containerd.io
    sudo systemctl enable --now docker
    

  • 安装 Docker Compose
    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
    

2. 项目结构
project/
├── docker-compose.yml
├── nginx/
│   └── nginx.conf
├── php/
│   └── Dockerfile
└── html/
    └── index.php


3. 配置文件详解
(1) docker-compose.yml
version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./html:/var/www/html
    depends_on:
      - php
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root_pass
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: user_pass
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

  php:
    build: ./php
    volumes:
      - ./html:/var/www/html
    environment:
      - MYSQL_HOST=mysql
    networks:
      - app-network

volumes:
  mysql-data:

networks:
  app-network:
    driver: bridge

(2) Nginx 配置 (nginx/nginx.conf)
events {}
http {
  server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php index.html;

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

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

(3) PHP Dockerfile (php/Dockerfile)
FROM php:8.2-fpm
RUN docker-php-ext-install mysqli pdo pdo_mysql

(4) PHP 测试文件 (html/index.php)
<?php
$servername = "mysql";
$username = "app_user";
$password = "user_pass";
$dbname = "app_db";

// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "MySQL connected successfully!";
phpinfo();
?>


4. 启动与验证
  1. 构建并启动服务
    docker-compose up -d --build
    

  2. 验证容器状态
    docker-compose ps
    

    输出应显示三个容器状态为 running
    Name                Command               State          Ports
    -----------------------------------------------------------------
    project-mysql-1    docker-entrypoint.sh mysqld   Up      3306/tcp
    project-nginx-1    nginx -g daemon off;          Up      0.0.0.0:80->80/tcp
    project-php-1      docker-php-entrypoint php-fpm  Up      9000/tcp
    

  3. 访问测试
    • 浏览器访问 http://<服务器IP> 显示:
      MySQL connected successfully!
      [PHP 信息页面]
      


5. 管理命令
操作 命令
停止服务 docker-compose down
查看日志 docker-compose logs -f
进入容器 docker exec -it <容器名> bash
删除持久化数据 docker-compose down -v

6. 常见问题解决
  1. Nginx 502 Bad Gateway
    • 检查 PHP 容器是否运行:docker-compose ps
    • 确认 fastcgi_pass php:9000 配置正确
  2. MySQL 连接失败
    • 在 PHP 容器内测试连接:
      docker exec -it project-php-1 bash
      mysql -h mysql -u app_user -p
      

  3. 文件权限问题
    • 在宿主机执行:
      chmod -R 755 html/
      

提示:生产环境需加强安全措施:

  • 替换 MySQL 默认密码
  • 限制 Nginx 目录访问权限
  • 使用 HTTPS 加密传输
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐