一、什么是docker容器
Docker容器是一种轻量级、可移植的软件封装技术,它允许开发者将应用程序及其依赖、配置文件、运行环境等打包到一个独立的、自包含的执行单元中。容器与虚拟机相似,都提供了隔离的运行环境,但容器更加轻量级,因为它不需要像虚拟机那样为每个应用配备完整的操作系统;而是共享主机的操作系统内核,同时利用资源隔离机制(如cgroups和命名空间)来保证容器间互不影响。
Docker容器的核心优势包括:
- 轻量级:启动和停止速度极快,资源利用率高,相比传统虚拟机,容器在内存和CPU使用上更为高效。
- 标准化:Docker镜像提供了一种标准化的软件打包和交付方式,使得应用程序可以在任何支持Docker的环境中一致地运行,实现了"一次构建,到处运行"。
- 隔离性:每个容器都在自己的视图中运行,拥有独立的文件系统、网络配置、进程空间等,与宿主机和其他容器隔离。
- 可移植性:Docker容器可以在不同的硬件平台、操作系统和云环境中无缝迁移。
- 可扩展性:易于创建、复制和销毁容器,便于实现水平扩展和负载均衡。
容器与虚拟机的区别
为什么要和虚拟机做比较,用过虚拟机的同学应该知道,虚拟机也是将主机资源分配出一部分,进行隔离,提供另一个系统环境。但是虚拟机是模拟出了一台完整的电脑,包括它的硬件资源,虚拟机是可以像电脑一样进入bios中,使用u盘安装系统的。
容器
容器是应用层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器占用的空间比VM少(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要更少的VM和操作系统。
虚拟机
虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。管理程序允许多台VM在单台机器上运行。每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。虚拟机也可能很慢启动。
为什么要使用容器?
首先建立在我们需要环境隔离的基础上。
根据上面的介绍,可以看出虚拟机,是主机级虚拟化,完整的虚拟出一台计算机,然后在虚拟出来的机器上安装操作系统,做到环境隔离。想想我们的服务部署在虚拟机上是什么情况。
如上图所示,在宿主机中安装了系统,系统中安装了虚拟机,虚拟机虚拟出一台计算机,在虚拟计算机中安装完整的系统,再将服务部署在虚拟系统中。
部署的服务受虚拟机的内核调度,虚拟机受主机的调度,多层及下主机资源产生了严重的浪费。如果要在一台机器上部署多个服务,还要环境隔离,那就需要有多个虚拟机,所需要的资源也就不言而喻。
如果使用容器是什么样的呢?
容器是在主机的操作系统中,隔离出单独的用户空间,每个都是单独的沙箱,环境互不影响。需要的系统资源也只是服务所需要的资源,减少了虚拟主机的资源开销。
二、什么是镜像
Docker镜像(Docker Image)是Docker技术中的核心组件之一,它是一个轻量级、可执行的独立软件包,充当了创建Docker容器的蓝图或模板。镜像定义了运行应用程序所需的所有内容,包括代码、运行时环境(如Python、Node.js等)、库依赖、环境变量、配置文件以及操作系统的层。每个Docker容器都是从某个镜像实例化而来的。
Docker镜像的几个关键特性包括:
-
分层结构:Docker镜像是由多个层(layers)组成的,每一层代表了文件系统的差异变更。这种分层设计使得镜像的构建、传输和存储更加高效。当一个层被更改或添加,只会保存该层的差异部分,而非整个镜像,这有助于减小存储占用和加速镜像的传输过程。
-
不可变性:一旦构建完成,镜像的内容就是静态的、只读的。这意味着运行时对容器的修改不会影响到原始镜像,保证了环境的一致性和可复现性。
-
内容寻址:每个镜像层都有一个唯一的ID,通常是通过SHA256算法计算得出的校验和,确保了镜像的唯一性和完整性。当从Docker Hub或其他注册表下载镜像时,Docker会检查本地是否已存在相同的层,从而避免重复下载,提高了效率。
-
可移植性:Docker镜像可以在任何支持Docker的平台上运行,确保了应用程序在不同环境之间的一致运行,实现了"一次构建,到处运行"的理念。
-
创建与管理 :用户可以通过Dockerfile来定义和自动化构建镜像的过程,也可以基于现有镜像使用
docker commit
命令创建新镜像,或者通过docker pull
命令从Docker Hub等镜像仓库下载镜像,使用docker images
命令查看本地镜像列表。
三、什么是仓库
Docker仓库(Docker Repository)是集中存储和分发Docker镜像的场所,类似于代码仓库用于存储代码一样,Docker仓库用于存放用户创建或下载的Docker镜像(可以理解为软件商店)。仓库是Docker生态系统中非常关键的一部分,它支持Docker镜像的分享、重用和版本控制。
Docker仓库可以分为两大类:
-
公共仓库:最知名的公共仓库是Docker Hub,这是Docker官方维护的服务,用户可以免费上传和下载镜像。Docker Hub上存有成千上万的镜像,包括各种流行的应用、服务以及基础镜像,如Ubuntu、Nginx、MySQL等。任何人都可以搜索、下载这些镜像来使用,也可以上传自己的镜像供他人使用。
-
私有仓库:除了公共仓库,用户或组织还可以搭建自己的私有仓库,用于存储和管理不想公开的镜像,或满足企业内部的安全和合规要求。私有仓库可以使用Docker官方提供的Docker Registry软件来部署,也可以使用第三方的私有仓库解决方案,如Harbor、GitLab Container Registry等。
Docker仓库的工作原理涉及仓库注册服务器(Registry),这是一个存储和分发镜像的服务端组件。每个仓库可以包含多个镜像,每个镜像又有不同的标签(tags),标签用来标记镜像的版本或变体。当用户执行docker pull
或docker push
命令时,实际上是在与仓库注册服务器进行通信,以下载或上传镜像。