别再手动改配置了!用Docker Compose一键部署你的第一个Web靶场(附完整YAML文件)
告别手动配置:用Docker Compose轻松搭建Web靶场环境
还在为每次搭建测试环境而重复安装Apache、MySQL和PHP吗?作为网络安全初学者,你可能已经习惯了下载源码包、配置数据库、修改php.ini这一系列繁琐操作。但今天,我要分享一个更高效的方法——用Docker Compose一键部署你的第一个Web靶场。
传统的手动搭建方式不仅耗时,还容易因为系统环境差异导致各种"玄学"问题。而容器化技术让这一切变得简单:只需一个YAML文件,就能在任何支持Docker的机器上快速复现完全一致的测试环境。下面,我将带你从零开始,用工程化的思维解决环境配置这个"脏活累活"。
1. 为什么选择Docker Compose来部署靶场?
在网络安全学习和实践过程中,测试环境的搭建往往是最耗时的环节。以常见的Pikachu靶场为例,传统部署方式需要:
- 下载并解压源码包
- 安装和配置Web服务器(如Apache或Nginx)
- 安装和初始化数据库(如MySQL)
- 修改各种配置文件以适应本地环境
- 处理可能出现的端口冲突、依赖缺失等问题
这个过程不仅繁琐,而且难以在不同机器间迁移。更糟糕的是,当你需要同时运行多个不同版本的靶场时,环境冲突几乎不可避免。
Docker Compose通过容器化技术解决了这些问题:
- 环境隔离:每个服务运行在独立的容器中,互不干扰
- 一键部署:所有配置通过YAML文件定义,无需手动操作
- 快速迁移:配置文件可以轻松分享,在其他机器上实现完全相同的环境
- 资源可控:可以精确限制每个容器使用的CPU和内存资源
version: '3'
services:
web:
image: httpd:2.4
ports:
- "80:80"
volumes:
- ./pikachu:/usr/local/apache2/htdocs
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: yourpassword
MYSQL_DATABASE: pikachu
上面这个简单的Compose文件就定义了一个完整的Web靶场环境,包含Web服务器和数据库服务。接下来,我们将深入解析如何定制这个配置。
2. 准备工作:搭建你的Docker开发环境
在开始编写Compose文件前,我们需要确保本地环境已经准备好。以下是不同操作系统下的安装指南:
2.1 安装Docker引擎
Windows/macOS用户:
- 下载Docker Desktop安装包
- 双击运行安装程序,按照向导完成安装
- 安装完成后,在开始菜单中启动Docker Desktop
注意:Windows用户需要确保开启了WSL 2或Hyper-V支持
Linux用户(以Ubuntu为例):
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) 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
# 验证安装
sudo docker run hello-world
2.2 安装Docker Compose
Docker Compose现在通常作为Docker Desktop的一部分自动安装。对于Linux用户,可以单独安装:
# 下载最新稳定版Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
2.3 配置国内镜像加速(可选)
为了加快镜像下载速度,可以配置国内镜像源:
- 创建或修改
/etc/docker/daemon.json文件 - 添加以下内容:
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
- 重启Docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
3. 编写你的第一个靶场Compose文件
现在,让我们创建一个完整的Pikachu靶场部署配置。我们将使用两个服务:Web服务器(Apache+PHP)和MySQL数据库。
3.1 项目结构准备
首先创建项目目录结构:
pikachu-docker/
├── docker-compose.yml
├── config/
│ └── php.ini
├── db/
│ └── init.sql
└── www/
└── (Pikachu源码)
将Pikachu的源码解压到www目录,这是我们的Web根目录。
3.2 完整的Compose文件解析
下面是完整的docker-compose.yml文件内容:
version: '3.8'
services:
web:
image: php:7.4-apache
container_name: pikachu-web
ports:
- "8080:80"
volumes:
- ./www:/var/www/html
- ./config/php.ini:/usr/local/etc/php/conf.d/custom.ini
depends_on:
- db
networks:
- pikachu-net
environment:
- APACHE_DOCUMENT_ROOT=/var/www/html
db:
image: mysql:5.7
container_name: pikachu-db
volumes:
- db_data:/var/lib/mysql
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
MYSQL_ROOT_PASSWORD: pikachu123
MYSQL_DATABASE: pikachu
MYSQL_USER: pikachu
MYSQL_PASSWORD: pikachu123
networks:
- pikachu-net
volumes:
db_data:
networks:
pikachu-net:
driver: bridge
让我们分解这个配置的关键部分:
Web服务配置:
- 使用
php:7.4-apache官方镜像,内置Apache和PHP 7.4 - 将本地
www目录挂载到容器的Web根目录 - 自定义PHP配置通过
php.ini文件挂载 - 映射主机8080端口到容器的80端口
数据库服务配置:
- 使用
mysql:5.7官方镜像 - 创建持久化卷
db_data来保存数据库数据 - 通过
init.sql初始化数据库结构和数据 - 设置root密码和创建专用数据库用户
网络配置:
- 创建专用桥接网络
pikachu-net,让两个容器可以互相通信 - 通过服务名
db可以直接在Web容器中访问数据库
3.3 初始化数据库脚本
在db/init.sql文件中,我们可以添加数据库初始化语句:
-- 创建数据库表结构
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);
-- 插入测试数据
INSERT INTO users (username, password) VALUES
('admin', 'pikachu'),
('test', '123456');
这个脚本会在MySQL容器首次启动时自动执行。
3.4 自定义PHP配置
在config/php.ini中,我们可以覆盖默认的PHP设置:
; 调整PHP错误报告级别
error_reporting = E_ALL
display_errors = On
; 调整上传文件大小限制
upload_max_filesize = 20M
post_max_size = 20M
; 设置时区
date.timezone = Asia/Shanghai
4. 部署与管理你的靶场环境
有了完整的Compose文件后,部署和管理靶场变得非常简单。
4.1 启动服务
在项目目录下运行:
docker-compose up -d
这个命令会:
- 拉取所需的镜像(如果本地不存在)
- 创建定义的网络和卷
- 按照依赖顺序启动所有服务
- 在后台运行容器(-d参数)
4.2 常用管理命令
| 命令 | 描述 | 示例 |
|---|---|---|
docker-compose up -d | 启动所有服务(后台运行) | - |
docker-compose down | 停止并移除所有容器 | - |
docker-compose ps | 查看服务状态 | - |
docker-compose logs | 查看服务日志 | docker-compose logs web |
docker-compose exec | 在运行中的容器执行命令 | docker-compose exec db mysql -u root -p |
docker-compose build | 重新构建自定义镜像 | - |
4.3 访问你的靶场
服务启动后,可以通过以下方式访问:
- Web界面:
http://localhost:8080 - 数据库连接:
- 主机:
db - 端口:
3306 - 用户名:
pikachu - 密码:
pikachu123
- 主机:
提示:在Web应用的数据库配置中,应该使用
db作为数据库主机名,而不是localhost,因为数据库运行在独立的容器中。
4.4 持久化与备份
Docker Compose使用卷来持久化数据:
- 数据库数据存储在
db_data卷中 - Web应用的代码和上传文件存储在本地
www目录
要备份整个环境,只需要:
- 备份
www目录和docker-compose.yml文件 - 备份数据库数据:
docker-compose exec db mysqldump -u root -ppikachu123 pikachu > backup.sql
5. 扩展与自定义你的靶场环境
基础环境运行起来后,你可能需要根据实际需求进行扩展和定制。
5.1 添加phpMyAdmin管理界面
修改docker-compose.yml,添加phpMyAdmin服务:
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: pikachu-pma
ports:
- "8081:80"
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: pikachu123
depends_on:
- db
networks:
- pikachu-net
启动后,可以通过http://localhost:8081访问数据库管理界面。
5.2 支持HTTPS访问
要启用HTTPS,我们可以:
- 生成自签名证书
- 修改Apache配置支持SSL
- 添加新的端口映射
首先,创建ssl目录并生成证书:
mkdir -p ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ssl/pikachu.key -out ssl/pikachu.crt \
-subj "/CN=pikachu.local"
然后修改Web服务配置:
web:
ports:
- "8080:80"
- "8443:443"
volumes:
- ./www:/var/www/html
- ./config/php.ini:/usr/local/etc/php/conf.d/custom.ini
- ./ssl:/etc/ssl/private
最后,在www目录下创建.htaccess文件启用HTTPS重定向:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
5.3 性能调优
根据你的硬件配置,可以调整容器的资源限制:
web:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.1'
memory: 256M
db:
deploy:
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.2'
memory: 512M
5.4 多靶场环境管理
如果你想同时运行多个不同的靶场,可以为每个靶场创建独立的Compose项目,并使用不同的端口和网络:
projects/
├── pikachu/
│ └── docker-compose.yml
├── dvwa/
│ └── docker-compose.yml
└── webgoat/
└── docker-compose.yml
启动特定靶场:
cd projects/pikachu
docker-compose up -d
6. 常见问题排查
即使有了容器化技术,偶尔也会遇到一些问题。以下是几个常见问题及其解决方法:
6.1 端口冲突
错误现象:
ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint pikachu-web: Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use
解决方法:
- 修改Compose文件中的端口映射,如将
8080:80改为8081:80 - 或者找出并停止占用端口的进程:
sudo lsof -i :8080
sudo kill <PID>
6.2 数据库连接失败
错误现象:Web应用无法连接到数据库
检查步骤:
- 确认数据库服务正在运行:
docker-compose ps - 检查数据库日志:
docker-compose logs db - 尝试手动连接:
docker-compose exec db mysql -u pikachu -ppikachu123 pikachu
常见原因:
- 数据库初始化脚本有语法错误
- 环境变量配置不正确
- 网络配置问题
6.3 文件权限问题
当Web应用需要写入文件时,可能会遇到权限问题。
解决方法:
- 确保挂载的本地目录有正确权限:
chmod -R a+rwX www
- 或者在Compose文件中指定用户:
web:
user: "1000:1000" # 使用当前主机用户
6.4 服务启动顺序问题
有些应用需要确保数据库完全准备好后才能启动。可以通过健康检查来解决:
db:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 5
web:
depends_on:
db:
condition: service_healthy
7. 将这套方法应用到其他靶场
掌握了Pikachu的部署方法后,你可以轻松地将同样的技术应用到其他Web靶场,如DVWA、WebGoat、bWAPP等。基本步骤都是类似的:
- 获取靶场源码
- 分析其依赖(Web服务器、数据库、特定PHP模块等)
- 编写对应的Compose文件
- 配置数据库初始化脚本
- 处理任何特殊的配置需求
例如,部署DVWA的Compose文件可能长这样:
version: '3'
services:
web:
image: vulnerables/web-dvwa
ports:
- "8080:80"
environment:
- PHP_ALLOW_URL_FOPEN=1
- PHP_MEMORY_LIMIT=512M
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: dvwa123
MYSQL_DATABASE: dvwa
MYSQL_USER: dvwa
MYSQL_PASSWORD: dvwa123
这种"一次编写,随处运行"的方式,让网络安全学习和实验变得更加高效。你可以在几分钟内搭建好一个全新的测试环境,而不用担心搞乱你的主机系统。
更多推荐


所有评论(0)