告别手动配置:用Docker Compose轻松搭建Web靶场环境

还在为每次搭建测试环境而重复安装Apache、MySQL和PHP吗?作为网络安全初学者,你可能已经习惯了下载源码包、配置数据库、修改php.ini这一系列繁琐操作。但今天,我要分享一个更高效的方法——用Docker Compose一键部署你的第一个Web靶场。

传统的手动搭建方式不仅耗时,还容易因为系统环境差异导致各种"玄学"问题。而容器化技术让这一切变得简单:只需一个YAML文件,就能在任何支持Docker的机器上快速复现完全一致的测试环境。下面,我将带你从零开始,用工程化的思维解决环境配置这个"脏活累活"。

1. 为什么选择Docker Compose来部署靶场?

在网络安全学习和实践过程中,测试环境的搭建往往是最耗时的环节。以常见的Pikachu靶场为例,传统部署方式需要:

  1. 下载并解压源码包
  2. 安装和配置Web服务器(如Apache或Nginx)
  3. 安装和初始化数据库(如MySQL)
  4. 修改各种配置文件以适应本地环境
  5. 处理可能出现的端口冲突、依赖缺失等问题

这个过程不仅繁琐,而且难以在不同机器间迁移。更糟糕的是,当你需要同时运行多个不同版本的靶场时,环境冲突几乎不可避免。

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用户

  1. 下载Docker Desktop安装包
  2. 双击运行安装程序,按照向导完成安装
  3. 安装完成后,在开始菜单中启动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 配置国内镜像加速(可选)

为了加快镜像下载速度,可以配置国内镜像源:

  1. 创建或修改/etc/docker/daemon.json文件
  2. 添加以下内容:
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
  1. 重启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

这个命令会:

  1. 拉取所需的镜像(如果本地不存在)
  2. 创建定义的网络和卷
  3. 按照依赖顺序启动所有服务
  4. 在后台运行容器(-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目录

要备份整个环境,只需要:

  1. 备份www目录和docker-compose.yml文件
  2. 备份数据库数据:
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,我们可以:

  1. 生成自签名证书
  2. 修改Apache配置支持SSL
  3. 添加新的端口映射

首先,创建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

解决方法:

  1. 修改Compose文件中的端口映射,如将8080:80改为8081:80
  2. 或者找出并停止占用端口的进程:
sudo lsof -i :8080
sudo kill <PID>

6.2 数据库连接失败

错误现象:Web应用无法连接到数据库

检查步骤:

  1. 确认数据库服务正在运行:docker-compose ps
  2. 检查数据库日志:docker-compose logs db
  3. 尝试手动连接:
docker-compose exec db mysql -u pikachu -ppikachu123 pikachu

常见原因:

  • 数据库初始化脚本有语法错误
  • 环境变量配置不正确
  • 网络配置问题

6.3 文件权限问题

当Web应用需要写入文件时,可能会遇到权限问题。

解决方法:

  1. 确保挂载的本地目录有正确权限:
chmod -R a+rwX www
  1. 或者在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等。基本步骤都是类似的:

  1. 获取靶场源码
  2. 分析其依赖(Web服务器、数据库、特定PHP模块等)
  3. 编写对应的Compose文件
  4. 配置数据库初始化脚本
  5. 处理任何特殊的配置需求

例如,部署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

这种"一次编写,随处运行"的方式,让网络安全学习和实验变得更加高效。你可以在几分钟内搭建好一个全新的测试环境,而不用担心搞乱你的主机系统。

更多推荐