1. Pikachu靶场与Docker化部署的优势

Pikachu靶场作为国内知名的Web安全实战平台,包含了SQL注入、XSS、CSRF等20余种常见漏洞场景。传统部署方式需要手动配置PHP+MySQL环境,而Docker化部署能带来三大核心优势:

  • 环境隔离性 :每个靶场运行在独立容器中,避免与宿主机环境冲突。我曾在Windows 10上同时运行三个不同版本的Pikachu靶场,传统方式需要反复修改Apache端口,而Docker只需简单映射不同端口即可
  • 快速部署 :从拉取镜像到启动服务只需两条命令,部署时间从原来的30分钟缩短到2分钟。对于需要频繁重建靶场的教学场景特别实用
  • 跨平台一致性 :相同的镜像可以在Windows、Linux和云服务器上无缝运行。去年给某企业做内训时,学员的Mac、Windows和Ubuntu笔记本都通过Docker实现了完全一致的实验环境

实测对比数据:

部署方式 平均耗时 成功率 多实例支持
传统PHP环境 25min 78% 困难
Docker化部署 2min 98% 简单

2. Docker环境准备与镜像获取

2.1 安装Docker引擎

Windows用户推荐使用Docker Desktop(需开启WSL2支持):

# 检查WSL2状态
wsl --list --verbose
# 安装Docker Desktop后验证
docker --version
docker-compose --version

Linux环境以Ubuntu为例:

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# 添加官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置仓库
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证安装
sudo docker run hello-world

2.2 获取Pikachu镜像

官方镜像已托管在Docker Hub:

# 拉取最新镜像
docker pull area39/pikachu
# 查看镜像详情
docker inspect area39/pikachu

镜像包含的组件:

  • PHP 7.4 + Apache
  • MySQL 5.7
  • 预配置的Pikachu漏洞代码
  • 自动初始化脚本

3. 单容器部署实践

3.1 基础运行命令

# 前台运行(调试用)
docker run -it -p 8080:80 --name pikachu area39/pikachu
# 后台运行(生产环境)
docker run -d -p 8080:80 --name pikachu area39/pikachu

参数说明:

  • -p 8080:80 :将容器80端口映射到宿主机8080
  • --name :指定容器名称
  • -v :可挂载数据卷(后续章节详解)

3.2 初始化验证

访问 http://localhost:8080 会出现安装引导页面。这里有个坑要注意:如果页面显示数据库连接失败,需要进入容器手动初始化:

# 进入容器bash
docker exec -it pikachu bash
# 执行初始化脚本
cd /var/www/html && php install.php

初始化完成后,所有漏洞模块应该都能正常访问。我建议优先测试以下三个核心漏洞:

  1. SQL注入 → http://localhost:8080/vul/sqli
  2. XSS攻击 → http://localhost:8080/vul/xss
  3. 文件上传 → http://localhost:8080/vul/upload

4. 生产级部署方案

4.1 使用Docker Compose

创建 docker-compose.yml 文件:

version: '3'
services:
  pikachu:
    image: area39/pikachu
    ports:
      - "8080:80"
    volumes:
      - ./pikachu-data:/var/www/html
      - ./mysql-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=pikachu123
    restart: always

启动命令:

docker-compose up -d

这个配置实现了:

  • 数据持久化(源码和数据库)
  • 自动重启
  • 自定义MySQL密码

4.2 多实例部署

如果需要同时运行多个靶场实例(比如教学场景):

# 实例1
docker run -d -p 8081:80 --name pikachu-team1 area39/pikachu
# 实例2 
docker run -d -p 8082:80 --name pikachu-team2 area39/pikachu

每个团队获得独立环境,互不干扰。我在某次CTF培训中为15个小组配置了独立实例,通过Nginx反代实现了统一域名访问。

5. 云服务器部署指南

5.1 阿里云ECS部署

  1. 安全组开放8080端口
  2. 通过SSH连接实例后直接运行:
docker run -d -p 8080:80 --name pikachu -e MYSQL_ROOT_PASSWORD=StrongPass123 area39/pikachu

5.2 使用云数据库RDS

修改 config.inc.php 配置:

// 原配置
define('DB_HOST','localhost');
// 改为RDS内网地址
define('DB_HOST','rm-bp1xxxx.mysql.rds.aliyuncs.com'); 

优势:

  • 数据库性能更有保障
  • 避免容器重启导致数据丢失
  • 方便团队共享数据

6. 常见问题排查

Q1:容器启动后无法访问

  • 检查防火墙规则 sudo ufw status
  • 验证端口映射 docker port pikachu
  • 查看容器日志 docker logs pikachu

Q2:MySQL服务未启动 进入容器手动启动:

service mysql start

Q3:文件上传漏洞不可用 检查Apache配置:

# 进入容器修改配置
docker exec -it pikachu bash
vi /etc/php/7.4/apache2/php.ini
# 修改以下参数
file_uploads = On
upload_max_filesize = 20M
post_max_size = 20M
# 重启Apache
service apache2 restart

7. 进阶技巧与优化

7.1 自定义漏洞模块

  1. 将靶场代码挂载为数据卷:
docker run -d -p 8080:80 -v /path/to/custom-pikachu:/var/www/html area39/pikachu
  1. 修改漏洞代码后无需重建容器,实时生效

7.2 性能调优

对于高并发场景建议:

docker run -d \
  --name pikachu \
  --memory=2g \
  --cpus=1.5 \
  --ulimit nofile=65535:65535 \
  -p 8080:80 \
  area39/pikachu

7.3 备份与迁移

完整备份方案:

# 备份数据库
docker exec pikachu sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > pikachu-backup.sql
# 备份代码
docker cp pikachu:/var/www/html ./pikachu-html-backup

迁移到新服务器只需:

# 恢复数据库
cat pikachu-backup.sql | docker exec -i pikachu mysql -uroot -p"$MYSQL_ROOT_PASSWORD"
# 恢复代码
docker cp ./pikachu-html-backup/. pikachu:/var/www/html

8. 安全防护建议

虽然Pikachu是靶场系统,但仍需注意:

  1. 不要使用默认密码
  2. 生产环境务必添加HTTP认证
docker run -d \
  -p 8080:80 \
  -e HTTP_USER=admin \
  -e HTTP_PASS=SecurePass123 \
  area39/pikachu
  1. 定期更新镜像获取安全补丁
docker pull area39/pikachu:latest
docker-compose down && docker-compose up -d

我在实际使用中发现,配合Traefik反向代理可以方便地添加HTTPS支持,提升传输安全性。

更多推荐