跳到主要内容
  1. 所有文章/
  2. Docker学习笔记/

Docker04镜像

·📄 1274 字·🍵 3 分钟

镜像是什么? #

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时库,环境变量和配置文件。

如何获得镜像 #

  • 从远程仓库下载
  • 朋友拷贝给你
  • 自己制作一个镜像 Dockerfile

UnionFS(联合文件系统) #

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS

这是一种分层,轻量级且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( Unite several directories into a single virtual filesystem )。Union文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

Docker镜像加载原理 #

bootfs(boot file system)主要包含bootloaderkernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的, 包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system) 在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

image-20210514100545302.png

镜像分层下载优点 #

  • 可以精简镜像文件的大小,对于一个OS,rootfs可以很小,需要包含最基本的命令,工具库和程序库即可,因为底层直接使用 Host 和 kernel,自己只需要提供 rootfs即可,由此对于不同的 Linux 发行版本,bootfs基本是一致的。

image-20210514101442249.png

  • 资源共享,比如又多个镜像从相同的 base 镜像构建而来,主机只要在磁盘上保存一份 base 镜像,同时内存也只需加载一份 base 镜像即可为所有的容器服务了,而且镜像的每一层都能被共享。

Docker 镜像理解 #

  1. 所有的镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,都会在当前镜像层上创建新的镜像层。

    image-20210514103234209.png

  2. 创建新的镜像层时,镜像始终是当前所有镜像的组合

    image-20210514103159914.png

  3. 上层镜像层的文件要覆盖底层镜像层的文件时,会使得文件的更新版本作为一个新的镜像层添加到镜像中。

  4. 所有镜像层堆叠并合并,对外提供统一的视图

    image-20210514104009648.png

  5. Docker 镜像都是只读的,当容器启动时,一个新的可写层会被加载到镜像的顶部。(这一层称为 容器层,容器之下的都叫 镜像层)。

image-20210514102529830.png

commit镜像 #

#docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[tag]

发现:官方的默认 tomcat 的 webapp文件夹 并没有一些文件,需要自己手动拷贝。

解决:将我们操作过的容器 commit 提交成一个新的镜像,我们以后就直接使用我们修改过的镜像即可。

[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                       NAMES
39f11d68d64d   tomcat    "catalina.sh run"   18 minutes ago   Up 18 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat02

[root@izwz91mv6i3x6k12jjqh60z ~]# docker commit -m="这个修改了的tomcat" -a="zhang" 39f11d68d64d modified_tomcat:1.1
sha256:57cab5f1479d5c0c6f85ba59415b8c7e9563d9907d32fc5d61a54a74945e57e7

[root@izwz91mv6i3x6k12jjqh60z ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
modified_tomcat       1.1       57cab5f1479d   7 seconds ago   672MB
tomcat                latest    c0e850d7b9bb   3 weeks ago     667MB
nginx                 latest    62d49f9bab67   4 weeks ago     133MB
portainer/portainer   latest    580c0e4e98b0   8 weeks ago     79.1MB
centos                latest    300e315adb2f   5 months ago    209MB

总结:如果想保存当前容器的状态,可以通过 commit 来提交,获得一个镜像。