一,首先安装docker
方法一(推荐):
根据视频一步一步来即可适合纯小白
网址:https://xuanyuan.cloud/
视频:https://www.bilibili.com/video/BV1dJnnzQERH/?vd_source=26fc034ceb89f80b845328dd1a4608c5
重启服务生效
1 2 3 4 5
| sudo systemctl daemon-reload sudo systemctl restart docker
docker info | grep Mirrors -A 2
|
方法二(一步一步来):
1. 准备工作
1 2 3 4 5
| # 更新系统 sudo apt update && sudo apt full-upgrade -y
# 安装依赖 sudo apt install -y ca-certificates curl gnupg lsb-release
|
2. 添加 Docker 官方 GPG 密钥
1 2
| sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
3. 设置稳定版仓库
1 2
| echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
4. 安装 Docker 引擎
1 2
| sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
5. 验证安装
1 2
| sudo docker run hello-world # 看到 "Hello from Docker!" 表示成功
|
6.配置 Docker 国内镜像加速器
1.创建配置文件
1
| sudo vim /etc/docker/daemon.json
|
2.添加镜像加速器(2025最新)
首选轩辕镜像站吧
https://xuanyuan.cloud/install/linux
1
| bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
|
次选是自己修改配置文件
1 2 3 4 5 6 7 8 9 10 11 12
| { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.imgdb.de", "https://docker-0.unsee.tech", "https://docker.hlmirror.com", "https://docker.1ms.run", "https://func.ink", "https://lispy.org", "https://docker.xiaogenban1993.com" ] }
|
3.重启服务生效
1 2 3 4 5
| sudo systemctl daemon-reload sudo systemctl restart docker
docker info | grep Mirrors -A 2
|
二,下载出题模板
ctftraining大佬的模板
如果需要用到mysql下载这个
1
| https://github.com/CTFTraining/base_image_nginx_mysql_php_73
|
不需要下载这个
1
| https://github.com/CTFTraining/base_image_nginx_php_73
|
当然也有5.6版本的按需下来
CTF-Archives大佬的模板
根据名字选择模板
1
| https://github.com/CTF-Archives/ctf-docker-template
|
三,具体搭建教程
接下来我以ctftraining模板加GZCTF平台来举例
不需要mysql环境的php环境的题的搭建教程
基础文件及配置介绍
根据模板下载下来目录结构为
1 2 3 4 5
| 项目根目录/ ├── Dockerfile └── src/ ├── flag.sh └── index.php
|
其中Dockerfile内容为(基本不用改)
1 2 3 4 5
| FROM ctftraining/base_image_nginx_php_73
COPY src /var/www/html
RUN mv /var/www/html/flag.sh / && chmod +x /flag.sh
|
src是放源码的地方
其中index.php是题目源代码,当然这里你也可以加其他文件,到时候都会被移动到网站根目录。
以正则第一题为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| <!DOCTYPE html> <html> <head> <title>正则表达式考核</title> </head> <style> .red{ color: red; } .green{ color:green; } .text-container { max-width: 1000px; } .no-select { user-select: none; } input[type="text"] { width: 300px; height: 20px; }
</style>
<body> <h1>正则表达式考核</h1> <form class="no-select" method="POST" id="Form"> <div class="text-container"> <p>你好,Hacker</p> <p>你能找到我的flag吗?</p> <p class="green">flag</p> <p class="red">fl@g</p> <p class="red">1lag</p> <p class="red">fiag</p> <p class="green">f1ag</p> <p class="red">fIag</p> <p class="red">flcg</p> <p>请写出正则表达式,让其只能匹配flag和f1ag,匹配不到其他的假flag。</p> <p>本次考核只需要输入表达式符号即可,比如按照 ^(hello),world$ 格式进行输入</p> <input type="text" name="regex" placeholder="输入正则表达式"> <!-- 提交按钮 --> <input type="submit" value="提交"> </div> </form>
<?php
error_reporting(0); // 修改为0以禁用错误报告 // 假设flag.php存在并且包含了$flag变量 include "flag.php";
// 检查是否有POST请求 if ($_SERVER["REQUEST_METHOD"] == "POST") { $regex =$_POST['regex'] ?? '';
if (empty($regex)) { echo "<p>你的表达式呢?</p>"; } else { $return_data = matchRegex($regex);
echo "<p>$return_data</p>";
if ($return_data === '给你我的flag') { echo "<p>$flag</p>"; } } }
function matchRegex($regex) { if (preg_match("/$regex/", 'flag') && preg_match("/$regex/", 'f1ag')) { if (!preg_match("/$regex/", 'fl@g') && !preg_match("/$regex/", '1lag') && !preg_match("/$regex/", 'flcg') && !preg_match("/$regex/", 'fIag') && !preg_match("/$regex/", 'fiag')) { return '给你我的flag'; } else { return '额,你再看看你匹配的对吗?'; } } else { return '要不你再去学会正则表达式?'; } } ?>
</body>
</html>
|
这里我们还需要设置flag.php来让它获得到flag
flag.php
1 2 3
| <?php $flag = "flag{testflag}";
|
flag.sh
1 2 3 4
| #!/bin/sh sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/flag.php export GZCTF_FLAG="" rm -rf /flag.sh
|
本地开始搭建
- 在linux系统下首先cd到Dockerfile所在目录

