1、镜像如何存储

FROM busybox
CMD ping baidu.com
截取的nginx的分层
image.png

nginx这个镜像怎么存的
使用:docker image inspect nginx
image.png
指示了镜像怎么存的

  • LowerDir :底层目录; diw (只是存储不同);包含小型linux和装好的软件 ```shell 用户文件; /var/lib/docker/overlay2/67b3802c6bdb5bcdbcccbbe7aed20faa7227d584ab37668a03ff6952e631f7f2/diff:

nginx的启动命令放在这里 /var/lib/docker/overlay2/f56920fac9c356227079df41c8f4b056118c210bf4c50bd9bb077bdb4c7524b4/diff:

nginx的配置文件在这里 /var/lib/docker/overlay2/0e569a134838b8c2040339c4fdb1f3868a7118dd7f4907b40468f5fe60f055e5/diff:

小linux系统 /var/lib/docker/overlay2/2b51c82933078e19d78b74c248dec38164b90d80c1b42f0fdb1424953207166e/diff:

  1. - linux系统(FROM apline + Dockerfile的每一个命令可能都引起了系统的修改,所以和git 一样,只记录变化
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12766423/1639206769328-c804c116-95cc-480d-9d32-b046d18a0a46.png#clientId=ud1765187-bf5c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=126&id=u5da1c7c2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=126&originWidth=1004&originalType=binary&ratio=1&rotation=0&showTitle=false&size=118057&status=done&style=none&taskId=u9e106c56-d4ef-4bcd-8d6d-1f08cd8dedb&title=&width=1004)
  3. - 我们进入到这个镜像启动的容器,容器的文件系统就是镜像的;
  4. - docker ps -s;可以看到这个容器真正用到的文件大小
  5. - 容器会自己建立层;如果想要改东西,把改的内容复制到容器层即可 docker inspect container

“LowerDir”: “/var/lib/docker/overlay2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d462c862f1e9a05 62de2384dbc- init/diff:/var/lib/docker/overlay2/e3b8bdbb0cfbe5450696c470994b3f99e8a7942078e2639a788 027529c6278f7/diff:/var/lib/docker/overlay2/67b3802c6bdb5bcdbcccbbe7aed20faa7227d584ab 37668a03ff6952e631f7f2/diff:/var /lib/docker/overlay2/f56920fac9c356227079df41c8f4b056 118c210bf4c50bd 9bb077bdb4c7524b4/diff:/var/lib/docker/overlay2/0e569a134838b8c2040339 c4fdb1f3868a7118dd7f4907b40468f5fe60f055e5/diff:/var/lib/docker/ov erlay2/2b51c8293307 8e19d78b74c248dec38164b90d80c1b42f0fdb14249532071 66e/diff”,

“MergedDir”: “/var/lib/docker/overlay2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d462c862f1 e9a0562de2384dbc/merged”, “UpperDir”: (镜像的上层可以感知变 化)”/var/lib/docker/overlay 2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d 462c862f1e9a0562de2384dbc/diff”,【容器的修改后 的文件,保存再宿主机哪里呀。 容器删除后,那些容器目录还存在吗?一定不再】 “WorkDir”: “/var/lib/docker/overlay2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d462c862f1e9 a0562de2384dbc/work”

  1. - MergedDir :合并目录;容器最终的完整工作目录全内容都在合并层;数据卷在容器层产生;所有的增删改都在容器层;
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12766423/1639206959644-39dfe0e5-cf27-45ff-830f-f9d82406dd79.png#clientId=ud1765187-bf5c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=261&id=u1961561d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=261&originWidth=1032&originalType=binary&ratio=1&rotation=0&showTitle=false&size=171372&status=done&style=none&taskId=u474de70d-a26c-4dfe-ae38-e1626322cda&title=&width=1032)
  3. - UpperDir :上层目录;
  4. - WorkDir :工作目录(临时层),pid
  5. LowerDir(底层)\UpperDir()\MergedDir\WorkDir(临时东西) <br />docker底层的 storage driver完成了以上的目录组织结果;
  6. 哪些东西适合容器运行?
  7. - docker启动一个MySQL,默认什么都不做?
  8. - MySQL就会丢失数据
  9. - 文件挂载
  10. - docker commit:能提交,MySQL的容器,也能提交。100G100G
  11. <a name="DZY9X"></a>
  12. ## 2、Images and layers
  13. Docker映像由一系列层组成。 每层代表图像的Dockerfile中的一条指令。 除最后一层外的每一层都是只 <br />读的。 如以下Dockerfile
  14. - Dockerfile文件里面几句话,镜像就有几层
  15. ```shell
  16. FROM ubuntu:15.04
  17. COPY . /app
  18. RUN make /app
  19. CMD python /app/app.py
  20. # 每一个指令都可能会引起镜像改变,这些改变类似git的方式逐层叠加。
  1. Dockerfile包含四个命令,每个命令创建一个层。
  2. FROM语句从ubuntu15.04映像创建一个图层开始。
  3. COPY命令从Docker客户端的当前目录添加一些文件。
  4. RUN命令使用make命令构建您的应用程序。
  5. 最后,最后一层指定要在容器中运行的命令。
  6. 每一层只是与上一层不同的一组。 这些层彼此堆叠。
  7. 创建新容器时,可以在基础层之上添加一个新的可写层。 该层通常称为“容器层”。 对运行中
  8. 的容器所做的所有更改(例如写入新文件,修改现有文件和删除文件)都将写入此薄可写容
  9. 器层。

image.png

3、Container and layers

  1. 容器和镜像之间的主要区别是可写顶层。
  2. 在容器中添加新数据或修改现有数据的所有写操作都存储在此可写层中。
  3. 删除容器后,可写层也会被删除。 基础图像保持不变。 因为每个容器都有其自己的可写容
  4. 器层,并且所有更改都存储在该容器层中,所以多个容器可以共享对同一基础映像的访问,
  5. 但具有自己的数据状态。

image.png

4、磁盘容量预估

  1. docker ps -s
  2. size:用于每个容器的可写层的数据量(在磁盘上)。
  3. virtual size:容器使用的用于只读图像数据的数据量加上容器的可写图层大小。
  4. 多个容器可以共享部分或全部只读图像数据。
  5. 从同一图像开始的两个容器共享100%的只读数据,
  6. 而具有不同图像的两个容器(具有相同的层)共享这些公共层。
  7. 因此,不能只对虚拟大小进行总计。这高估了总磁盘使用量,可能是一笔不小的数目。

5、镜像如何挑选

  1. busybox:是一个集成了一百多个最常用Linux命令和工具的软件。linux工具里的瑞士军刀
  2. alpineAlpine操作系统是一个面向安全的轻型Linux发行版经典最小镜像,基于busybox,功能比
  3. Busybox完善。 slimdocker hub中有些镜像有slim标识,都是瘦身了的镜像。也要优先选择
  4. 无论是制作镜像还是下载镜像,优先选择alpine类型.

6、Copy On Write

  1. 写时复制是一种共享和复制文件的策略,可最大程度地提高效率。
  2. 如果文件或目录位于映像的较低层中,而另一层(包括可写层)需要对其进行读取访问,则它仅使
  3. 用现有文件。
  4. 另一层第一次需要修改文件时(在构建映像或运行容器时),将文件复制到该层并进行修改。
  5. 样可以将I / O和每个后续层的大小最小化