前几篇文章我们已经学会了怎么使用第三方在线仓库和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"的错误。