## 一、背景
### 1.1 单容器架构(初始版本)
```
┌─────────────────────────────────────┐
│ haozhanzhan 容器 │
│ ┌──────┐ ┌──────┐ ┌──────────────┐ │
│ │Nginx │ │ PHP │ │ MySQL │ │
│ └──────┘ └──────┘ └──────────────┘ │
└─────────────────────────────────────┘
```
| 优点 | 缺点 |
|------|------|
| 部署简单,一条命令 | 不易扩展 |
| 适合测试/小站点 | 数据库和代码耦合 |
| 资源占用少 | 升级不方便 |
### 1.2 三容器架构(生产版本)
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ nginx │ │ php │ │ mysql │
│ 容器 :80 │────▶│ 容器 :9000 │ │ 容器 :3306 │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└────────────────────┼────────────────────┘
│
docker network (桥接网络)
```
| 优点 | 缺点 |
|------|------|
| 职责分离,易维护 | 需要 docker-compose |
| 数据库独立扩展/备份 | 稍微复杂 |
| 升级 PHP 不影响 MySQL | 占用稍多资源 |
| 生产环境标准做法 | - |
---
## 二、文件结构
```
engine-api/
├── Dockerfile # PHP 容器镜像
├── docker-compose.yml # 三容器编排
├── docker/
│ └── nginx.conf # Nginx 配置
└── 其他项目文件...
```
---
## 三、配置文件
### 3.1 Dockerfile(PHP 容器)
**文件位置**:`Dockerfile`
```dockerfile
FROM docker.1panel.live/library/php:8.3-fpm
RUN apt-get update && apt-get install -y \
&& docker-php-ext-install pdo_mysql
WORKDIR /var/www/html
COPY . .
RUN mkdir -p storage/framework/sessions \
&& mkdir -p storage/framework/views \
&& mkdir -p storage/framework/cache \
&& mkdir -p storage/logs \
&& chown -R www-data:www-data storage bootstrap/cache \
&& chmod -R 775 storage bootstrap/cache
EXPOSE 9000
CMD ["php-fpm"]
```
### 3.2 docker-compose.yml
**文件位置**:`docker-compose.yml`
```yaml
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- .:/var/www/html
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
php:
build: .
mysql:
image: docker.1panel.live/library/mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: haozhanzhan
```
### 3.3 nginx.conf
**文件位置**:`docker/nginx.conf`
```nginx
server {
listen 80;
server_name _;
root /var/www/html/public;
index index.php;
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;
}
}
```
---
## 四、容器内网络通信
| 通信 | 目标地址 | 说明 |
|------|---------|------|
| nginx → php | `php:9000` | 服务名解析 |
| php → mysql | `mysql:3306` | 服务名解析 |
### 验证连接
# 查看容器
docker-compose ps
# 进入 php 容器测试
docker exec -it engine-api-php-1 sh
php -r "echo gethostbyname('mysql');"
---
## 五、安装向导数据库配置
在安装页面填写:
| 字段 | 值 |
|------|-----|
| 数据库主机 | `mysql` 或 `engine-api-mysql-1` |
| 端口 | `3306` |
| 数据库名 | `haozhanzhan` |
| 用户名 | `root` |
| 密码 | `root123` |
---
## 六、常用命令
| 操作 | 命令 |
|------|------|
| 构建镜像 | `docker build -t codeyoursmile/haozhanzhan:latest .` |
| 启动所有服务 | `docker-compose up -d` |
| 停止所有服务 | `docker-compose down` |
| 查看状态 | `docker-compose ps` |
| 查看日志 | `docker-compose logs -f` |
| 重启单个服务 | `docker-compose restart php` |
| 进入容器 | `docker exec -it engine-api-php-1 sh` |
---
## 七、推送镜像
# 登录 Docker Hub
docker login
# 推送镜像
docker push codeyoursmile/haozhanzhan:latest
---
## 八、服务器部署
# 拉取镜像
docker pull codeyoursmile/haozhanzhan:latest
# 创建项目目录
mkdir -p /opt/haozhanzhan
cd /opt/haozhanzhan
# 上传 docker-compose.yml 和 docker/nginx.conf
# 启动
docker-compose up -d
---
## 九、常见问题
| 问题 | 解决方案 |
|------|---------|
| `vendor/autoload.php` 找不到 | 确保 `.dockerignore` 没有忽略 vendor |
| `Access denied for user 'root'` | 进入 mysql 容器执行 `GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;` |
| nginx 无法启动 | 检查 `docker/nginx.conf` 第一行是否有 `user www-data;`,删除它 |
| 数据库连接 refused | 确认数据库主机填写的是 `mysql` 或 `engine-api-mysql-1` |
---