容器镜像转化、迁移的实现
在很多的场景之下我们需要将容器与镜像之间进行相互的转化,比如说测试环境的迁移
第一、容器与镜像之间的相互转化
容器转化为镜像
[root@localhost ~]# docker rm $(docker ps -aq) #删除之前的容器
8fda22d309a7
ddde61f54bfc
[root@localhost ~]# docker run -d --name=web1 nginx #创建一个web1容器
a99cd7472522c44c4d1ebc77b55164b9cb126233c00718212c50b46a34e0f1f0
[root@localhost ~]# docker ps -a #查看当前的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a99cd7472522 nginx "/docker-entrypoint.…" 10 seconds ago Up 6 seconds 80/tcp web1
[root@localhost ~]# docker export web1 > web1.tar #利用export命令将容器归当成tar包
[root@localhost ~]# ls
nginx.tar vol web web1.tar web1.txt web2.txt
[root@localhost ~]# docker images #查看当前镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 7 weeks ago 133MB
[root@localhost ~]# docker import web1.tar nginx:v1 #利用insport命令,将tar包生成镜像。
sha256:b9ffb514da6132b9e0c65112148f73e8528182f7f24027bf27d481113857861e
[root@localhost ~]# docker images #再次查看镜像,已经生成
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 b9ffb514da61 5 seconds ago 131MB
nginx latest f6d0b4767a6c 7 weeks ago 133MB
镜像转为容器
[root@localhost ~]# docker images #查看当前镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 b9ffb514da61 9 minutes ago 131MB
nginx latest f6d0b4767a6c 7 weeks ago 133MB
[root@localhost ~]# docker run -d --name=web2 nginx:v1 #用刚刚生成的镜像,创建一个容器,报错没有cmd
docker: Error response from daemon: No command specified.
See 'docker run --help'.
[root@localhost ~]# docker image inspect nginx:v1 | grep -i cmd ##查看镜像的cmd详情,为null,生成容器的时候需要添加cmd
"Cmd": null,
"Cmd": null,
[root@localhost ~]# docker run -dt --name=web2 nginx:v1 /bin/bash ##添加cmd后,再次尝试创建容器,成功
57d4bfecb625d20fedcb3bc94cc22b66f6a85544b105af0e0d7372ecb192e74a
[root@localhost ~]# docker ps -a #查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57d4bfecb625 nginx:v1 "/bin/bash" 4 seconds ago Up 3 seconds web2
a99cd7472522 nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 80/tcp web1
第二、镜像的转移
[root@localhost ~]# docker save nginx:v1 > nginx_v1.tar ##利用save命令,将镜像打成tar包
[root@localhost ~]# docker image rm nginx:v1 #删除掉这个镜像,验证一会生成,这个报错是说明还有容器在使用这个镜像
Error response from daemon: conflict: unable to remove repository reference "nginx:v1" (must force) - container 57d4bfecb625 is using its referenced image b9ffb514da61
[root@localhost ~]# docker stop web2 #停止容器
web2
[root@localhost ~]# docker rm web2 #删除容器
web2
[root@localhost ~]# docker image rm nginx:v1 #删除镜像
Untagged: nginx:v1
Deleted: sha256:b9ffb514da6132b9e0c65112148f73e8528182f7f24027bf27d481113857861e
Deleted: sha256:8f6cb55ae698dfc2dc74577775f1bcbed1d48f72213bb6097207631cce9db58a
[root@localhost ~]# docker images #查看当前已经没有了nginx:v1镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 7 weeks ago 133MB
[root@localhost ~]# docker load < nginx_v1.tar #利用load命令,将tar包导入成镜像
8f6cb55ae698: Loading layer [==================================================>] 135.4MB/135.4MB
Loaded image: nginx:v1
[root@localhost ~]# docker images #镜像已经成功导入
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 b9ffb514da61 16 minutes ago 131MB
nginx latest f6d0b4767a6c 7 weeks ago 133MB
[root@localhost ~]# docker run -dt --name=web2 nginx:v1 /bin/bash #可以正常的创建容器
1107dc01eaa4480adb1332e1b152429fc53953e8a2705c290c79ce1b4d5a5ec3
[root@localhost ~]# docker ps -a #查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1107dc01eaa4 nginx:v1 "/bin/bash" 8 seconds ago Up 7 seconds web2
a99cd7472522 nginx "/docker-entrypoint.…" 19 minutes ago Up 19 minutes 80/tcp web1
[root@localhost ~]#
第三、注意