镜像
概述
1、一种轻量级、可执行的独立软件包,包含运行某个软件所需的所有内容
2、把应用程序和配置依赖,打包形成一个可交付的运行环境(包括代码、运行时所需库、环境变量、配置文件等),这个打包好的运行环境就是 image 文件
3、只有通过镜像文件才能生成 Docker 容器实例
UnionFS(联合文件系统)
1、一种分层、轻量级、高性能的文件系统
2、支持对文件系统的修改,作为一次提交,来一层层地叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
3、Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
4、特性:一次同时加载多个文件系统,但只能看到一个文件系统,联合加载会叠加各层文件系统,最终的文件系统会包含所有底层的文件和目录
镜像分层
1、docker 镜像实际上由一层层的文件系统组成,即文件系统 UnionFS
2、优点
(1)共享资源,方便复制迁移、复用
(2)多个镜像都从相同的 base 镜像构建,则 Docker Host 只需在磁盘上保存一份 base 镜像
(3)同时内存中只需加载一份 base 镜像,就可以为所有容器服务,而且镜像的每一层都可以被共享
3、容器层
(1)当容器启动时,一个新的可写层被加载到镜像的顶部
(2)容器层之下都为镜像层
(3)所有对容器的改动(添加、删除、修改),都只会发生在容器层中
(4)只有容器层是可写的,容器层之下的所有镜像层都是只读的
Docker 镜像加载原理
1、bootfs(boot file system)
(1)在 Docker 镜像的最底层是引导文件系统 bootfs,这一层与 Linux / Unix 系统相同,包含 bootloader、kernel
(2)bootloader 主要是引导加载 kernel
(3)Linux 刚启动时会加载 bootfs 文件系统,当 boot 加载完成后,整个 kernel 都在内存中,此时内存使用权已由 bootfs 转交给 kernel,此时系统也会卸载 bootfs
2、rootfs(root file system)
(1)在 bootfs 之上,包含 Linux 系统中的 /dev、/proc、/bin、/etc 等标准目录和文件
(2)rootfs 就是各种不同的操作系统发行版,比如:Ubuntu,CentOS 等
(3)对于一个精简 OS,rootfs 可以很小,只需要包括最基本的命令、工具、程序库,因为底层直接用主机的 kernel,用户只需要提供 rootfs
(4)对于不同 Linux 发行版,bootfs 基本一致,rootfs 会有差别,因此不同的发行版可以公用 bootfs
从一个容器的变化中创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
1、描述
(1)将一个容器的文件变化或设置提交到一个新的镜像中
(2)允许通过运行交互式 shell 来调试一个容器,或者将一个工作数据集导出到另一个服务器
(3)一般来说,使用 Dockerfiles 来管理镜像是比较好的,因为它是有记录和可维护的方式
(4)提交操作将不包括安装在容器内的卷中的任何数据
(5)默认情况下,在提交镜像的过程中,被提交的容器及其进程将被暂停,这减少了在创建提交的过程中,遇到数据损坏的可能性,如果不希望出现这种行为,请将 --pause 选项设置为 false
(6)--change 选项将对创建的镜像应用 Dockerfile 指令,支持的 Dockerfile 指令:cmd | entrypoint | env | expose | label | onbuild | user | volume | workdir
2、OPTIONS
(1)--author、-a:作者信息(例如:"John Hannibal Smith <hannibal@a-team.com>")
(2)--change、-c:对创建的镜像应用 Dockerfile 指令
(3)--message、-m:提交信息
(4)--pause、-p:提交时暂停容器,默认值为 true
推送镜像或资源库到注册中心
docker push [OPTIONS] NAME[:TAG]
1、描述
(1)使用 docker image push 来分享镜像到 Docker Hub 注册中心或自我托管的注册中心
(2)杀死 docker image push 进程,例如:当它在终端运行时按下 CTRL-c,就会终止推送操作
(3)docker 推送过程中会显示进度条,显示未压缩的大小,实际推送的数据量在发送前会被压缩,所以上传的大小不会被进度条反映出来
(4)注册表凭证由 docker login 管理
(5)并发上传:默认情况下,Docker 守护进程将一次推送 5 层镜像
2、OPTIONS
(1)--all-tags、-a:推送版本库中所有带标签的镜像
(2)--disable-content-trust:跳过镜像签名,默认为 true
(3)--quiet、-q:摒弃冗长的输出
本地镜像推送到私有仓库
1、拉取 registry
docker pull registry
(1)Docker Registry 是官方提供的工具,可以用于构建私有镜像仓库
2、创建一个指向 SOURCE_IMAGE 的标签 TARGET_IMAGE
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
(1)镜像名称由斜线分隔的名称组件组成,可选择以注册表主机名为前缀
(2)主机名必须符合标准的 DNS 规则,但不能包含下划线
(3)如果有一个主机名,可以选择在它后面加上一个格式为 :8080 的端口号,如果不存在,该命令默认使用位于 registry-1.docker.io 的 Docker 公共注册表
(4)名称组件可以包含小写字母、数字、分隔符,分隔符被定义为一个句号、一个或两个下划线或一个或多个破折号,一个名称组件不能以分隔符开始或结束
(5)标签名称必须是有效的 ASCII 码,可以包含小写和大写字母、数字、下划线、句号、破折号,标签名称不得以句号或破折号开始,最多可包含 128 个字符
3、推送镜像或资源库到注册中心
docker push [OPTIONS] NAME[:TAG]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战