有一个最常见的例子来很好的帮我们简单了解Docker容器技术:
当我们在一台计算机中配置好了环境,花费了极大的时间和精力成功开发部署好了一个应用。准备尝试在不同操作系统、不同环境下部署这个应用时,我们需要在目标环境中安装依赖库、框架等,但是这些环境可能与开发环境不同,会发现有些 bug 并未在开发过程中被发现,运行时可能出现的不兼容性问题,导致运行失败。
Docker容器正是解决这样的问题的,通过Docker容器化技术,将应用程序及其依赖项打包成一个独立的容器,容器中包含了应用程序运行所需的所有依赖项和环境,通过容器化技术,可以在不同操作系统、不同环境中运行应用程序,避免了不兼容性问题。
但其实Docker的用处远不止如此:
Docker
对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。Docker
容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。Docker
确保了执行环境的一致性,使得应用的迁移更加容易。Docker
可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。Docker
使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker
团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。Docker包括了三个基本概念:
镜像(Image
):Docker镜像①它是一个特殊的文件系统,提供Docker容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。②它不包含 任何动态数据,其内容在构建之后也不会被改变。③它是使用分层存储技术Union FS 来存储的。④它是通过Dockerfile来构建的,Dockerfile是一个文本文件,通过其描述的指令,Docker可以自动化构建出一个Dokcer镜像,并将其保存在Docker仓库中。
仓库(Repository
):Docker仓库①它是一个用于存储、管理和分享Docker镜像的平台。②它分为公共仓库和私有仓库,公共仓库由Docker官方提供,私有仓库由用户自己搭建存储镜像。③通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本的镜像。
容器(Container
):Docker容器①它和镜像之间是 类
和 实例 的关系。这样解释:假设python中有一个类(class)Person被创建,它的初始化参数为def __init__(self, name, age),那么当我们编译代码person1 = Person("Alice", 19),person2 = Person("Jon", 24)时,person1和person2就是两个不同的实例。②
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
Docker容器和虚拟机主要区别在于他们的架构和资源利用方式不一样。
Docker容器是基于操作系统级别的虚拟化技术,它允许在单个操作系统实例中运行多个容器,每一个容器都可以拥有之间的应用程序、库和文件系统,并且它们都可以共享宿主机的操作系统的内核和硬件资源。因此占用的资源相对较少,启动和停止速度也非常快。
虚拟机则是基于硬件级别的虚拟化技术,它通过在物理服务器上运行多个虚拟机来实现资源的隔离和共享。多个虚拟机它们并非在同一个操作系统下,每一个虚拟机都有之间的操作系统和应用程序,并且它们需要使用虚拟化层来模拟硬件资源,所以占用的资源相对较多,启动和停止的速度比较慢。
这也是为什么Docker容器为什么更加轻量、灵活和高效的原因。