关于golang:Docker-系列docker-学习-四镜像相关原理

37次阅读

共计 3464 个字符,预计需要花费 9 分钟才能阅读完成。

【Docker 系列】docker 学习 四,镜像相干原理

镜像是什么?

镜像是一种轻量级的,可执行的独立的软件包。

镜像用来打包软件的运行环境和基于运行环境开发的软件,它蕴含运行某些软件所须要的所有内容,例如:代码,运行时库,环境变量和配置文件等等

所有的利用,能够间接打包 docker 镜像,一键部署,一键运行

失去镜像形式有哪些?

  • 间接拷贝其余 docker 镜像
  • 本人制作一个镜像 DockerFile
  • 从近程仓库下载,如 dockerhub

Docker 镜像的加载原理

UnionFS

UnionFS,是联结文件系统,还记的咱们 docker 学习二 外面装置 redis 的时候,呈现的分层下载吗

这就是联结文件系统

UnionFS 联结文件系统,是一种分层,轻量级并且高性能的文件系统

它反对对文件系统的批改作为一次提交来一层一层的叠加,同时能够将不同目录挂载到一个虚构文件系统下

UnionFS 联结文件系统是 Docker 镜像的根底,镜像还能够通过分层来继承,基于根底的镜像,咱们能够制作成各种利用镜像

个性:

联结文件系统一次同时加载多个文件系统,联结加载会把各层的文件系统叠加起来,最终的文件系统会蕴含所有底层的文件和目录

Docker 的镜像加载原理是什么呢?

图片来源于网络

Docker 的镜像是有一层一层的文件系统组成的,这个层级的文件系统就叫做联结文件系统,个别底下的层都是共用的

个别系统启动,是一个加载的过程,这个过程是 bootloader 疏导加载 kernel,linux 操作系统刚启动的时候还会加载 bootfs 文件系统,而咱们的 Docker 镜像最底层就是 bootfs

bootfs

boot file system 是一个文件系统,次要是蕴含 bootloader 和 kernel

当 boot 加载结束之后,整个内核都在运行正在内存中的,此时内存的使用权曾经由 bootfs 交接给内核,这个时候零碎会将 bootfs 卸载掉

rootfs

在来说一下 rootfs,root file system,根文件系统,它是在 bootfs 之上的,就是蕴含了,linux 操作系统中的 /dev,/proc,/bin,/etc 等目录和文件

例如咱们晓得的 rootfs 有 centos,ubuntu 等等

分层原理

咱们来下载一个 redis 看看成果

Docker 是依照层级进行下载,之前下载过的层级就不会再次下载了,咱们能够通过 docker inspect 查看 redis 的细节

# docker inspect redis:latest
...
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:814bff7343242acfd20a2c841e041dd57c50f0cf844d4abd2329f78b992197f4",
                "sha256:dd1ebb1f5319785e34838c7332a71e5255bda9ccf61d2a0bf3bff3d2c3f4cdb4",
                "sha256:11f99184504048b93dc2bdabf1999d6bc7d9d9ded54d15a5f09e36d8c571c32d",
                "sha256:e461360755916af80821289b1cbc503692cf63e4e93f09b35784d9f7a819f7f2",
                "sha256:45f6df6342536d948b07e9df6ad231bf17a73e5861a84fc3c9ee8a59f73d0f9f",
                "sha256:262de04acb7e0165281132c876c0636c358963aa3e0b99e7fbeb8aba08c06935"
            ]
        },
...

如上后果咱们能够看到,redis 的层级与咱们 pull 拉取镜像时候的层级统一

那么 Docker 为什么要采纳分层下载呢?

次要是为了共享资源

例如咱们的多个镜像都是从根底镜像构建而来,那么宿主机只须要在机器上保留一份根底镜像即可,并且内存中也只须要加载一份根底镜像,就能够为所有须要的容器服务,而且镜像的每一层也都是能够共享的

咱们能够这样来了解:

所有的 Docker 镜像都来源于根底镜像,咱们减少或批改镜像内容的时候,就会在以后镜像层下面,新建一个镜像层,这就例如 windows 外面的一个安全补丁

如下面图例:

咱们在镜像的第一层,搁置 file1,file2,镜像的第二层搁置 file3,file4,镜像的第三层搁置 file3.1(file3.1 是 file3 的一个新版本)

那么,咱们在打包镜像的时候,就会合并出 一个镜像外面,有 4 个文件,此处也就是 4 个 layer

当咱们下载这个最终合并的镜像时,就会一次下载上述的 4 个 layer

Docker 镜像的特点:

Docker 镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部

下面说的这一层就是咱们的容器层,容器层上面是镜像层,如下图所示

如何提交咱们的镜像

Docker 提交原理和命令与 Git 相似

docker commit

提交以后容器,成为一个新的版本

咱们个别会这样应用

docker commit -m="形容信息" -a="作者" 容器 ID 指标镜像名:[TAG]

举个例子:

咱们本人批改一下 nginx 镜像,作为咱们本人的镜像来应用

启动 nginx,设置端口映射为 -p 8888:80

docker run -d -p 8888:80 nginx

以交互方式进入 nginx

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
30841a3a26cb   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 2 seconds   0.0.0.0:8888->80/tcp   strange_hugle

# docker exec -it 30841a3a26cb /bin/bash

进入到 nginx 的 html 目录,将 index.html 文件替换掉,,nginx 从新加载配置

#cd /usr/share/nginx/html
#ls
50x.html  index.html
#mv index.html index.html.bak
#mv 50x.html index.html
#/usr/sbin/nginx -s reload

这个时候,咱们拜访一个服务器的 8888 端口,查看成果(咱们将失常的 index.html 页面,换成了一个显示谬误的页面)

如上图,果然更换胜利了

咱们来进行一下 commit

docker commit -a="xiaomotong" -m="modify index.html" 30841a3a26cb nginx01:1.0

~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
30841a3a26cb   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8888->80/tcp   strange_hugle
root@iZuf66y3tuzn4wp3h02t7pZ:~# docker commit -a="xiaomotong" -m="modify index.html" 30841a3a26cb nginx01:1.0
sha256:1d072fa616573ba67a103925c6114e40171eb1d14ca573f146a28b8c51e5fdff
root@iZuf66y3tuzn4wp3h02t7pZ:~# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
nginx01               1.0       1d072fa61657   3 seconds ago   133MB
ubuntu                latest    1318b700e415   7 days ago      72.8MB
redis                 latest    aa4d65e670d6   11 days ago     105MB
nginx                 latest    08b152afcfae   12 days ago     133MB
portainer/portainer   latest    580c0e4e98b0   4 months ago    79.1MB

如果咱们想要保留本人的容器以后状态,咱们就能够通过 commit 来提交,取得一个想要的镜像,这就有点像应用虚拟机打快照一样

参考资料:

docker docs

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 小魔童哪吒,欢送点赞关注珍藏,下次见~

正文完
 0