告别手动配置:Docker Compose自动化部署Pikachu靶场实战指南

每次搭建渗透测试环境都要重复安装PHP、配置MySQL、调整权限?团队协作时总遇到"在我机器上能运行"的尴尬?试试这个基于Docker Compose的一键化解决方案。本文将手把手带你用容器化技术实现Pikachu靶场的秒级部署,无论你是要快速重建实验环境,还是需要在多台设备间保持环境一致性,这套方案都能显著提升你的工作效率。

1. 为什么选择Docker Compose部署靶场环境

传统手动搭建渗透测试靶场通常需要经历以下痛苦流程:安装Web服务器→配置PHP环境→初始化MySQL数据库→导入测试数据→调整文件权限。这个过程不仅耗时,而且容易因系统差异导致各种"玄学"问题。更糟糕的是,当需要清理环境或在不同设备上重建时,所有步骤都得重来一遍。

Docker Compose通过声明式配置文件解决这些问题。我们只需要定义一个docker-compose.yml文件,就能实现:

  • 环境标准化:确保开发、测试、演示各环节环境完全一致
  • 快速重建:销毁和重建环境只需两条命令
  • 资源隔离:避免污染宿主机环境
  • 团队共享:配置文件纳入版本控制,团队成员秒级获得相同环境
version: '3'
services:
  web:
    image: php:7.4-apache
    ports:
      - "80:80"
    volumes:
      - ./pikachu:/var/www/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: pikachu
      MYSQL_DATABASE: pikachu

这个基础配置已经包含了Web服务和数据库服务,接下来我们会逐步完善它。

2. 完整环境配置详解

2.1 文件结构规划

在开始编写配置前,建议先规划好项目目录结构:

/pikachu-docker
├── docker-compose.yml
├── pikachu/          # 靶场源码
├── mysql/            # 数据库数据持久化
└── config/
    ├── php.ini       # PHP自定义配置
    └── mysql.cnf     # MySQL自定义配置

提示:这种结构将可变数据(数据库文件)与不可变数据(源码)分离,方便管理和备份。

2.2 完善docker-compose.yml

下面是经过优化的完整配置方案:

version: '3.8'

services:
  web:
    image: php:7.4-apache
    container_name: pikachu-web
    ports:
      - "8080:80"
    volumes:
      - ./pikachu:/var/www/html
      - ./config/php.ini:/usr/local/etc/php/conf.d/custom.ini
    networks:
      - pikachu-net
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: mysql:5.7
    container_name: pikachu-db
    environment:
      MYSQL_ROOT_PASSWORD: pikachu123
      MYSQL_DATABASE: pikachu
      MYSQL_USER: pikachu
      MYSQL_PASSWORD: pikachu123
    volumes:
      - ./mysql:/var/lib/mysql
      - ./config/mysql.cnf:/etc/mysql/conf.d/custom.cnf
    networks:
      - pikachu-net
    restart: unless-stopped

networks:
  pikachu-net:
    driver: bridge

关键配置说明:

  • 网络隔离:创建专用网络确保服务间安全通信
  • 数据持久化:MySQL数据存储在宿主机,避免容器销毁后数据丢失
  • 配置注入:挂载自定义PHP和MySQL配置文件
  • 自动重启:配置容器异常退出时自动恢复

2.3 必要的自定义配置

config/php.ini中添加以下PHP优化设置:

upload_max_filesize = 20M
post_max_size = 20M
memory_limit = 256M
display_errors = On
error_reporting = E_ALL

MySQL配置文件config/mysql.cnf建议配置:

[mysqld]
max_connections = 200
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

3. 靶场初始化与使用技巧

3.1 一键启动与关闭

启动整个环境只需在项目目录执行:

docker-compose up -d

等待命令执行完成后,访问 http://localhost:8080 即可看到Pikachu登录页面。

关闭环境同样简单:

docker-compose down

需要彻底清理(包括持久化数据)时:

docker-compose down -v

3.2 数据库初始化

首次启动后,需要执行以下操作完成靶场初始化:

  1. 访问Pikachu安装页面 (http://localhost:8080/install.php)
  2. 按照向导填写数据库连接信息:
    • 数据库地址:db (使用Docker服务名)
    • 用户名:pikachu
    • 密码:pikachu123
    • 数据库名:pikachu

注意:安装完成后务必删除或重命名install.php文件,避免安全隐患。

3.3 常用运维命令

查看服务日志:

docker-compose logs -f web

进入容器执行命令:

docker-compose exec web bash

备份数据库:

docker-compose exec db mysqldump -u root -ppikachu123 pikachu > backup.sql

4. 高级配置与优化建议

4.1 资源限制与监控

为防止容器占用过多系统资源,可以在docker-compose.yml中添加资源限制:

services:
  web:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
  db:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 1G

监控容器资源使用情况:

docker stats pikachu-web pikachu-db

4.2 多环境配置管理

对于开发、测试不同环境,可以使用多个Compose文件:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

docker-compose.dev.yml示例:

version: '3.8'

services:
  web:
    environment:
      - APP_ENV=development
    volumes:
      - ./pikachu:/var/www/html
      - ./xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini

4.3 安全加固措施

  1. 修改默认密码:在docker-compose.yml中更换所有默认密码
  2. 限制网络访问:
    networks:
      pikachu-net:
        internal: true
    
  3. 定期更新基础镜像版本
  4. 配置适当的文件权限:
    chmod -R 755 pikachu/
    

5. 常见问题排查

Q1: 访问页面出现数据库连接错误

A1: 按顺序检查:

  1. 确保数据库容器已正常运行 (docker-compose ps)
  2. 检查db服务是否在同一个网络
  3. 验证install.php中配置的连接信息

Q2: 修改代码后页面无变化

A2: 可能是缓存导致,尝试:

  1. 清除浏览器缓存
  2. 重启Apache服务:
    docker-compose exec web service apache2 reload
    

Q3: MySQL服务频繁重启

A3: 通常是因为内存不足,可以:

  1. 增加MySQL内存限制
  2. 优化MySQL配置参数
  3. 检查宿主机可用资源

这套方案已经在多个实际项目中验证过稳定性,特别是在团队培训和CTF比赛中表现出色。记得根据实际需求调整资源配置,对于性能敏感场景,可以考虑将MySQL数据目录挂载到SSD存储上。

更多推荐