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 --versionLinux环境以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-world2.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初始化完成后,所有漏洞模块应该都能正常访问。我建议优先测试以下三个核心漏洞:
- SQL注入 →
http://localhost:8080/vul/sqli - XSS攻击 →
http://localhost:8080/vul/xss - 文件上传 →
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部署
- 安全组开放8080端口
- 通过SSH连接实例后直接运行:
docker run -d -p 8080:80 --name pikachu -e MYSQL_ROOT_PASSWORD=StrongPass123 area39/pikachu5.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 startQ3:文件上传漏洞不可用检查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 restart7. 进阶技巧与优化
7.1 自定义漏洞模块
- 将靶场代码挂载为数据卷:
docker run -d -p 8080:80 -v /path/to/custom-pikachu:/var/www/html area39/pikachu- 修改漏洞代码后无需重建容器,实时生效
7.2 性能调优
对于高并发场景建议:
docker run -d \ --name pikachu \ --memory=2g \ --cpus=1.5 \ --ulimit nofile=65535:65535 \ -p 8080:80 \ area39/pikachu7.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/html8. 安全防护建议
虽然Pikachu是靶场系统,但仍需注意:
- 不要使用默认密码
- 生产环境务必添加HTTP认证
docker run -d \ -p 8080:80 \ -e HTTP_USER=admin \ -e HTTP_PASS=SecurePass123 \ area39/pikachu- 定期更新镜像获取安全补丁
docker pull area39/pikachu:latest docker-compose down && docker-compose up -d我在实际使用中发现,配合Traefik反向代理可以方便地添加HTTPS支持,提升传输安全性。