0%

关于docker的配置与使用

这篇博客记录下关于docker的配置使用的东西以及自己写的脚本和用法,免得日后需要用的时候忘了。

之前一直以为docker这玩意儿只能在物理机上使用,还因为Windows下Hyper-v和Vmware不兼容的问题搞得我一度很蛋疼,前两周听公开课发现原来这玩意儿可以直接用在虚拟机里,特别是linux下,不用啥复杂的配置,还快的一比,于是小小的操作了一下。

docker安装

这边我使用的linux版本是Ubuntu 20.04 LTS,安装过程记录如下(基本来自各大博客)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#卸载旧版本,这步对于以前安装过的需要。
sudo apt-get remove docker docker-engine docker.io containerd runc
#更新包索引
sudo apt-get update
#安装依赖
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
#添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#指纹 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88
#用18.04的库 我安装的时候好像还没20.04
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
#更新包索引
sudo apt-get update
#安装docker及相关组件
sudo apt-get install docker-ce docker-ce-cli containerd.io
#测试hello-world
sudo docker run hello-world
#给普通用户运行docker权限
sudo usermod -aG docker [用户名]
#重启
reboot

docker常用命令

下面记录常用的docker命令,其中ma5ker/pwndocker是我修改的skysider/pwndocker

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
#拉取docker image
docker pull ma5ker/pwndocker
#当前已有的image
docker images
docker image ls -a
#当前存在的容器
docker container ls -a
创建一个container
docker run -it ma5ker/pwndocker /bin/bash
#开启一个container
docker container start [containerID | containerName]
#停止一个container
docker container stop [containerID | containerName]
#attach到正在运行的docker 不过目前attach用exec代替
docker container attach [containerID | containerName]

#用container创建新image 连接dockerhub 可以push上去
docker commit [containerID | containerName] ma5ker/pwndocker

#我下面脚本需要的两条命令 创建一个指定image的docker 并设置卷挂载等
docker run \ # 固有
-d \ # 设置后台运行
--rm \ # 设置位如果这个container停止就将其删除 这样就不用每次手动删除了
-h hostname \ # container的主机名
--name cname \ # container 名字
-v path/cname:/ctf/work \ # 将path挂载到cname:/ctf/work
-p hostPort:containerPort # 将主机的端口映射到docker
--cap-add=SYS_PTRACE \ # 启用ptrace,没有这个设置 gdb无法调试
skysider/pwndocker #创建docker使用的image
#创建完使用docker exec打开一个终端
docker exec -it [containerID | containerName] /bin/bash

关于pwndocker

pwndocker是指的skysider/pwndocker,作者在里面预装了很多pwn需要用到的工具。但是因为里面没有vim的配置与LibSearcher(一个ctf需要用到的判断libc版本的库),我自己对他进行了后期加工,然后形成的ma5ker/pwndocker,然后因为上面命令记不住,我就写了个python脚本辅助使用,具体脚本如下:

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
#!/usr/bin/env python3
import argparse
import os
import sys
parser = argparse.ArgumentParser()

def parseInit():
parser.add_argument("-hn","--hostname", help="the hostname of docker", default=None)
parser.add_argument("-n","--name", help="the name of docker container", default=None)
parser.add_argument("-p","--port", help="the port of docker binding to host", default=0,type=int)
parser.add_argument("-f","--folder",help="the file folder mounted to docker", default=None)



def main():
parseInit()
args = parser.parse_args()
if len(sys.argv)== 1:
print("Use --help or -h to get help.")
exit()
hostname = args.hostname
dockername = args.name
port = args.port
folder = args.folder

cmd = "docker run -d --rm"
if hostname!=None:
cmd += " -h "+hostname
else:
print("[-]No hostname,will not add it")


if dockername!= None:
cmd += " --name "+dockername
else:
print("[-]Container name is needed to exec it or you have to attach to it manually.")


if port!=0:
cmd += " -p "+str(port)+":"+str(port)
else:
print("[-]No port given,will not bind to any port.")


if folder!=None:
if os.path.isdir(folder):
cmd += " -v "+os.path.realpath(folder)+":/ctf/work"
else:
print("[-]File path error,will not copy it into container")
else:
print("[-]File path error,will not copy it")

cmd += " --cap-add=SYS_PTRACE ma5ker/pwndocker"
print(cmd)
retcode = os.system(cmd)
retcode = retcode >> 8
if retcode!=0:
print("[-]Creating container error.")
exit()
print("[+]Creating container success")
cmd = "docker exec -it "+dockername+" /bin/bash"
print(cmd)
os.system(cmd)

if __name__=="__main__":
main()

#docker run -d --rm -h ${ctf_name} --name ${ctf_name} -v $(pwd)/${ctf_name}:/ctf/work -p 23946:23946 --cap-add=SYS_PTRACE skysider/pwndocker
#docker exec -it ${ctf_name} /bin/bash

大概就是这些,以后遇到其他的再补充。