前几篇文章我们已经学会了怎么使用第三方在线仓库和docker提供的仓库去拉取镜像,也学会了自己去制作镜像,那怎么将自己制作的镜像导出来,在别的机器也能运行呢?

   首先我们还是使用前几篇的例子继续操作,如果还没有看过的,这里有一个传送门《我的Docker之旅,文章目录,欢迎关注 》,快去看看吧。

启动jpress镜像

docker run -d -p 8888:8080 jpress



第一种导出镜像方案:export

docker export 290b8d571b59e137d62be1 > update.tar

290b8d571b59e137d62be1 是指镜像容器ID

查看一下镜像是否已经导出来了

那这个导出来的文件放在哪儿了呢?就在当前docker终端目录下:



第一种导入镜像方案:import

那我们再来实现把这个镜像导入到容器中,先看一下docker import --help的帮助文档


docker import - update < update.tar

看一下是否导入成功呢?

可以看出来,确实已经导出来了,确实已经存在,那么我们再来看运行起来

docker run -d -p 8888:8080 update

发现出现异常,说后面没有给出命令,可明明我的jpress也是这么运行的啊,那到底错在哪儿呢?于是我又去运行我的jpress看看到底有什么问题?

一看完美运行,一下子懵逼了,到底错在哪儿呢?

我们再来看一下进程这么说:docker ps

一看原来jpress在运行的时候,系统默认给他加了“catalina.sh run”命令,所以我们也要来搞一下这个命令,于是就有了下面这个命令:

docker run -d -p 8888:8080 update catalina.sh run

一运行又傻眼了,明明是根据提示来插入命令的,然后我们看下错误信息,原来他是没有找到我们的命令所在地,最后把命令的路径写全了,终于可以正常启动了。

docker run -d -p 8888:8080 update /usr/local/tomcat/bin/catalina.sh run

进入容器内部查看之前拷贝的内容是否存在

docker exec -it 容器ID/name bash



发现确实存在,完美运行起来了。


第二种导入导出方案:save 和 load

导出save

jpress镜像导出为jpress1.tar 文件中

docker save -o jpress1.tar  f0a8e3d4d65a


我们已经看到jpress文件被导出到jpress1.tar中了

导入load

我们先删除之前的jpress镜像


然后再导入load新的(jps.tar 是第二天save出来的结果,和jpress1.tar一样

docker load -i jps.tar

这里我们可以看到和import本质上的区别,load导入的镜像是包含之前镜像的所有修改记录,是可以追本溯源的。然后我们再来看一下本地的镜像库

docker images

又有了,我们来运行一下,看下之前的文件是否都还在镜像里面


可以看出之前的文件都存在,太棒了!

浏览器访问一下,看看是否能正常访问,可以正常访问,这下我就放心了。



第一种方案和第二种方案的区别(load 和 import 区别)

1)load 是用来导入镜像存储文件到本地镜像库

2)import 是导入一个容器的快照到本地镜像库

3)容器快照文件import将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),从容器快照文件导入时可以重新指定标签等元数据信息。

4)镜像存储文件load将保存完整记录,体积也要大

需要注意两种方法不可混用。
        如果使用import导入save产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