# Docker网络配置文档

## 概述

本文档描述了知识库系统Docker部署的网络配置，包括生产环境和开发环境的网络设置。

## 网络架构

### 生产环境网络

- **网络名称**: `knowledge_base_network`
- **网络类型**: bridge
- **子网**: 172.20.0.0/16
- **网关**: 172.20.0.1

#### 服务端口映射

| 服务 | 容器名称 | 内部端口 | 外部端口 | 协议 |
|------|----------|----------|----------|------|
| Web应用 | knowledge_base_app | 80 | 80 | HTTP |
| MySQL | knowledge_base_mysql | 3306 | 3306 | MySQL |
| Redis | knowledge_base_redis | 6379 | 6379 | Redis |
| Meilisearch | knowledge_base_meilisearch | 7700 | 7700 | HTTP |

### 开发环境网络

- **网络名称**: `knowledge_base_dev_network`
- **网络类型**: bridge
- **子网**: 172.21.0.0/16
- **网关**: 172.21.0.1

#### 开发环境端口映射

| 服务 | 容器名称 | 内部端口 | 外部端口 | 协议 | 说明 |
|------|----------|----------|----------|------|------|
| Web应用 | knowledge_base_app_dev | 80 | 8080 | HTTP | 避免与生产环境冲突 |
| PHP-FPM调试 | knowledge_base_app_dev | 9000 | 9000 | TCP | Xdebug调试端口 |
| MySQL | knowledge_base_mysql_dev | 3306 | 3307 | MySQL | 避免与本地MySQL冲突 |
| Redis | knowledge_base_redis_dev | 6379 | 6380 | Redis | 避免与本地Redis冲突 |
| Meilisearch | knowledge_base_meilisearch_dev | 7700 | 7701 | HTTP | 避免与生产环境冲突 |

## 服务间通信

### 内部服务发现

所有容器通过Docker内部DNS进行服务发现，使用容器名称作为主机名：

- **数据库连接**: `mysql:3306`
- **Redis连接**: `redis:6379`
- **Meilisearch连接**: `http://meilisearch:7700`

### 环境变量配置

#### 生产环境

```bash
# 数据库连接
DB_HOST=mysql
DB_PORT=3306

# Redis连接
REDIS_HOST=redis
REDIS_PORT=6379

# Meilisearch连接
MEILISEARCH_HOST=http://meilisearch:7700
```

#### 开发环境

```bash
# 数据库连接
DB_HOST=mysql
DB_PORT=3306

# Redis连接
REDIS_HOST=redis
REDIS_PORT=6379

# Meilisearch连接
MEILISEARCH_HOST=http://meilisearch:7700
```

注意：开发环境内部端口保持一致，只有外部映射端口不同。

## 网络安全

### 防火墙规则

生产环境建议配置防火墙规则：

```bash
# 只允许必要的端口访问
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS (如果使用SSL)
sudo ufw deny 3306/tcp   # 禁止外部直接访问MySQL
sudo ufw deny 6379/tcp   # 禁止外部直接访问Redis
sudo ufw deny 7700/tcp   # 禁止外部直接访问Meilisearch
```

### 容器间通信安全

- 所有服务运行在隔离的Docker网络中
- 数据库、缓存和搜索服务不直接暴露给外部网络
- 只有Web应用容器暴露HTTP端口

## 故障排除

### 网络连接问题

1. **检查容器网络状态**:
   ```bash
   docker network ls
   docker network inspect knowledge_base_network
   ```

2. **测试容器间连通性**:
   ```bash
   docker exec knowledge_base_app ping mysql
   docker exec knowledge_base_app ping redis
   docker exec knowledge_base_app ping meilisearch
   ```

3. **检查端口监听状态**:
   ```bash
   docker exec knowledge_base_mysql netstat -tlnp
   docker exec knowledge_base_redis netstat -tlnp
   ```

### 常见问题

1. **端口冲突**: 确保外部端口没有被其他服务占用
2. **DNS解析失败**: 检查容器是否在同一网络中
3. **防火墙阻断**: 检查宿主机防火墙设置

## 监控和日志

### 网络监控

```bash
# 查看网络流量
docker exec knowledge_base_app ss -tuln

# 监控连接状态
docker exec knowledge_base_app netstat -an | grep ESTABLISHED
```

### 连接日志

应用连接日志位置：
- Laravel日志: `/var/www/html/storage/logs/laravel.log`
- Swoole访问日志: `/var/log/supervisor/swoole_stdout.log`
- Swoole错误日志: `/var/log/supervisor/swoole_stderr.log`

## 性能优化

### 网络性能调优

1. **启用HTTP/2** (如果使用HTTPS)
2. **配置连接池**:
   - MySQL连接池大小
   - Redis连接池配置
3. **启用压缩**:
   - Swoole内置压缩支持
   - 静态资源压缩

### 资源限制

```yaml
# 在docker-compose.yml中配置资源限制
deploy:
  resources:
    limits:
      memory: 1G
      cpus: '0.5'
    reservations:
      memory: 512M
      cpus: '0.25'
```