Docker-镜像分层结构/镜像构建

1. 镜像的分层结构

• 共享宿主机的kernel

• base镜像提供的是最小的Linux发行版

• 同一docker主机支持运行多种Linux发行版

• 采用分层结构的最大好处是:共享资源

可以这么来理解,比如你拉取了一个v1版本的nginx , 然后又拉取了一个v2版本的nginx,那么拉取的v2版本的会共享v1中相同的镜像层,只是下载与v1不同的镜像层,这样不仅节省了资源,也节省了时间流量,同时如果你要删除v1版本的话,也只是删除了与v2版本不同的镜像层,不会影响v2的运行。

• Copy-on-Write 可写容器层

• 容器层以下所有镜像层都是只读的

• docker从上往下依次查找文件

• 容器层保存镜像变化的部分,并不会对镜像本身进行任何修改

• 一个镜像最多127层

2 . 镜像的构建

docker commit 构建新镜像三部曲
• 运行容器
• 修改容器
• 将容器保存为新的镜像

缺点:
• 效率低、可重复性弱、容易出错
• 使用者无法对镜像进行审计,存在安全隐患

2.1 拉取镜像


docker pull busybox      ##拉取busybox镜像
docker images            ##查看拉取的镜像

[root@vm2 ~]# docker images
busybox              atest    beae173ccac6   5 months ago    1.24MB

2.2 运行容器


docker run -it --rm --name demo busybox  ##运行容器名为demo的busybox的镜像(容器名随意)
-it      交互式运行
--rm     容器运行后自动回收,做的更改不会保存

[root@vm2 ~]# docker run -it --rm --name demo busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ #

2.3 修改容器 (以下命令在容器内运行)


[root@vm2 ~]# docker run -it --name demo busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch file          ##在镜像内建立一个文件
/ # ls
bin   dev   etc   file  home  proc  root  sys   tmp   usr   var
/ #

ctrl+pq         ##退出容器,但容器在后台运行
ctrl+d          ##退出容器,容器停止运行

2.4通过容器ID再次启动镜像


docker ps           ##查看运行的容器    
docker ps -a        ##查看运行的容器,包括已经停止运行的容器
[root@vm2 ~]# docker ps -a
AINER ID   IMAGE    COMMAND    CREATED    STATUS    PORTS                 NAMES
074f7474e488  busybox  "sh"  6 minutes xited (0)  About a minute ago      demo

docker start 074f7474e488    ##通过容器ID再次启动镜像
[root@vm2 ~]# docker start 074f7474e488
074f7474e488

docker attach 074f7474e488    ##重新连接容器
[root@vm2 ~]# docker attach 074f7474e488
/ # ls
bin   dev   etc   file  home  proc  root  sys   tmp   usr   var
/ #

2.5 将容器保存为新的镜像


docker commit demo busybox:v1     ##将容器保存为新的镜像

[root@vm2 ~]# docker commit demo busybox:v1
sha256:568b66ab12699736211f18f5e172e13407d671313076e6065f408996e141c4ab


docker images demo busybox:v1     ##查看新保存的镜像

[root@vm2 ~]# docker images busybox:v1
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      v1        568b66ab1269   2 minutes ago   1.24MB
docker
[root@vm2 ~]# docker run -it busybox:v1 ##运行保存的新镜像,之前建立的文件依然存在
/ # ls
bin   dev   etc   file  home  proc  root  sys   tmp   usr   var
/ #

2.6  查看镜像构建历史


docker history busybox      ##查看busybox的镜像构建历史
   
[root@vm2 ~]# docker history busybox:latest     ##busybx的原始镜像层
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
beae173ccac6   5 months ago   /bin/sh -c #(nop)  CMD ["sh"]                   0B        
<missing>      5 months ago   /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4…   1.24MB    
[root@vm2 ~]# docker history busybox:v1         ##保存新的busybox后,新的镜像层
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
568b66ab1269   3 hours ago    sh                                              17B      
beae173ccac6   5 months ago   /bin/sh -c #(nop)  CMD ["sh"]                   0B        
<missing>      5 months ago   /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4…   1.24MB

可以看出新建的镜像层叠加在原始的镜像层上,如果一直新建,镜像层就会一直叠加

通过以上这种打包镜像的方法,可以将我们在容器镜像内修改的数据得以保存,但是这种方法不推荐,因为将数据存到镜像层里面,它的文件系统读取速度都效率非常低。

所以呢要将数据存储到宿主机的物理磁盘中,这样会更加高效,不管是从存储速度还是文件的读取速度来说。


云野 » Docker-镜像分层结构/镜像构建

发表回复