这里写这个的话主要是为了记录这个学习docker的过程

参考文章1

参考文章2

docker安装方式自行google 很快就能安装好了

(之前只是简单的了解了一下docker 没咋用过 现在开始学习后才发现docker的强大)

  • ubuntu
  • nginx
  • php7.4-fpm

以上就是要用到地东西

拉取ubuntu镜像

docker pull ubuntu (不指定版本地话都是拉取最新的版本)

或者在Docker-desktop 里面搜索下载也是可以的

image-20230731141029597

1
docker run -it -p 8080:80 --name=ctf ubuntu(镜像ID)
1
exit   //是退出

启动一个已停止的容器:

1
docker start b750bbbcfd88 (镜像ID)

进入容器

1
2
3
docker attach b750bbbcfd88 (镜像ID)
或者
docker exec -it b750bbbcfd88 /bin/bash

安装命令前 先进行

1
apt update

安装nginx

这里的话直接是在Ubuntu里进行安装

1
apt install -y nginx    //-y  是全部默认的意思

nginx命令

1
2
3
4
5
6
7
8
# 关闭
service nginx stop
# 开启
service nginx start
# 状态
service nginx status
# 重启
service nginx restart

安装php

这里我选择的是php7.4版本

1
2
3
4
5
6
7
8
9
apt-get install -y software-properties-common

add-apt-repository ppa:ondrej/php
# 出现暂停,按回车键[ENTER]

apt-get update

apt-get install -y php7.4-fpm
# 必须得是按照顺序来

php7.4-fpm-命令

1
2
3
4
5
6
7
8
# 关闭
service php7.4-fpm stop
# 开启
service php7.4-fpm start
# 状态
service php7.4-fpm status
# 重启
service php7.4-fpm restart

安装Vim

1
apt install -y vim

环境配置与搭建

1
vi /etc/nginx/sites-available/default

image-20230731142244821

添加index.php 并且把下面指定的代码取消注释

启动nginx和php服务

1
2
3
4
5
6
# 检查 nginx 配置文件
nginx -t
# 重启 nginx
service nginx restart
# 启动 php7.4-fpm
service php7.4-fpm start

这里的nginx -t 可以用来检查修改的配置是否修改正确 如果修改错误的话会报错提醒

1
2
3
4
5
6
# 查看当前进程
ps -aux
# 查看 nginx 状态
service nginx status
# 查看 php7.4-fpm 状态
service php7.4-fpm status

检查这个nginxphp服务的运行状态

然后去访问一下开放的端口 看nginx是否在正常运行

image-20230731143616100

那么我们就去修改该目录下的文件 让其显示我们想要显示的内容

(将该html文件删除)

1
vi /var/www/html/index.php
1
2
3
4
<?php
highlight_file(__FILE__);
eval($_POST[1]);
?>

将上述内容写入 然后去访问

image-20230731143820087

成功写入

(假如这是我们要出的题目 那么我们就可以尝试去将其变成镜像 方便部署)

1
2
3
docker build -t ctf:v1 .   
// .的意思是把当前目录下的文件都给打包
// -t 后面是跟着镜像名字 :后面是标签 都可以自己定义

在构造镜像之前 我们要编写Dockerfile

(它的作用是能帮助我们起容器)

编写Dockerfile和docker-compose.yml

写这个的目的就是为了能帮助我们自动化部署环境

(例如就是自动安装nginxphp等等之类的工作)

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
FROM ubuntu

LABEL Author="Ke1nys"

#更新软件源
RUN apt-get update

#安装nginx
RUN apt install nginx -y

#安装php7.4-fpm
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php -y
RUN apt-get update
RUN apt-get install -y php7.4-fpm

#删除nginx默认html文件
RUN rm /var/www/html/index.nginx-debian.html

#将题目源码复制过去
COPY ./src/index.php /var/www/html/
COPY ./src/f1ag /
COPY ./src/default /etc/nginx/sites-available/default


RUN chmod -R 755 /var/www/html/ && \
chown -R root:root /var/www/html

#启用脚本

COPY ./run.sh /root/run.sh
RUN chmod +x /root/run.sh
ENTRYPOINT ["/root/run.sh"]

EXPOSE 8080

上面注释都写的很清楚了

接着写一个sh文件来帮我们自动化开启nginxphp

run.sh

1
2
3
4
5
6
7
8
9
10
#! /bin/bash

#启动nginx
service nginx start

#启动php
service php7.4-fpm start

# # never exit,此处是为了运行完上条应用服务后,有对应的前台进程
tail -f /dev/null

注释也是解释的很清楚了

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 指定该文件版本
version: '3'
# 把每个子目录视为一个镜像,开始构建
services:
src: #这个是文件目录名
# 此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明。
image: ctf/test1 #镜像名字
build: ./ #build的位置,docker会去web1中的dockerfile开始搭建
# restart: always
ports:
- "8080:80" #设置映射的断口
environment:
- FLAG=flag{this_is_test_flag} # 这里定义了flag,但是不会覆盖sh里的$FLAG
# - FLAG=flag{$(cat /proc/sys/kernel/random/uuid)} # 获取容器的uuid作为flag 会报错

注释也是写的很清楚了

dockerfiledocker-compose.yml 要与这个源码里的文件名对应上 不然会报错

最后完成的文件结构图

image-20230731145619175

1
docker build -t ctf:v1 .   

生成镜像

1
docker run -d -p 8080:80 -e 镜像id

运行该镜像

这样就能成功的将环境起起来了

外网部署

直接将文件发给自己的服务器上 然后执行

1
docker-compose up -d

这样就可以将题目成功的部署在外网上了

image-20230731150347683

(要记得开启题目所需的端口 不然可能会访问失败)

image-20230731150438136

这样就部署成功了