docker镜像的导入导出和制作

网友投稿 284 2022-10-27

docker镜像的导入导出和制作

镜像导入导出

docker export和docker import

作用

对当前的容器文件系统创建一个快照,并持久化为tar文件,tar文件中保存的是容器的文件系统和其上的数据。然后通过docker import命令导入tar文件到docker环境后,会发现导入成功的是一个只有一层镜像层的image,而不是恢复为一个容器。tar文件内容:

# tar xf test.tar # ll total 766604 -rw-r--r--. 1 root root 12148 Aug 10 05:39 anaconda-post.log lrwxrwxrwx. 1 root root 7 Aug 10 05:38 bin -> usr/bin -rw-------. 1 root root 2121728 Aug 25 11:29 core.2005 drwxr-xr-x. 3 root root 18 Aug 25 11:37 data0 drwxr-xr-x. 4 root root 43 Aug 24 20:14 dev drwxr-xr-x. 47 root root 4096 Aug 25 11:35 etc drwxr-xr-x. 2 root root 6 Apr 11 2018 home lrwxrwxrwx. 1 root root 7 Aug 10 05:38 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Aug 10 05:38 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 Apr 11 2018 media drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt drwxr-xr-x. 2 root root 6 Apr 11 2018 opt drwxr-xr-x. 2 root root 6 Aug 10 05:38 proc dr-xr-x---. 3 root root 4096 Aug 25 11:39 root drwxr-xr-x. 12 root root 163 Aug 25 11:35 run lrwxrwxrwx. 1 root root 8 Aug 10 05:38 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Apr 11 2018 srv drwxr-xr-x. 2 root root 6 Aug 10 05:38 sys drwxrwxrwt. 7 root root 181 Aug 25 11:35 tmp drwxr-xr-x. 13 root root 155 Aug 10 05:38 usr drwxr-xr-x. 18 root root 238 Aug 10 05:38 var

使用场景

docker export主要用来制作基础镜像,比如你从一个干净的系统镜像启动一个容器,然后安装一些软件或者删除修改一些软件后,使用docker export保存为一个基础镜像。然后,把这个镜像分发给测试或者开发等其他团队使用。线上环境不建议使用export出来的image,因为这个image可能安装了很多软件和特殊配置,但是这个只有制作这个image的操作人知道,会造成黑洞。

命令使用:

# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES df541699c7cf 078114edb6be "python -c 'import t…" 8 minutes ago Up 8 minutes test # docker export df541699c7cf > test.tar # docker import test.tar test

docker save和docker load

作用

docker save主要对image进行持久化,而不是运行的container,把对应image为一个tar文件。如果这个运行的container中在image之上安装了一些软件等,通过save后保存的仍然为不带这些软件的image。而tar文件中保存的是分层的文件系统,上层的文件会覆盖下层的同名文件,一般一个image会有多个层组成。docker load加载这个tar包为一个image。

tar文件内容:

# tar xf test.tar # ll total 206156 drwxr-xr-x. 16 root root 4096 Sep 15 14:25 2d86d9ead00749413ef00cf7ee338512d6211a4ce12cd0088a556083c138c979 -rw-r--r--. 1 root root 2794 Aug 11 02:20 7e6257c9f8d8d4cdff5e155f196d67150b871bbe8c02761026f803a704acb3e9.json -rw-r--r--. 1 root root 189 Jan 1 1970 manifest.json

使用场景

持久化保存image。例如要部署的客户服务器并不能连外网,你可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。

命令使用

# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE centos 7e6257c9f8d8 5 weeks ago 203MB # docker save centos > test.tar # docker load < test.tar

docker import和docker load区别

docker import:导入的是一个文件系统docker load:导入的是一个分层的image

镜像制作

使用docker commit

作用

当我们运行一个容器的时候(如果不使用存储卷的话),我们做的任何文件修改都会被记录于容器存储层里。而Docker提供了一个docker commit命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

使用场景

1,被***后保存现场,然后把image放到安全的环境做分析2,开发测试环境制作镜像,一般不用于生产环境,生产环境的镜像推荐使用Dockerfile制作。因为,docker commit意味着所有对镜像的操作都是黑箱操作,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作,这种黑箱镜像的维护工作是非常痛苦的。而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用docker commit制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,这会让镜像更加臃肿。

命令使用

# docker history tutum/dnsutils IMAGE CREATED CREATED BY SIZE COMMENT 6cd78a6d3256 5 years ago /bin/sh -c apt-get update && apt-get install… 11.6MB 5 years ago /bin/sh -c #(nop) CMD [/bin/bash] 0B 5 years ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 1.9kB 5 years ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli… 195kB 5 years ago /bin/sh -c #(nop) ADD file:a2d97c73fb08b9738… 188MB 7 years ago 0B Imported from - # docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE tutum/dnsutils latest 6cd78a6d3256 5 years ago 200MB # docker container ls 0473de2dc1aa tutum/dnsutils "sleep infinity" 6 minutes ago Up 6 minutes k8s_dnsutils_dnsutils_default_7d2e39b8-cc5d-412a-ab12-e75c8fb98792_2 # docker exec -it 0473de2dc1aa bash root@dnsutils:/# pwd / root@dnsutils:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@dnsutils:/# echo "123" >> /root/add.txt root@dnsutils:/# exit # docker diff 0473de2dc1aa C /root A /root/.bash_history A /root/add.txt # docker commit --author "lee" --message "添加文件" 0473de2dc1aa tutum/dnsutils:latest sha256:46d2535abda997d25a44239b17c5989ac4294b043b831095239ba073b3ec8ca5 # docker image ls tutum/dnsutils REPOSITORY TAG IMAGE ID CREATED SIZE tutum/dnsutils latest 46d2535abda9 2 minutes ago 200MB

使用Dockerfile

作用

Dockerfile是一个用来自动化构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,可用于通过指定docker image上需要的所有步骤来实现image制作的自动化。

使用场景

线上环境基本都是用Dockerfile完成镜像的自动化构建,主要有如下优点:1,可以重复执行和构建2,自动化构建镜像3,可以对dockerfile做版本控制,方便管理

命令使用

# vim Dockerfile # 1、第一行必须是 FROM 基础镜像信息 FROM ubuntu # 2、维护者信息 MAINTAINER test test@qq.com # 3、镜像操作指令 RUN apt-get update && apt-get install -y nginx \ && echo "\ndaemon off;" >> /etc/nginx/nginx.conf # 4、容器启动执行指令 CMD /usr/sbin/nginx # docker build -t nginx:v1 .

参考

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:单片机系统与标准PC键盘的接口模块设计
下一篇:Mybatis加载策略的实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~