关键词:docker, compose.yml
1. docker,容器
docker 是现代容器技术中最经典、最具代表性的实现。容器是操作系统级虚拟化的一种隔离方案,依赖于宿主机内核的特定功能(命名空间Namespace、控制组Cgroups)来创建隔离空间,多个容器共享同一个宿主机操作系统内核。
- 最常见、使用最广泛的容器实现是docker,通常提到容器的时候指的就是docker;
- docker是一种轻量级的隔离方案,启动速度快;
- 适合用于搭建漏洞验证测试的靶场环境,通过docker-compose.yml配置文件,可以完整描述靶场的网络、服务、卷、环境等依赖变量,提供干净的 、可快速重置的环境。(相较于虚拟机,每次docker run或docker compose up指令后都会基于容器镜像创建一个全新的、与初始状态完全一致的环境,没有历史操作残留。)
docker镜像与虚拟机镜像的对比
|----------|---------------------------------------------------|----------------------------------------------------|
| 维度 | 虚拟机镜像(如 .iso, .vmdk) | Docker 镜像 |
| 包含内容 | 完整的操作系统(内核 + 完整系统文件)+ 应用 | 不含内核,只包含应用及其依赖的用户空间文件(如库、配置、二进制文件) |
| 底层原理 | 基于硬件虚拟化,每个虚拟机有独立的 Guest OS,通过 Hypervisor 模拟硬件 | 基于容器化,所有容器共享宿主机的内核,通过 Namespace 和 Cgroups 实现隔离 |
| 大小 | 通常 几百 MB 到几 GB | 通常 几十 MB 到几百 MB |
| 启动速度 | 分钟级(需启动整个操作系统) | 秒级(本质是进程级启动) |
2. docker 常用指令
关键指令:
- 拉取镜像 docker pull
- 启动容器 docker run
- 构建并启动容器环境 docker compose up -d
- 验证环境 docker compose ps
- 清理环境 docker down -v
启动靶场环境时,常用的docker指令合集(一)
|------------------------------------------------|------------------|
| 命令 | 说明 |
| docker compose up -d | #启动环境(后台) |
| docker compose ps | #启动环境验证:查看运行状态 |
| docker compose logs docker compose logs -f web | #查看日志 #查看某个服务的日志 |
| docker compose down | #停止并删除环境(保留卷) |
| docker compose down -v | #完全清除(包括卷) |
| docker exec -it lab_attacker_1 /bin/bash | #进入某个容器(如攻击机) |
2.1 docker compose
💡Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个docker-compose.yml 文件,可以配置应用的服务、网络、卷等,然后使用一条命令启动或停止整个应用栈。
启动靶场时,最常用的指令:
bash
sudo docker compose up -d
参数:-d,detach,后台运行,
加上该参数后,容器会在后台启动,终端不会附着到容器的日志输出,命令行会立即返回。这对于在服务器上长期运行靶场环境非常实用,避免因 SSH 断开导致容器终止。
指令含义:docker compose up 会根据 docker-compose.yml文件,
- 检查并创建所需的网络、卷;
- 拉取或构建镜像;
- 按照定义的顺序启动服务容器。
其他变体、关联指令:
docker compose up(不加-d):前台运行,日志直接输出,按Ctrl+C会停止所有容器。docker compose down:停止并删除所有容器、网络(默认保留卷)。docker compose down -v:同时删除卷,彻底清理环境。
(可以将docker compose up理解为一个"声明式"的启动脚本)
2.2 compose.yml
靶场的docker文件通常包含(1)docker-compose.yml;(2)可能的dockerfile;(3)配置文件;
- docker-compose.yml:核心编排文件;
- dockerfile:如果需要构建自定义镜像;
- 其他配置文件:例如
.env,docker-entrypoint.sh等;
2.3 docker pull, run, compose up
什么时候使用docker pull拉取镜像,什么时候使用docker run启动容器,什么时候使用docker compose up运行靶场环境?
- docker pull
- 作用:从镜像仓库(如 Docker Hub)下载镜像到本地。
- 在靶场部署中:如果使用的是现成的镜像(例如 VulHub 提供),无需构建,只需拉取即可。
- docker run
- 作用:基于一个镜像创建并启动单个容器。
- 使用场景 :启动一个独立的容器,不依赖其他服务。
docker run往往用于调试或临时运行工具容器(如攻击机)。
- docker compose up
- 作用 :根据
docker-compose.yml文件,以声明式的方式管理多个容器的生命周期(创建、启动、网络、卷等); - 使用场景 :
- 多容器应用,服务之间存在依赖关系(如 Web 依赖数据库);
- 需要统一管理网络、卷,确保容器之间能够互相通信;
- 需要可重复、可移植的环境部署(只需携带
docker-compose.yml和相关文件,即可在任何有 Docker Compose 的机器上复现)。
- 在靶场部署中 :大多数漏洞靶场(如 VulHub、DVWA 的多容器版本、Splunk 等)都提供
docker-compose.yml,因此使用docker compose up是最便捷的方式;
💡 回顾思考:为什么docker适合用来搭建靶场?
- 环境一致性:同一个镜像在任何机器上运行时,行为完全一致;
- 免配置 :用户不需要知道漏洞环境需要装什么软件、改什么配置,一条
docker-compose up即可启动;- 可复现:如果靶场需要自定义,用户可以修改 Dockerfile 后重新构建,保证了灵活性;
3. 应用:Vulhub靶场
Vulhub快速入门指南参考 https://vulhub.org/zh/getting-started
1. 选择漏洞环境:每个目录代表一个不同的漏洞应用程序
2. 启动环境:使用docker Compose构建并启动漏洞环境(可以理解为编排式快速启动)
bash
cd vulhub/spring/CVE-2022-22947
docker compose up -d
docker compose 命令默认读取当前目录下的 docker-compose.yml(或 compose.yaml)文件。
3. 访问应用程序:环境运行后,通过浏览器访问漏洞应用程序;
4. 测试完成后清理环境:
bash
docker compose down -v
前置准备阶段:在本地任意目录下使用git克隆vulhub仓库
bash
git clone --depth 1 https://github.com/vulhub/vulhub.git
💡其他 | 管理Vulhub环境时可能会需要用到的docker指令
**1. 检查环境状态:**显示当前漏洞环境中所有容器的状态,包括访问漏洞服务所需的端口映射。
bash
docker compose ps
2. 检查Web服务器或应用程序配置(检查容器内的配置文件):
- 在Web容器中检查Apache配置
bash
docker compose exec web cat /etc/apache2/apache2.conf
- 查看PHP配置
bash
docker compose exec web php -i
3. 其他环境管理操作
- 查看日志
bash
docker compose logs -f
- 重建环境
bash
docker compose build --no-cache
- 访问容器的shell
bash
docker compose exec [service_name] bash
💡其他 | docker-compose.yml的修改可调整:
- 更改暴露的端口
- 添加持久卷
- 修改环境变量
- 与其他容器链接
附:其他docker指令
镜像操作、容器操作、网络与卷、日志与卷
|----------|-----------------------------------------|--------------------------------------------------------|
| 指令类型 | 命令 | 说明 |
| 镜像操作 | docker pull <image> | 从仓库拉取镜像 |
| | docker images | 列出本地镜像 |
| | docker rmi <image> | 删除镜像 |
| | docker build -t <name> . | 基于 Dockerfile 构建镜像 |
| 容器操作 | docker run <image> | 创建并启动容器(常用参数:-d 后台运行,-p 端口映射,-v 挂载卷,--name 命名) |
| | docker ps | 列出运行中的容器 |
| | docker ps -a | 列出所有容器(包括停止的) |
| | docker stop<container> | 停止容器 |
| | docker start <container> | 启动已停止的容器 |
| | docker restart <container> | 重启容器 |
| | docker rm <container> | 删除容器(加 -f 强制删除运行中的容器) |
| | docker exec -it <container> /bin/bash | 进入容器内部执行命令 |
| 网络与卷 | docker network ls | 列出网络 |
| | docker network create <name> | 创建自定义网络 |
| | docker volume ls | 列出卷 |
| | docker volume rm <name> | 删除卷 |
| 日志与资源 | docker logs <container> | 查看容器日志(加 -f 实时跟踪) |
| | docker stats | 实时查看容器资源占用 |
| | docker inspect <container> | 查看容器的详细信息(IP、配置等) |
附:docker 镜像与仓库
docker镜像、docker hub与Github、从虚拟机镜像与docker镜像的对比理解
Docker Hub:远程镜像仓库,用于存储和分发(分享)镜像。
- Docker Hub 是远程的 。是一个由 Docker 公司托管的公共镜像仓库,可以把它理解为 Docker 官方的"应用商店"或 GitHub 的镜像版。
- 核心作用是存储和分发镜像: 开发者可以将自己构建的镜像推送到 Docker Hub,其他人则可以从上面拉取现成的镜像(如
nginx、mysql、ubuntu),无需自己从零搭建环境。(类似于 Maven 中央仓库 之于 Java,或者 npm 仓库 之于 Node.js,只不过它存放的不是代码包,而是完整的、可运行的软件环境。)
安装docker后本地没有默认的基础镜像,需要主动拉取: 安装 Docker 本身不会 自动提供任何基础镜像(如 ubuntu、alpine)。第一次运行 docker run hello-world 时,Docker 会从 Docker Hub 拉取 hello-world 镜像,然后运行它。如果需要某个基础镜像(比如 ubuntu),必须显式执行 docker pull ubuntu 或在 docker run 时自动拉取。
拉取后的镜像会保存到本地,可重复使用: 执行 docker pull 时,Docker 会将镜像下载到本地,并存储在 Docker 的缓存目录中(通常是 /var/lib/docker/ 下)。之后再运行容器时,会直接使用本地已保存的镜像,不会再次下载(除非指定了 --pull always 强制重新拉取)。可以通过指令docker images查看本地已保存的镜像。
**虚拟机镜像与docker镜像:**虚拟机镜像包含完整 OS(含内核),Docker 镜像不含内核,更轻量,依赖宿主机内核。
附:其他容器技术
- Windows Server Container/Hyper-V Isolation:微软原生支持的容器技术,让容器可以在 Windows 生态中运行 .NET 应用等;
- Podman :Red Hat 开发,最大的特点是无守护进程 且兼容 Docker 命令, 采用
fork/exec模型,在容器直接作为用户进程的子进程运行,拥有更好的权限隔离,默认支持无根模式,安全性更高; - LXC/LXD :LXC 是 Linux 上最早的容器技术之一,可以看作是一种轻量级虚拟机。它启动一个完整的系统环境,更接近传统虚拟机的体验。
小结:大多数成熟项目的做法是,将构建好的镜像推送到Docker Hub,用户只需要拉取。在安装Vulhub的时候第一步是使用git克隆仓库到本地:
git clone --depth 1https://github.com/vulhub/vulhub.git,下载的文件目录中,每个目录代表一个不同的漏洞应用程序,每个目录下通常有每个漏洞对应的docker-compose.yml和dockerfile文件,快速启动漏洞容器环境的方法是在目标漏洞目录下使用docker compose up -d命令启动容器。docker compose命令默认读取当前目录下的docker-compose.yml(或compose.yaml)文件。此时会基于compose.yml文件从docker hub拉取镜像。
参考
1\] 《Web漏洞解析与攻防实战》 \[2\] [https://vulhub.org/zh/getting-started](https://vulhub.org/zh/getting-started "https://vulhub.org/zh/getting-started")