写在前面:该小册买过好久,笔记也早就整理好放在幕布上了。现整理在blog中,以便翻阅。
Docker实践指南-笔记:镜像与容器
Docker 镜像
- 镜像是对容器运行环境进行持久化存储的结果
- 镜像是由Docker管理的
- 镜像必须通过Docker来打包
- 也必须通过Docker下载或导入后使用
- 不能单独将镜像恢复成容器中的文件系统
- 镜像唯一编码
每一个记录文件系统修改的镜像层来说,Docker都会根据信息生成一个Hash码(64位,全球唯一)
- 基于镜像层的唯一编码,就可以区分不同镜像层并能保证它们的内容与编码是一致的
- 可以在镜像之间共享镜像层(前面提过的联合文件系统)
- 查看镜像
- docker images 可以查看镜像如下信息:
- 镜像的ID IMAGE ID
- 只显示了镜像的前12个字符而非全部64个字符
- 构建时间 CREATED
- 占用空间 SIZE
- 其他
- 镜像的ID IMAGE ID
- docker images 可以查看镜像如下信息:
- 镜像命名
- 比IMAGE ID人性化,更容易识别镜像
- 三个部分:
- username:主要用于识别上传镜像的不同用户,与 GitHub 中的用户空间类似
- docker images结果中,有的没有username部分
- 没有username部分的镜像是由Docker官方维护和提供的
- repository:主要用于识别进行的内容,形成对镜像的表意描述
- 很多都像是软件名
- 因为Docker对容器的轻量化设计,通常一个容器中仅运行一个应用程序
- tag:主要用户表示镜像的版本,方便区分进行内容的不同细节
- 镜像的标签主要是为了区分同类镜像不同构建过程所产生的不同结果的
- 比如体现镜像中包含应用程序的版本,例如:redis 4.3(4.3是版本号)
- 未给出具体镜像的tag时,Docker会采用latest作为缺省tag
我们在不需要了解应用程序迭代周期的情况下,可以利用 latest 镜像保持软件最新版本的使用。
- username:主要用于识别上传镜像的不同用户,与 GitHub 中的用户空间类似
容器的生命周期
生命周期
容器运行的状态流转图:
- 核心状态:
- Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
- Running:容器正在运行,也就是容器中的应用正在运行。
最为关键的状态,在这种状态中的容器,就是真正在运行的容器
- Paused:容器已暂停,表示容器中的所有程序都处于暂停 ( 不是停止 ) 状态。
- Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
- Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。
- 核心状态:
主进程
- 容器的生命周期,与容器中PID为1这个进程有密切关系
- 容器的启动本质上可以理解为这个进程的启动
- 容器的停止也意味着这个进程 的停止
- 启动容器时:
- Docker会按照镜像中的定义,启动对应的程序
- 将这个程序的主进程作为容器的主进程(PID为1的进程 )
- 控制容器停止时:
- Docker会向主进程 发送结束信号,通知程序退出
- 主进程 主动关闭(正常或出错停止)
- 容器也会随之停止
- 容器的生命周期,与容器中PID为1这个进程有密切关系
写时复制机制:
在编程里,写时复制常常用于对象或数组的拷贝中,当我们拷贝对象或数组时,复制的过程并不是马上发生在内存中,而只是先让两个变量同时指向同一个内存空间,并进行一些标记,当我们要对对象或数组进行修改时,才真正进行内存的拷贝。
- Docker的写时复制与编程类似
- 在通过镜像运行容器时,并不是马上就把镜像里所有 内容拷贝到容器所运行的沙盒文件系统里
- 利用UnionFS将镜像以只读的方式挂载到沙盒文件 系统中
- 只有在容器中发生对文件 的修改时,修改才会体现到沙盒环境上
- 本文作者: xiaoxiaozi
- 本文链接: http://www.xiaoxiaozi.com/2022/08/04/juejin_docker_3/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!