Docker——理解好镜像和容器的关系

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker——理解好镜像和容器的关系镜像也是 docker 的核心组件之一,镜像时容器运行的基础,容器是镜像运行后的形态。前面我们介绍了容器的用法,今天来和大家聊聊镜像的问题。​本文是本系列的第四篇,阅读前面文章有助于更好的理解本文:1.Docker 入门及安装[Docker 系列-1]2.Docker 容器基本操作[Docker 系列-2]3.Docker 容器高级操作[Docker 系列-3]总体来说,镜像是一个包含程序运行必要以来环境和代码的只读文件,它采用分层的文件系统,将每一层的改变以读写层的形式增加到原来的只读文件上。

Docker——理解好镜像和容器的关系
镜像也是 docker 的核心组件之一,镜像时容器运行的基础,容器是镜像运行后的形态。前面我们介绍了容器的用法,今天来和大家聊聊镜像的问题。

​本文是本系列的第四篇,阅读前面文章有助于更好的理解本文:

1.Docker 入门及安装[Docker 系列-1]

2.Docker 容器基本操作[Docker 系列-2]

3.Docker 容器高级操作[Docker 系列-3]

总体来说,镜像是一个包含程序运行必要以来环境和代码的只读文件,它采用分层的文件系统,将每一层的改变以读写层的形式增加到原来的只读文件上。这有点像洋葱,一层一层的,当我们后面学习了 Dockerfile ,相信大家对于这样的架构理解将更为准确。

镜像与容器的关系
前文已经向读者介绍过容器的使用了,细心的读者可能已经发现,容器在启动或者创建时,必须指定一个镜像的名称或者 id ,其实,这时镜像所扮演的角色就是容器的模版,不同的镜像可以构造出不同的容器,同一个镜像,我们也可以通过配置不同参数来构造出不通的容器。如下命令:

docker run -itd --name nginx nginx
命令中的最后一个 nginx 即表示创建该容器所需要的镜像(模版),当然这里还省略了一些信息,例如版本号等,这些我们后文会详细介绍。

镜像的体系结构
镜像的最底层是一个启动文件系统(bootfs)镜像,bootfs 的上层镜像叫做根镜像,一般来说,根镜像是一个操作系统,例如 Ubuntu、CentOS 等,用户的镜像必须构建于根镜像之上,在根镜像之上,用户可以构建出各种各样的其他镜像。
从上面的介绍读者可以看出,镜像的本质其实就是一系列文件的集合,一层套一层的结构有点类似于 Git ,也有点类似于生活中的洋葱

镜像的写时复制机制
通过 docker run 命令指定一个容器创建镜像时,实际上是在该镜像之上创建一个空的可读写的文件系统层级,可以将这个文件系统层级当成一个临时的镜像来对待,而命令中所指的模版镜像则可以称之为父镜像。父镜像的内容都是以只读的方式挂载进来的,容器会读取共享父镜像的内容,用户所做的所有修改都是在文件系统中,不会对父镜像造成任何影响。当然用户可以通过其他一些手段使修改持久化到父镜像中,这个我们后面会详细介绍到。

简而言之,镜像就是一个固定的不会变化的模版文件,容器是根据这个模版创建出来的,容器会在模版的基础上做一些修改,这些修改本身并不会影响到模版,我们还可以根据模版(镜像)创建出来更多的容器。

如果有必要,我们是可以修改模版(镜像)的。

镜像查看
用户可以通过 docker images 命令查看本地所有镜像,如下:

这里一共有五个参数,含义分别如下:

TAG: TAG用于区分同一仓库中的不同镜像,默认为latest。

IMAGE ID: IMAGE ID是镜像的一个唯一标识符。

CREATED: CREATED表示镜像的创建时间。

SIZE: SIZE表示镜像的大小。

REPOSITORY:仓库名称,仓库一般用来存放同一类型的镜像。仓库的名称由其创建者指定。如果没有指定则为 。一般来说,仓库名称有如下几种不同的形式:

使用 docker images 命令可以查看本地所有的镜像,如果镜像过多,可以通过通配符进行匹配,如下:

如果需要查看镜像的详细信息,也可以通过上文提到的 docker inspect 命令来查看。

镜像下载
当用户执行 docker run 命令时,就会自动去 Docker Hub 上下载相关的镜像,这个就不再重复演示,开发者也可以通过 search 命令去 Docker Hub 上搜索符合要求的镜像,如下:

其中:

NAME:表示镜像的名称。

DESCRIPTION:表示镜像的简要描述。

STARS:表示用户对镜像的评分,评分越高越可以放心使用。

OFFICIAL:是否为官方镜像。

AUTOMATED:是否使用了自动构建。

在执行 docker run 命令时再去下载,速度会有点慢,如果希望该命令能够快速执行,可以在执行之前,先利用 docker pull 命令将镜像先下载下来,然后再运行。

