23 04 2021

前言

本文主要了解下docker镜像的分层结构。

镜像分层

1、镜像分层结构

如上图所示,docker分层主要分为两大层,上层是“容器层”,下层是“镜像层”。

容器层可以读写,容器所有发生文件变更写都发生在这一层,容器自身内部完成,容器互相独立互不干扰。镜像层read-only,只允许读取。

2、通过镜像构建时看分层

  1. docker build -t zwqh.top/mywebapp:1.0 /usr/image/my-dockerfile
  2. ____________________________________________
  3. Sending build context to Docker daemon 28.97MB
  4. Step 1/4 : FROM tomcat:jdk8-corretto
  5. ---> 79b38376f3de
  6. Step 2/4 : MAINTAINER zwqh.top
  7. ---> Running in 13c52044c758
  8. Removing intermediate container 13c52044c758
  9. ---> 817712d51c7e
  10. Step 3/4 : WORKDIR /usr/local/tomcat/webapps
  11. ---> Running in 6575a667ae48
  12. Removing intermediate container 6575a667ae48
  13. ---> 65d94934c688
  14. Step 4/4 : ADD docker-web ./docker-web
  15. ---> 80946ac76b0d
  16. Successfully built 80946ac76b0d
  17. Successfully tagged zwqh.top/mywebapp:1.0

从上面内容看执行的每一步都会生成一个临时镜像,临时镜像只用于镜像的构建,不能直接使用。

临时镜像可以看做是一种快照,每执行一步都会对当时系统环境进行一次快照,类似游戏的存档。

而每一步又类似叠汉堡,有层次~

3、分层的临时容器可重用

分层的临时容器是可重用的,如果不更换底层配置,只需构建不同的部分就可以了~

示例:

  1. #进入镜像目录
  2. cd /usr/image
  3. #创建docker-layer目录
  4. mkdir docker-layer
  5. #进入docker-layer目录
  6. cd /docker-layer
  7. #编辑Dockerfile文件
  8. vim Dockerfile
  9. #基准镜像
  10. FROM centos
  11. #构建镜像时输出
  12. RUN ["echo","aaaa"]
  13. RUN ["echo","bbbb"]
  14. RUN ["echo","cccc"]
  15. RUN ["echo","dddd"]
  16. :wq #保存
  17. #构建镜像
  18. docker build -t zwqh.top/docker-layer:1.0 /usr/image/docker-layer
  19. #运行内容
  20. Sending build context to Docker daemon 2.048kB
  21. Step 1/5 : FROM centos
  22. latest: Pulling from library/centos
  23. 7a0437f04f83: Pull complete
  24. Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
  25. Status: Downloaded newer image for centos:latest
  26. ---> 300e315adb2f
  27. Step 2/5 : RUN ["echo","aaaa"]
  28. ---> Running in 9e8f37427440
  29. aaaa
  30. Removing intermediate container 9e8f37427440
  31. ---> 090240f2c10b
  32. Step 3/5 : RUN ["echo","bbbb"]
  33. ---> Running in c472cfecc059
  34. bbbb
  35. Removing intermediate container c472cfecc059
  36. ---> f06a8292da38
  37. Step 4/5 : RUN ["echo","cccc"]
  38. ---> Running in a5865c336958
  39. cccc
  40. Removing intermediate container a5865c336958
  41. ---> cc49ab52eb9a
  42. Step 5/5 : RUN ["echo","dddd"]
  43. ---> Running in 5838d16395b1
  44. dddd
  45. Removing intermediate container 5838d16395b1
  46. ---> 99549efe0556
  47. Successfully built 99549efe0556
  48. Successfully tagged zwqh.top/docker-layer:1.0
  49. #修改Dockerfile文件
  50. vim Dockerfile
  51. #基准镜像
  52. FROM centos
  53. #构建镜像时输出
  54. RUN ["echo","aaaa"]
  55. RUN ["echo","bbbb"]
  56. RUN ["echo","eeee"]
  57. RUN ["echo","ffff"]
  58. #再次构建镜像
  59. docker build -t zwqh.top/docker-layer:1.1 /usr/image/docker-layer
  60. #运行内容
  61. Sending build context to Docker daemon 2.048kB
  62. Step 1/5 : FROM centos
  63. ---> 300e315adb2f
  64. Step 2/5 : RUN ["echo","aaaa"]
  65. ---> Using cache
  66. ---> 090240f2c10b
  67. Step 3/5 : RUN ["echo","bbbb"]
  68. ---> Using cache
  69. ---> f06a8292da38
  70. Step 4/5 : RUN ["echo","eeee"]
  71. ---> Running in 6ec0861d5b83
  72. eeee
  73. Removing intermediate container 6ec0861d5b83
  74. ---> e5f314de5417
  75. Step 5/5 : RUN ["echo","ffff"]
  76. ---> Running in 249aef1aef8a
  77. ffff
  78. Removing intermediate container 249aef1aef8a
  79. ---> 12ce8a3e910b
  80. Successfully built 12ce8a3e910b
  81. Successfully tagged zwqh.top/docker-layer:1.1

可以看到第二次构建没有输出aaaa、bbbb,再看 Using cache,说明临时镜像是重用的,这样可以减少步骤快速构建。

总结

本文主要学习了docker镜像分层,docker内部构建过程及原理,后续章节将会对Dockerfile文件指令进行详细解析。

延伸阅读
  1. Windows下IIS搭建Ftp服务器
  2. Nginx开启Gzip压缩提升页面加载速度
  3. Nginx安装及配置(linux)
  4. Docker(10):Docker-Compose简介及安装
  5. Docker(5):docker镜像分层(layer)
发表评论