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
可以看出新建的镜像层叠加在原始的镜像层上,如果一直新建,镜像层就会一直叠加
通过以上这种打包镜像的方法,可以将我们在容器镜像内修改的数据得以保存,但是这种方法不推荐,因为将数据存到镜像层里面,它的文件系统读取速度都效率非常低。
所以呢要将数据存储到宿主机的物理磁盘中,这样会更加高效,不管是从存储速度还是文件的读取速度来说。