运行命令如下:

镜像删除
镜像可以通过 docker rmi 命令进行删除,参数为镜像的id或者镜像名,参数可以有多个,多个参数之间用空格隔开。如下:

有的时候,无法删除一个镜像,大部分原因是因为该镜像被一个容器所依赖,此时需要先删除容器,然后就可以删除镜像了,删除容器的命令可以参考本系列前面的文章。

通过前面文章的阅读,读者已经了解到所谓的容器实际上是在父镜像的基础上创建了一个可读写的文件层级,所有的修改操作都在这个文件层级上进行,而父镜像并未受影响,如果读者需要根据这种修改创建一个新的本地镜像,有两种不同的方式,先来看第一种方式:commit。

创建容器
首先,根据本地镜像运行一个容器,如下:

命令解释:

首先执行 docker images 命令,查看本地镜像。

根据本地镜像中的 nginx 镜像,创建一个名为 nginx 的容器,并启动。

将宿主机中一个名为 index.html 的文件拷贝到容器中。

访问容器,发现改变已经生效。

接下来再重新创建一个容器,名为 nginx2.

访问 nginx2 ,发现 nginx2 中默认的页面还是 nginx 的默认页面,并未发生改变。

commint 创建本地镜像
接下来,根据刚刚创建的第一个容器,创建一个本地镜像,如下:

命令解释:

参数 -m 是对创建的该镜像的一个简单描述。

--author 表示该镜像的作者。

ce1fe32739402 表示创建镜像所依据的容器的 id。

sang/nginx 则表示仓库名,sang 是名称空间,nginx 是镜像名。

v1 表示仓库的 tag。

创建完成后,通过 docker images 命令就可以查看到刚刚创建的镜像。

通过刚刚创建的镜像运行一个容器,访问该容器,发现 nginx 默认的首页已经发生改变。

这是我们通过 commint 方式创建本地镜像的方式,但是 commit 方式存在一些问题,比如不够透明化,无法重复,体积较大,为了解决这些问题,可以考虑使用 Dockerfile ,实际上,主流方案也是 Dockerfile。

Dockerfile
Dockerfile 就是一个普通的文本文件,其内包含了一条条的指令,每一条指令都会构建一层。先来看一个简单的例子。

首先在一个空白目录下创建一个名为 Dockerfile 的文件,内容如下:

命令解释:

FROM nginx 表示该镜像的构建,以已有的 nginx 镜像为基础,在该镜像的基础上构建。

MAINTAINER 指令用来声明创建镜像的作者信息以及邮箱信息,这个命令不是必须的。

RUN 指令用来修改镜像,算是使用比较频繁的一个指令了,该指令可以用来安装程序、安装库以及配置应用程序等,一个 RUN 指令执行会在当前镜像的基础上创建一个新的镜像层,接下来的指令将在这个新的镜像层上执行,RUN 语句有两种不同的形式:shell 格式和 exec 格式。本案例采用的 shell 格式,shell 格式就像 linux 命令一样,exec 格式则是一个 JSON 数组,将命令放到数组中即可。在使用 RUN 命令时,适当的时候可以将多个 RUN 命令合并成一个,这样可以避免在创建镜像时创建过多的层。

COPY 语句则是将镜像上下文中的 hello.html 文件拷贝到镜像中。

文件创建完成后,执行如下命令进行构建:

命令解释:

-t 参数用来指定镜像的命名空间,仓库名以及 TAG 等信息。

最后面的 . 是指镜像构建上下文。

注意:

Docker 采用了 C/S 架构,分为 Docker 客户端(Docker 可执行程序)与 Docker 守护进程,Docker 客户端通过命令行和 API 的形式与 Docker 守护进程进行通信,Docker 守护进程则提供 Docker 服务。因此,我们操作的各种 docker 命令实际上都是由 docker 客户端发送到 docker 守护进程上去执行。我们在构建一个镜像时,不可避免的需要将一些本地文件拷贝到镜像中,例如上文提到的 COPY 命令,用户在构建镜像时,需要指定构建镜像的上下文路径(即前文的 . ), docker build 在获得这个路径之后,会将路径下的所有内容打包,然后上传给 Docker 引擎。

镜像构建成功后,可以通过 docker images 命令查看,如下:

然后创建容器并启动,就可以看到之前的内容都生效了。

总结
本文主要向大家介绍了 Docker 中镜像的基本操作,操作其实并不难,关键是理解好镜像和容器的关系,以及镜像洋葱式的文件结构。
原文地址https://www.cnblogs.com/justdojava/p/11271246.html

相关文章
|
3天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
3天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
3天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
12小时前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
7 2
如何删除 Docker 镜像、容器和卷?
|
2天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
12 0
|
3天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
3天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
3天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
3天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
|
3天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用