关于使用docker的一些感想,持续更新中...
docker教程其实很早就在酝酿了,但因为自己天赋不高,搞不明白,一直没有出,近期由于有出题需求,不得不又拾起vm里藏灰了的docker,又深入学习了一番,这里就不得不提到网上的各种博客,看了好长时间都看不懂,浪费了大把时间,由此被我授予了无良博客的头衔。这篇博客主要是介绍一下CTF中出题所需要的docker操作。持续更新中……
docker配置教程
更换镜像源(阿里云)
选择性更换,如果再进行下面指令时没有报错,可以选择不更换
1 | sudo vim /etc/apt/source.list //打开存源文件 |
镜像源地址,全部复制进去
1 | deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib |
创建docker
1.下载docker镜像
1 | apt install docker.io |
2.搜索\下载 服务器镜像
1 | docker search pull //搜索服务器镜像,可以不搜 |
3.创建docker
1 | docker run -id --name 给docker取个名 -p 想开放的端口:80 服务器镜像名 |
4.普通题目复制
1 | 把文件拉到linux目录下 |
5.(可有可无)进入docker查看
1 | docker exec -it docker名 /bin/bash |
常用指令
查看docker容器状态
1 | docker ps |
查看docker镜像状态
1 | docker images |
新建docker容器
1 | docker run -id --name 起个名 -p 开放端口:映射端口 tutum/lamp |
1 | docker run -d -p 9999:80 tutum/lamp |
复制文件进入docker
1 | docker cp [本地路径] [container id]:[container 路径] |
查询宿主机ip
1 | ifconfig |
进入指定docker
1 | docker exec -it docker名字 /bin/bash |
退出当前docker容器
1 | exit |
导出容器
1 | docker export [dockerID] > Find.tar |
启动容器
1 | docker start 容器ID |
查看所有存在的容器
1 | docker container ls -a |
删除容器
1 | docker rm [container id]或者是[container name] |
模板介绍
十分感谢nss的师傅提供的模板啦,这里附上链接
1 | https://github.com/CTF-Archives/ctf-docker-template |
利用dockerfile和docker-compose出题
这里感谢f12大佬提供的帮助
这俩东西是什么?
在此之前,我们先来明确两个个概念;
(1)镜像:
什么是镜像?当我们在虚拟机启动docker后,运行docker images,我们所看到的就是我们docker里所拥有的镜像
上面的五列依次是 镜像名称 镜像标签 镜像id 镜像创建时间 镜像大小
(2)容器:
镜像是用来干什么的呢?当然是创建容器啦,当我们输入docker ps(查看在运行的容器)或者docker ps -a(查看所有容器)就可以看到容器
了解了这些基础,我们就可以继续下面的内容了
先介绍dockerfile:
dockerfile将一些需要执行的命令存储在这个文件中,在需要的时候自动执行。我们应该如何使用这个文件捏?这个时候就要提到docker builid这个指令了,使用格式如下
1 | docker build -t <镜像名称>:<镜像标签> <上下文路径> |
通常情况下,该命令会自动搜索.及其子目录下的名为dockerfile的文件
1 | -f 路径 |
对于以下代码的理解可以参考NSS的模板web-nginx-mysql-php73,附上截图
FROM
指定基础镜像,必须为第一个命令
1 | 格式: |
RUN
构建镜像时执行的命令
1 | RUN用于在构建镜像时执行命令,其有以下两种命令执行方式: |
ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
1 | 格式: |
COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD
1 | 格式: |
docker-compose:
docker-compse像是一个中控系统,他可以控制由他启动的所有容器,同时启动、同时关闭、同时删除等,命名一般为xxxxx.yaml,内容格式如下,以NSS模板web-nginx-mysql-php73为例
1 | 重点关注services部分,缩进一次的web和www为镜像名,缩进两次的为容器参数,例如开放端口、映射端口、容器名、启动的dockerfile位置(build参数),这样可以实现同时启动多个不同容器。 |
启动命令
1 | 在该目录下执行 |
这里就可以清楚的看到,我们执行docker-compose up -d后,启动了name4和name5这两个容器,然后构建了docker_www和docker_web这两个服务器镜像,此处的镜像是可以通过上述run命令二次使用的,注意docker-compose只能管理由docker-compose所启动的容器,而run启动的是不可以控制的。
1 | docker-compose restart //重启服务容器。 |
出题建议(web-nginx-mysql-php73)
基本框架
1 | . |
附上大佬的讲解视频,非常详细
1 | https://www.bilibili.com/video/BV1xW4y1Z7aa/?spm_id_from=333.999.0.0&vd_source=757ded406aff262d5f6010cb1a347a9a |
题目框架已经是非常完整的了,只需要按照自己的需求稍加修改就可以轻松出题啦!
删除部分
1 | shell.php |
修改部分
(1):connect.php
1 | 主要用于数据库连接,其中的参数可以进行修改,但一定注意要和dockerfile中的参数值保持一致,二者必须同时修改 |
(2):index.php、docker-entrypoint.sh、docker-compose.yaml
1 | 这三者主要是用于个性化的修改: |
(3):Dockerfile
1 | 根据上述介绍,将自己所需要执行的操作写入dockerfile,不放心的话可以自己本地测试一下 |
启动
完成上述操作后就可以启动容器啦,方法有2:
(1):如果只有一个容器,可以直接在你的dockerfile目录使用docker build命令进行创建
(2):如果有多个容器需要用到compose,那么可以在.yaml目录中执行docker-compose up -d