1 2 3 4
| 执行命令 docker build -t 镜像名 . docker build -t zjl3131/regex_flag_1 .
|
执行后会进行下载,耐心等待即可

下载完成后会再次出现交互框
此时输入
可以查看到镜像已经生成成功了

- 开始尝试镜像是否无问题存在
1 2 3 4 5
| docker启动镜像
docker run -d -p 8080:80 -e GZCTF_FLAG=flag{111} image_name
|
docker查看镜像创建容器是否成功
显示映射端口即为成功

尝试访问一下进行题目测试

题目正常
开始上传服务器
我们需要把
镜像是以一种特殊形式存储在本地docker仓库,我们不能直接拿出来用,所以需要先把镜像打包一下
1 2 3 4 5
| docker打包镜像
docker save 镜像名 > xxx.tar docker save zjl3131/regex_flag_1 > regex_flag_1.tar
|
这个时候在目录下就存在一个压缩包

把他通过服务器的ftp传上去


然后cd到这个目录

然后解压这个包取出镜像
1 2 3
| docker load -i regex_flag_1.tar
docker images
|

打开GZCTF
1.登录管理员账号,进入配置页面

进入配置页面,新建比赛

具体配置可以参考以前比赛的设置
然后我们直接从新建题目开始

web如下配置


这个地方要填镜像名
1 2
| zjl3131/regex_flag_1:latest
|
然后创建测试容器继续测试即可
常用docker命令
1 2
| docker ps docker images
|
0x1. docker重启容器
1 2 3 4 5
| docker restart 名称/ID docker start 名称/ID docker kill 名称/ID docker-compose restart 名称/ID 重启
|
0x02. docker创建镜像
0x03. docker删除镜像
1 2
| docker rmi 名称/ID docker rmi -f 名称/ID
|
0x04. docker停止并删除容器
1 2 3 4
| docker stop 名称/ID docker rm 名称/ID docker stop $(docker ps -aq) docker rm $(docker ps -aq)
|
0x05. docker打包镜像
1
| docker save 镜像名 > xxx.tar
|
0x06. docker解压镜像
1
| docker load -i image.tar
|
0x07. docker启动镜像
1
| docker run -d -p 8080:80 -e GZCTF_FLAG=flag{111} image_name
|
0x08. docker进入到容器内部
1 2 3 4 5
| docker exec -it 容器id /bin/sh 退出exit
docker exec -it 容器id /bin/sh 退出ctrl + D
|