export和import
export、import命令是一对,save、load命令是一对。
export:导出容器快照为镜像。
import:导入容器快照到本地镜像库。
save:将指定镜像保存成tar文件。
load:导入使用docker save命令导出的镜像。
commit:将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。
下面进行演示:
export和import:
命令格式:
docker export -o xxx.tar [容器ID|Name]
docker import xxx.tar newname:tag
先运行一个容器:
docker run --name mynginx -v /opt/html:/usr/share/nginx/html -p 80:80 -d nginx
执行:
docker export -o nginx.tar mynginx
docker import nginx.tar mynginx:v1
docker images
先关闭原来的nginx容器,再去运行import生成的镜像:
docker stop mynginx
docker run --name mynginx.v1 -v /opt/html:/usr/share/nginx/html -p 80:80 -d mynginx:v1
这时候,我们发现docker run
直接报错,说我们没有定义执行命令。
这时候,对于import生成的镜像,我们需要手动指定执行命令。
那么我怎么知道原镜像的执行命令呢?
两种办法:
-
先执行
docker inspect nginx
,查看镜像的元信息,这里面定义了详细启动命令结合红框不难得出运行命令是:
/docker-entrypoint.sh nginx -g 'daemon off;'
-
docker start mynginx docker ps --no-trunc
重新执行:
docker stop mynginx
docker run --name mynginx.v1 -v /opt/html:/usr/share/nginx/html -p 80:80 -d mynginx:v1 /docker-entrypoint.sh nginx -g 'daemon off;'
所以docker export和import比较坑,import生成的镜像不能直接run,需要知道之前容器的启动命令。
那出了不能直接run,还有其他区别吗?
使用docker inspect,查看原镜像:文件系统分了很多层。
再看import生成的镜像:个镜像只剩了一层,其他的层级全没有了,整个镜像体积较之前也小了一些
应用场景:
主要用来制作基础镜像,比如从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
save和load
save:
将指定镜像保存成tar文件。
命令:docker save -o xxx.tar 镜像名
load:
导入使用docker save命令导出的镜像。
命令:docker load -i xxx.tar
这两个命令比较简单,也没有什么坑,不着重介绍。
应用场景:
用于镜像迁移到别处。
commit
将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。
命令格式:
docker commit [容器名称|ID] 生成新的镜像名字
选项说明:
-a:提交的镜像作者
-c:使用dockerfile指令来创建镜像
-m:提交时的说明文字
-p:在commit的时候,将正在运行的容器暂停
测试:
docker run --name mynginx -v /opt/html:/usr/share/nginx/html -p 80:80 -d nginx
docker commit mynginx mynginx:v2
docker inspect mynginx:v2
发现比原来的镜像多了一层。
应用场景:
主要作用是将配置好的一些容器生成新的镜像,可以得到复用(再次使用不需要再配置)。
通过commit+save+load可以实现:我先在A机器上配置好了一个镜像,然后通过commit生成了镜像,使用save命令生成该镜像对应的tar包,然后移动到B机器上,然后在B机器上执行load命令,加载tar包到本地镜像仓库。当然你可以说那我有私人镜像仓库,就不用这么麻烦了,但是不是所有机器都在一个局域网内,那么这时候这几个命令就可以大展身手了。
参考:https://blog.csdn.net/qq_44895681/article/details/106100061