搜索

📄 文章 📚 合集
热门搜索
🐘 PHP ⚡ Laravel 🎨 Vue.js ⚛️ React 📦 Yii 📘 JavaScript 🗄️ MySQL 🐳 Docker
返回合集

[板块7:Docker 容器化交付] - 05 -docker 从单容器到三容器

代码示例
## 一、背景

### 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` |

---

🧸 adorable code

专注 PHP、JavaScript、Laravel、Vue.js、React、Yii 全栈开发。记录技术探索过程中的灵感与经验,分享工程实践洞见。

hello@adorablecode.com