美文网首页
[mydocker]---实现保存镜像

[mydocker]---实现保存镜像

作者: nicktming | 来源:发表于2019-05-11 09:57 被阅读0次

    1. 准备工作

    1.1 准备环境

    root@nicktming:~/go/src/github.com/nicktming/mydocker# git clone https://github.com/nicktming/mydocker.git
    root@nicktming:~/go/src/github.com/nicktming/mydocker# git checkout code-4.3
    root@nicktming:~/go/src/github.com/nicktming/mydocker# git checkout -b dev-4.4
    

    1.2 本文最终效果

    -------------------------------terminal 01--------------------------------
    root@nicktming:/nicktming# pwd
    /nicktming
    root@nicktming:/nicktming# ls
    busybox.tar  volume
    root@nicktming:/nicktming# tree volume/
    volume/
    `-- test01.txt
    
    0 directories, 1 file
    root@nicktming:/nicktming# cat volume/test01.txt 
    volume
    volume again
    root@nicktming:/nicktming# 
    
    -------------------------------terminal 02--------------------------------
    root@nicktming:~/go/src/github.com/nicktming/mydocker# git clone https://github.com/nicktming/mydocker.git
    root@nicktming:~/go/src/github.com/nicktming/mydocker# git checkout code-4.4
    root@nicktming:~/go/src/github.com/nicktming/mydocker# go build .
    root@nicktming:~/go/src/github.com/nicktming/mydocker# ./mydocker run -it -v /nicktming/volume:/containerVolume /bin/sh
    2019/04/08 01:13:51 volume:[/nicktming/volume:/containerVolume]
    2019/04/08 01:13:51 rootPath:
    2019/04/08 01:13:51 rootPath is empaty, set cmd.Dir by default: /nicktming/mnt
    2019/04/08 01:13:51 current path: /nicktming/mnt.
    / # ls -l
    total 48
    drwxr-xr-x    2 root     root         12288 Feb 14 18:58 bin
    drwxr-xr-x    4 root     root          4096 Apr  7 17:13 containerVolume
    drwxr-xr-x    4 root     root          4096 Mar 17 16:05 dev
    drwxr-xr-x    3 root     root          4096 Mar 17 16:05 etc
    drwxr-xr-x    2 nobody   nogroup       4096 Feb 14 18:58 home
    dr-xr-xr-x  104 root     root             0 Apr  7 17:13 proc
    drwx------    2 root     root          4096 Apr  7 17:13 root
    drwxr-xr-x    2 root     root          4096 Mar 17 16:05 sys
    drwxrwxrwt    2 root     root          4096 Feb 14 18:58 tmp
    drwxr-xr-x    3 root     root          4096 Feb 14 18:58 usr
    drwxr-xr-x    4 root     root          4096 Feb 14 18:58 var
    / # mkdir nicktming && echo "nicktming" > nicktming/test02.txt
    / #
    
    -------------------------------terminal 03--------------------------------
    root@nicktming:~/go/src/github.com/nicktming/mydocker# pwd
    /root/go/src/github.com/nicktming/mydocker
    root@nicktming:~/go/src/github.com/nicktming/mydocker# ./mydocker commit image01
    2019/04/08 01:15:01 imageTar:/nicktming/image01.tar
    root@nicktming:~/go/src/github.com/nicktming/mydocker# 
    
    // 退出容器
    -------------------------------terminal 02--------------------------------
    / # exit
    root@nicktming:~/go/src/github.com/nicktming/mydocker# 
    
    // 查看生成的image
    -------------------------------terminal 01--------------------------------
    root@nicktming:/nicktming# pwd
    /nicktming
    root@nicktming:/nicktming# ls
    busybox  busybox.tar  image01.tar  volume
    root@nicktming:/nicktming# ls
    busybox  busybox.tar  image01.tar  volume
    root@nicktming:/nicktming# mkdir image01 && tar -xvf image01.tar -C image01
    root@nicktming:/nicktming# cd image01/
    root@nicktming:/nicktming/image01# ls -l
    total 56
    drwxr-xr-x 2 root   root    12288 Feb 15 02:58 bin
    drwxr-xr-x 2 root   root     4096 Apr  8 01:13 containerVolume
    drwxr-xr-x 4 root   root     4096 Mar 18 00:05 dev
    drwxr-xr-x 3 root   root     4096 Mar 18 00:05 etc
    drwxr-xr-x 2 nobody nogroup  4096 Feb 15 02:58 home
    drwxr-xr-x 2 root   root     4096 Apr  8 01:14 nicktming
    drwxr-xr-x 2 root   root     4096 Mar 18 00:05 proc
    drwx------ 2 root   root     4096 Apr  8 01:13 root
    drwxr-xr-x 2 root   root     4096 Mar 18 00:05 sys
    drwxrwxrwt 2 root   root     4096 Feb 15 02:58 tmp
    drwxr-xr-x 3 root   root     4096 Feb 15 02:58 usr
    drwxr-xr-x 4 root   root     4096 Feb 15 02:58 var
    root@nicktming:/nicktming/image01# 
    root@nicktming:/nicktming/image01# cat containerVolume/test01.txt 
    volume
    volume again
    root@nicktming:/nicktming/image01# cat nicktming/test02.txt 
    nicktming
    root@nicktming:/nicktming/image01# 
    

    可以看到把容器运行时的内容保存到镜像image01中.

    2. 实现

    实现比较简单, 直接把容器运行时的整个目录保存起来即可.

    2.1 增加CommitCommand命令

    command/command.go中增加CommitCommand命令.

    var CommitCommand = cli.Command{
        Name: "commit",
        Action: func(c *cli.Context) error {
            imageName := c.Args().Get(0)
            Commit(imageName)
            return nil
        },
    }
    

    main.go中增加CommitCommand命令.

    func main()  {
        ...
        app.Commands = []cli.Command{
            command.RunCommand,
            command.InitCommand,
            command.CommitCommand,
        }
        ...
    }
    

    2.2 实现Commit方法

    command目录下新建commit.go如下:

    func Commit(imageName string) {
        mntPath := DEFAULTPATH + "/mnt"
        imageTar := DEFAULTPATH + "/" + imageName + ".tar"
        log.Printf("imageTar:%s\n", imageTar)
        if _, err := exec.Command("tar", "-czf", imageTar, "-C", mntPath, ".").CombinedOutput(); err != nil {
            log.Printf("Error: tar -czf %s -C %s .; err:%v\n", imageTar, mntPath, err)
        }
    }
    

    3. 时序图

    code-4.4.png

    4. 参考

    1. 自己动手写docker.(基本参考此书,加入一些自己的理解,加深对docker的理解)

    5. 全部内容

    mydocker.png

    1. [mydocker]---环境说明
    2. [mydocker]---urfave cli 理解
    3. [mydocker]---Linux Namespace
    4. [mydocker]---Linux Cgroup
    5. [mydocker]---构造容器01-实现run命令
    6. [mydocker]---构造容器02-实现资源限制01
    7. [mydocker]---构造容器02-实现资源限制02
    8. [mydocker]---构造容器03-实现增加管道
    9. [mydocker]---通过例子理解存储驱动AUFS
    10. [mydocker]---通过例子理解chroot 和 pivot_root
    11. [mydocker]---一步步实现使用busybox创建容器
    12. [mydocker]---一步步实现使用AUFS包装busybox
    13. [mydocker]---一步步实现volume操作
    14. [mydocker]---实现保存镜像
    15. [mydocker]---实现容器的后台运行
    16. [mydocker]---实现查看运行中容器
    17. [mydocker]---实现查看容器日志
    18. [mydocker]---实现进入容器Namespace
    19. [mydocker]---实现停止容器
    20. [mydocker]---实现删除容器
    21. [mydocker]---实现容器层隔离
    22. [mydocker]---实现通过容器制作镜像
    23. [mydocker]---实现cp操作
    24. [mydocker]---实现容器指定环境变量
    25. [mydocker]---网际协议IP
    26. [mydocker]---网络虚拟设备veth bridge iptables
    27. [mydocker]---docker的四种网络模型与原理实现(1)
    28. [mydocker]---docker的四种网络模型与原理实现(2)
    29. [mydocker]---容器地址分配
    30. [mydocker]---网络net/netlink api 使用解析
    31. [mydocker]---网络实现
    32. [mydocker]---网络实现测试

    相关文章

      网友评论

          本文标题:[mydocker]---实现保存镜像

          本文链接:https://www.haomeiwen.com/subject/yldyiqtx.html