很多刚刚接触容器技术的朋友,不容易弄清楚容器,容器镜像和Docker这几个词的区别和联系。
我们首先来看容器和容器镜像。举个例子,执行命令行docker search nginx,搜索结果的一条条记录就是一个个容器镜像。
所谓镜像,就是一个静态概念,一个镜像由若干只读层(read-only layer)构成。
上图左边是Docker镜像的内部实现细节,我们能看到多个只读层叠加在一起,层与层之间通过指针关联,这些层能够在运行Docker的宿主机的文件系统上访问到。
Linux的统一文件系统(union file system)技术将这些叠加的只读层合并成一个文件系统,该系统为这些只读层提供了一个统一的视角,从而为Docker的用户隐藏了多层的存在。
从Docker用户的视角出发,一个Docker镜像只存在一个文件系统,即上图右边所示。
这些文件系统的设计是Docker实现细节,一般情况下我们不用去深究。但如果您足够好奇,使用命令sudo tree浏览目录 /var/lib/docker即可:
比如我用命令docker images浏览下载到本地的docker镜像:
其中一个叫jerry-nginx的镜像,是一个web应用,它的所有内容能在/var/lib/docker目录下的这个目录查到:
讲完了容器镜像,我们再来看容器。
容器和容器镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,如上图绿色图例所示。
初学者可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层
我们如果用命令docker ps --all查看本机所有容器列表,会发现有的容器处于运行状态,有的处于退出状态。
因此,一个处于运行状态的容器(running container)包含一个可读写的文件系统加上隔离的进程空间。
容器里的进程可以对这个可读写文件系统内的文件进行修改、删除、创建等操作。
镜像里每一层其实都能在docker文件夹的containers子目录下找到:
上图每一个红色文件夹代表镜像里的一层,蓝色文件包含了该层运行时的日志文件,或者网络相关配置等。
做个实验:
ubuntu这个容器执行结束后,使用find / -name i042416.txt文件,这说明docker运行时能对宿主机的文件系统进行写操作。
下面分析几个常用的易混淆的命令。
docker create <image-id>
先看它的帮助文档:
试着执行以下:
产生一个输出id:
7ee10851c3f1e53bbd35e5f196f34de560afa1a20d9bf1ced587630dbcda877b
create创建的容器,状态变为created:
docker create命令给通过命令行传入的容器镜像创建了一个新的可读可写层,从而生成了一个新的容器实例:
然后再执行docker start,输入docker create创建的容器实例ID,就可以启动这个容器实例了。
而docker run其实就是docker create和docker start这两个命令合二为一的版本。
希望这篇文章能帮助大家理解容器和容器镜像的区别。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
该方法可以提高 Docker 容器镜像的更新效率,减少更新过程中的网络带宽占用和服务器负载。 知识点1: Docker 容器镜像增量更新的必要性 在实际应用中,Docker 容器镜像的更新是非常必要的。由于 Docker 容器镜像的...
基础容器镜像,不到10兆,适合部署微服务
深入Docker的镜像,容器和仓库以及测试下的Docker
docker docker _ 容器和镜像的区别
使用IDEA编辑器远程管理docker镜像及容器服务,可以实现 docker容器和镜像的基本操作,例如启动、停止、删除容器,创建、删除镜像等。 七、结论 使用IDEA远程管理docker镜像及容器服务,可以实现docker容器和镜像...
本文将详细介绍 Docker 容器与镜像的使用方法,包括获取镜像、启动容器、停止容器、导入和导出容器等操作。 获取镜像 使用 `docker pull` 命令可以获取指定的镜像。例如,要获取 Ubuntu 的镜像,可以使用以下命令...
于是,我花了几周的时间来学习Docker的工作原理,更确切地说,是关于Docker统一文件系统(the union file system)的知识,然后回过头来
2.2导入容器镜像 4 2.3运行该镜像(带上command参数) 4 3、生成容器快照镜像 4 四、使用dockerfile制作镜像创建器 4 1、构建Nginx环境镜像 5 1.1 准备文件 5 1.2 创建dockerfile文件 5 1.3构建nginx镜像 5 1.4创建...
alpine ARM版本容器镜像
镜像安全是指保护容器镜像免受攻击和篡改。这个过程包括了多个方面: * 持续扫描所有镜像以发现安全漏洞。 * 只部署经验证签名的镜像。 * 使用私有镜像仓库,并限制公共镜像仓库的使用。 * 维护标准基本镜像,并...
手把手打镜像并运行到k8s容器上(亲测可用) 博客地址:https://blog.csdn.net/qq_36963950/article/details/125036352 第一个示例:wordpress博客系统 第二个示例:自己写一个springboot项目生成镜像部署到K8S集群...
nginx ARM平台容器镜像
openjdk ARM平台容器镜像
容器镜像仓库的搭建与运维管理方案.docx
Heapster是容器集群监控和性能分析工具,支持Kubernetes和CoreOS。 Kubernetes有个监控agent—cAdvisor。在每个kubernetes Node上都会运行cAdvisor,它会收集本机以及容器的监控数据(cpu,memory,filesystem,network...
centos 7.9 ARM平台容器镜像
Calico是一种开源网络和网络策略项目,专门设计用于在容器化环境中实现高性能的网络连接和服务发现。它在Kubernetes、Docker以及其他的容器编排系统中广泛应用,提供了一种高效、灵活且高度可扩展的解决方案,使容器...
MySQL的版本是8.0.21。docker可加载到image镜像。加载成功后 使用docker images命令可查看。
该篇文档记录了通过容器提交镜像(docker commit)以及推送镜像(docker push)的操作过程,在此分享,希望能帮助到有用到的朋友!
本文主要讲解了容器镜像的概念和原理,通过讲解 Linux 容器的基础技术:Namespace 和 Cgroups,来帮助读者理解容器的本质。然后,通过一个小程序的示例,验证了容器里的应用进程看到的文件系统是一个完全独立的文件...