varcommitCommand=cli.Command{Name:"commit",Usage:"commit container to image,e.g. mydocker commit 123456789 myimage",Action:func(context*cli.Context)error{iflen(context.Args())<2{returnfmt.Errorf("missing container name and image name")}containerID:=context.Args().Get(0)imageName:=context.Args().Get(1)returncommitContainer(containerID,imageName)},}
root@mydocker:~/refactor-isolate-rootfs/mydocker# go build .
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker run -d -name rootfs busybox top
{"level":"info","msg":"createTty false","time":"2024-02-22T13:34:12+08:00"}{"level":"info","msg":"resConf:\u0026{ 0 }","time":"2024-02-22T13:34:12+08:00"}{"level":"info","msg":"lower:/var/lib/mydocker/overlay2/5341624332/lower image.tar:/var/lib/mydocker/image/busybox.tar","time":"2024-02-22T13:34:12+08:00"}{"level":"info","msg":"mount overlayfs: [/usr/bin/mount -t overlay overlay -o lowerdir=/var/lib/mydocker/overlay2/5341624332/lower,upperdir=/var/lib/mydocker/overlay2/5341624332/upper,workdir=/var/lib/mydocker/overlay2/5341624332/work /var/lib/mydocker/overlay2/5341624332/merged]","time":"2024-02-22T13:34:12+08:00"}{"level":"info","msg":"command all is top","time":"2024-02-22T13:34:12+08:00"}
查看容器
1
2
3
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
5341624332 rootfs 219016 running top 2024-02-22 13:34:12
查看/var/lib/mydocker/overlay2 目录下是否生成对应内容
1
2
3
4
5
6
7
root@mydocker:/var/lib/mydocker/overlay2# cd /var/lib/mydocker/overlay2/5341624332
root@mydocker:/var/lib/mydocker/overlay2/5341624332# ls
lower merged upper work
root@mydocker:/var/lib/mydocker/overlay2/5341624332# ls lower
bin dev etc home proc root sys tmp usr var
root@mydocker:/var/lib/mydocker/overlay2/5341624332# ls merged/
bin dev etc home proc root sys tmp usr var
root@mydocker:/var/lib/mydocker/overlay2/5341624332# ls merged/
a.txt bin dev etc home proc root sys tmp usr var
root@mydocker:/var/lib/mydocker/overlay2/5341624332# cat merged/a.txt
KubeExplorer
至此,说明 rootfs 调整一切正常。
commit 命令
接下来测试一下 mydocker commit 命令,把刚才启动的容器提交为镜像。
1
2
3
4
5
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
5341624332 rootfs 219016 running top 2024-02-22 13:34:12
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker commit 5341624332 busybox-with-custom
{"level":"info","msg":"commitContainer imageTar:/var/lib/mydocker/image/busybox-with-custom.tar","time":"2024-02-22T13:43:33+08:00"}
然后查看 var/lib/mydocker/image/ 目录是否生成了对应的镜像文件
1
2
3
root@mydocker:/var/lib/mydocker/overlay2/5341624332# cd /var/lib/mydocker/image/
root@mydocker:/var/lib/mydocker/image# ls
busybox-with-custom.tar busybox.tar
busybox-with-custom.tar 就是 commit 命令生成的镜像。
接下来使用该镜像启动一个容器,查看之前创建的文件是否存在
1
2
3
4
5
6
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker run -d -name rootfs2 busybox-with-custom top
{"level":"info","msg":"createTty false","time":"2024-02-22T13:45:53+08:00"}{"level":"info","msg":"resConf:\u0026{ 0 }","time":"2024-02-22T13:45:53+08:00"}{"level":"info","msg":"lower:/var/lib/mydocker/overlay2/8118341786/lower image.tar:/var/lib/mydocker/image/busybox-with-custom.tar","time":"2024-02-22T13:45:53+08:00"}{"level":"info","msg":"mount overlayfs: [/usr/bin/mount -t overlay overlay -o lowerdir=/var/lib/mydocker/overlay2/8118341786/lower,upperdir=/var/lib/mydocker/overlay2/8118341786/upper,workdir=/var/lib/mydocker/overlay2/8118341786/work /var/lib/mydocker/overlay2/8118341786/merged]","time":"2024-02-22T13:45:53+08:00"}{"level":"info","msg":"command all is top","time":"2024-02-22T13:45:53+08:00"}
进入容器查看内容
1
2
3
4
5
6
7
8
9
10
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
5341624332 rootfs 219016 running top 2024-02-22 13:34:12
8118341786 rootfs2 219109 running top 2024-02-22 13:45:53
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker exec8118341786 /bin/sh
{"level":"info","msg":"container pid:219109 command:/bin/sh","time":"2024-02-22T13:46:14+08:00"}got mydocker_pid=219109got mydocker_cmd=/bin/sh
/ # cat a.txtKubeExplorer
可以看到,提交的镜像中包含了我们新建的 a.txt 文件,说明 commit 命令也是正常的。
rm 命令
最后测试一下 mydocker rm 命令,能否删除镜像配置和对应的 rootfs 目录。
ps 命令拿到 id
1
2
3
4
root@mydocker:~/refactor-isolate-rootfs/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
5341624332 rootfs 219016 running top 2024-02-22 13:34:12
8118341786 rootfs2 219109 running top 2024-02-22 13:45:53