Docker
2026/5/29工具通用工具工具通用工具Docker大约 6 分钟
Docker
链接
是什么
Docker 是一款开源的容器化平台,用于自动化应用程序的部署、扩展和管理。在 CTF 竞赛中,Docker 主要用于:
- 靶场部署:快速部署 CTF 训练环境
- 漏洞复现:复现各种已知漏洞环境
- 环境隔离:为不同工具和环境提供隔离空间
- 团队协作:统一开发和测试环境
核心概念:
- 镜像(Image):只读模板,包含运行应用所需的所有内容
- 容器(Container):镜像的运行实例
- Dockerfile:定义镜像构建过程的文件
- Docker Compose:定义和运行多容器应用
安装与配置
安装方法
# Linux
# Ubuntu/Debian
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
# CentOS/RHEL
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
# Arch Linux
sudo pacman -S docker docker-compose
sudo systemctl start docker
sudo systemctl enable docker
# macOS
# 下载 Docker Desktop:https://www.docker.com/products/docker-desktop
# Windows
# 下载 Docker Desktop:https://www.docker.com/products/docker-desktop
# 需要启用 WSL2
# 验证安装
docker --version
docker-compose --version配置镜像加速
# 创建或编辑 /etc/docker/daemon.json
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]
}
EOF
# 重启 Docker
sudo systemctl restart docker权限配置
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
# 重新登录后生效
# 或使用 sudo 运行 docker 命令
sudo docker run hello-world基本用法
镜像操作
# 搜索镜像
docker search ubuntu
# 拉取镜像
docker pull ubuntu:20.04
docker pull python:3.9
# 查看本地镜像
docker images
# 删除镜像
docker rmi image_name
# 删除所有未使用的镜像
docker image prune
# 构建镜像
docker build -t my_image:latest .
# 给镜像打标签
docker tag my_image:latest my_image:v1.0
# 推送镜像到仓库
docker push my_image:latest容器操作
# 运行容器
docker run -it ubuntu:20.04 /bin/bash # 交互模式
docker run -d ubuntu:20.04 sleep 1000 # 后台模式
docker run -p 8080:80 nginx # 端口映射
docker run -v /host/path:/container/path ubuntu # 挂载卷
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 停止容器
docker stop container_id
# 启动已停止的容器
docker start container_id
# 重启容器
docker restart container_id
# 进入运行中的容器
docker exec -it container_id /bin/bash
# 查看容器日志
docker logs container_id
# 删除容器
docker rm container_id
# 删除所有已停止的容器
docker container pruneDockerfile 编写
# 基础镜像
FROM ubuntu:20.04
# 维护者信息
MAINTAINER CTF Player <player@ctf.com>
# 设置工作目录
WORKDIR /app
# 安装依赖
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
gcc \
gdb \
&& rm -rf /var/lib/apt/lists/*
# 复制文件
COPY . /app
# 安装 Python 依赖
RUN pip3 install -r requirements.txt
# 暴露端口
EXPOSE 8080
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 运行命令
CMD ["python3", "app.py"]Docker Compose
# docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "8080:8080"
volumes:
- .:/app
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: ctf
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看日志
docker-compose logs
# 重建服务
docker-compose up -d --buildCTF常用技巧
部署 CTF 靶场
# 使用 Docker 部署 Web 靶场
docker run -d -p 8080:80 vulhub/spring:4.3.6
# 使用 Docker Compose 部署复杂靶场
git clone https://github.com/vulhub/vulhub.git
cd vulhub/spring/CVE-2018-1270
docker-compose up -d
# 访问靶场
curl http://localhost:8080部署 Pwn 靶场
# Dockerfile.pwn
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
socat \
&& rm -rf /var/lib/apt/lists/*
COPY vuln /home/ctf/vuln
COPY flag /home/ctf/flag
RUN chmod +x /home/ctf/vuln && \
chmod 444 /home/ctf/flag
EXPOSE 1337
CMD ["socat", "TCP-LISTEN:1337,reuseaddr,fork", "EXEC:/home/ctf/vuln"]# 构建并运行
docker build -t pwn_challenge -f Dockerfile.pwn .
docker run -d -p 1337:1337 pwn_challenge
# 测试连接
nc localhost 1337部署 Web 应用
# Dockerfile.web
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python3", "app.py"]# 构建并运行
docker build -t web_app .
docker run -d -p 5000:5000 web_app使用 Vulhub 靶场
# 克隆 Vulhub 仓库
git clone https://github.com/vulhub/vulhub.git
cd vulhub
# 进入特定漏洞目录
cd weblogic/CVE-2017-10271
# 启动靶场
docker-compose up -d
# 查看靶场状态
docker-compose ps
# 停止靶场
docker-compose down
# 常用靶场目录:
# web/ # Web 漏洞
# redis/ # Redis 漏洞
# mysql/ # MySQL 漏洞
# nginx/ # Nginx 漏洞
# apache/ # Apache 漏洞
# tomcat/ # Tomcat 漏洞
# spring/ # Spring 漏洞
# struts2/ # Struts2 漏洞环境隔离
# 为不同工具创建独立环境
# Python 环境
docker run -it -v $(pwd):/workspace python:3.9 bash
# Java 环境
docker run -it -v $(pwd):/workspace openjdk:11 bash
# Go 环境
docker run -it -v $(pwd):/workspace golang:1.17 bash
# C/C++ 环境
docker run -it -v $(pwd):/workspace gcc:latest bash网络配置
# 创建自定义网络
docker network create ctf_network
# 运行容器并连接到自定义网络
docker run -d --network ctf_network --name web web_app
docker run -d --network ctf_network --name db mysql:8.0
# 容器间通信
# web 容器可以使用 db 作为主机名连接数据库
# 查看网络
docker network ls
docker network inspect ctf_network数据持久化
# 使用卷(Volume)
docker volume create ctf_data
docker run -d -v ctf_data:/app/data my_image
# 使用绑定挂载(Bind Mount)
docker run -d -v /host/path:/container/path my_image
# 查看卷
docker volume ls
docker volume inspect ctf_data资源限制
# 限制 CPU
docker run -d --cpus="1.5" my_image # 最多使用 1.5 个 CPU
# 限制内存
docker run -d --memory="512m" my_image # 最多使用 512MB 内存
# 限制内存和 CPU
docker run -d --memory="512m" --cpus="1" my_image安全配置
# 以非 root 用户运行
docker run -d --user 1000:1000 my_image
# 只读文件系统
docker run -d --read-only my_image
# 限制 capabilities
docker run -d --cap-drop=ALL my_image
# 使用安全配置文件
docker run -d --security-opt=no-new-privileges my_image调试容器
# 查看容器详细信息
docker inspect container_id
# 查看容器进程
docker top container_id
# 查看容器资源使用
docker stats container_id
# 进入运行中的容器
docker exec -it container_id /bin/bash
# 查看容器日志
docker logs -f container_id导出和导入
# 导出容器为 tar 文件
docker export container_id > container.tar
# 从 tar 文件导入为镜像
docker import container.tar my_image:latest
# 保存镜像为 tar 文件
docker save my_image:latest > image.tar
# 从 tar 文件加载镜像
docker load < image.tar常见问题
权限不足
解决:
# 使用 sudo
sudo docker run hello-world
# 或将用户添加到 docker 组
sudo usermod -aG docker $USER
# 重新登录镜像拉取失败
解决:
# 配置镜像加速
# 编辑 /etc/docker/daemon.json
# 添加镜像源
# 或使用代理
export HTTP_PROXY=http://proxy:port
export HTTPS_PROXY=http://proxy:port容器无法启动
解决:
# 查看日志
docker logs container_id
# 检查端口是否被占用
netstat -tulpn | grep port
# 检查资源限制
docker stats磁盘空间不足
解决:
# 清理未使用的资源
docker system prune
# 清理所有未使用的资源(包括卷)
docker system prune -a --volumes
# 查看磁盘使用
docker system df网络问题
解决:
# 检查网络配置
docker network ls
docker network inspect bridge
# 创建自定义网络
docker network create my_network
# 检查 DNS 配置
docker exec container_id cat /etc/resolv.conf性能问题
解决:
# 限制资源使用
docker run -d --memory="512m" --cpus="1" my_image
# 使用更小的基础镜像
# 使用 alpine 版本
docker pull python:3.9-alpine
# 优化 Dockerfile
# 合并 RUN 指令
# 使用多阶段构建文件权限问题
解决:
# 在 Dockerfile 中设置权限
RUN chmod 755 /app/script.sh
# 使用 --user 参数
docker run --user $(id -u):$(id -g) my_image
# 使用卷时注意权限
docker run -v /host/path:/container/path:Z my_image