认识 Docker 容器技术和镜像仓库
一、Docker 技术简介
Docker 最初是 dotCloud
公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 MARKDOWN_HASH301b653a21592bb0463c36f79326b9c7MARKDOWNHASH
公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源](https://en.wikipedia.org/wiki/Docker(software)),主要项目代码在 GitHub 上进行维护。Docker
项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目 已经超过 5 万 7 千个星标和一万多个 fork
。甚至由于 Docker
项目的火爆,在 2013
年底,dotCloud 公司决定改名为 Docker。Docker
最初是在 Ubuntu 12.04
上开发实现的;Red Hat
则从 RHEL 6.5
开始对 Docker
进行支持;Google
也在其 PaaS
产品中广泛应用 Docker
。
Docker 使用 Google
公司推出的 Go 语言 进行开发实现,基于 Linux
内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7
版本以后开始去除 LXC
,转而使用自行开发的 libcontainer,从 1.11
版本开始,则进一步演进为使用 runC 和 containerd。
runc
是一个 Linux 命令行工具,用于根据 OCI容器运行时规范 创建和运行容器。
containerd
是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
二、Docker 的优势
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker
技术比虚拟机技术更为轻便、快捷。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
三、为什么要用 Docker
-
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,
Docker
对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。 -
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而
Docker
容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。 -
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而
Docker
的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。 -
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用
Docker
可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。 而且使用
Dockerfile
使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。 -
更轻松的迁移
由于
Docker
确保了执行环境的一致性,使得应用的迁移更加容易。Docker
可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。 -
更轻松的维护和扩展
Docker
使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker
团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。 -
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB |
一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
四、认识 Docker Registry 和 Harbor 仓库
1. Docker Registry
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个 仓库(Repository
);每个仓库可以包含多个 标签(Tag
);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest
作为默认标签。
以 Ubuntu 镜像 为例,ubuntu
是仓库的名字,其内包含有不同的版本标签,如,16.04
, 18.04
。我们可以通过 ubuntu:16.04
,或者 ubuntu:18.04
来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu
,那将视为 ubuntu:latest
。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy
,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
基本上 Docker Registry 分这么几种:
-
Docker Registry 公开服务:
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的 官方镜像。除此以外,还有 Red Hat 的 Quay.io;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务;代码托管平台 GitHub 推出的 ghcr.io
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror
),这些镜像服务被称为 加速器。常见的有 阿里云加速器、DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 安装 Docker 一节中有详细的配置方法。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库 等。 -
私有 Docker Registry:
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。
开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持
docker
命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。 除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,Harbor 和 Sonatype Nexus。
2. Harbor 仓库
Harbor 是一个企业级的 Docker Registry 项目,旨在增强和扩展开源 Docker Registry 的功能。它最初由 VMware 开发,目前已经成为 CNCF(Cloud Native Computing Foundation)的一个开源项目。
Harbor 提供了以下功能,使其在企业环境中非常有吸引力:
- 身份验证和访问控制:Harbor 支持集成 LDAP、OIDC 等身份验证方式,并可以设置细粒度的权限控制。
- 镜像复制:Harbor 支持在不同的 Harbor 实例之间复制镜像,这对于全球分布的团队非常有用。
- 镜像签名和安全扫描:Harbor 集成了 Clair 和 Notary,用于镜像的安全扫描和签名,确保镜像的安全性和完整性。
- 多租户支持:Harbor 通过项目(Projects)来支持多租户,每个项目可以管理独立的镜像库和用户权限。
- 图形用户界面 (GUI):相比于基础的 Docker Registry,Harbor 提供了更友好的 Web 界面,方便用户管理和查看镜像。
可以理解为 Harbor 仓库是一个更高级的 Docker Registry,提供了增强的安全性、管理性和可用性功能,适合在企业级环境中使用。
五、Docker Registry 和 Harbor 仓库 的应用场景
1. Docker Registry
- 小型开发团队或个人项目
- 对于个人开发者或小型团队,Docker Hub(公共 Registry)是一个方便的选择。团队可以通过它推送、拉取镜像,用于开发、测试和部署。
- 应用场景:一个开发者在本地构建了一个新的应用镜像,可以将其推送到 Docker Hub,以便在另一台机器上轻松拉取并部署。
- 本地私有镜像存储
- 如果团队或企业不希望依赖公共的 Docker Hub(例如出于安全或网络限制原因),可以部署自己的私有 Docker Registry。在私有网络环境中,开发人员可以通过内网推送和拉取镜像。
- 应用场景:企业内部有一个私有的 Registry,所有开发人员将自己构建的镜像推送到这个私有仓库中,确保镜像不公开外泄,同时提高镜像分发速度。
- CI/CD 集成
- 在自动化构建和持续集成/持续交付(CI/CD)过程中,构建的应用镜像需要被存储和管理。CI 工具通常会将构建的镜像推送到 Registry,以便随后在不同环境中进行部署。
- 应用场景:每次代码提交时,CI/CD 工具链自动构建一个新的应用镜像并将其推送到私有 Docker Registry,然后拉取这些镜像部署到测试或生产环境中。
2. Harbor 仓库
-
企业级容器镜像管理
- 在大型企业中,多个团队和项目共享同一套基础设施。Harbor 的多租户功能允许不同团队管理自己的项目,保证资源和权限的隔离。
- 应用场景:多个项目团队各自拥有自己的镜像库和权限管理,确保不同团队之间的数据隔离与安全管理。
-
镜像的安全性要求
- 对于对安全性要求较高的企业或机构,Harbor 提供镜像签名和安全扫描功能。通过集成 Clair 进行安全扫描,可以在部署前检测出镜像中的潜在漏洞,降低生产环境中使用不安全镜像的风险。
- 应用场景:一个金融企业在使用 Harbor 之前,要求所有镜像通过安全扫描,确保没有已知漏洞的镜像被部署到生产环境。
-
分布式镜像管理和同步
- 在全球拥有多个数据中心的企业,Harbor 支持镜像的跨实例复制功能。通过将镜像复制到多个地理位置,可以降低网络延迟并提高镜像的可用性。
- 应用场景:跨国公司在不同区域的 Harbor 实例之间复制镜像,确保不同地区的开发人员可以快速访问到镜像,而不需要跨地区拉取。
-
精细化权限控制
- 企业可以通过 LDAP 或 OIDC 集成 Harbor,实现基于用户角色的细粒度权限管理。例如,不同用户在不同的项目中具有不同的镜像读写权限。
- 应用场景:某个团队的开发人员可以推送镜像到 Harbor,但生产运维团队只能从 Harbor 中拉取镜像进行部署,确保开发和运维职责分离。
-
镜像合规性与审计
- Harbor 的日志和审计功能允许管理员对镜像的所有操作(如推送、拉取、删除等)进行记录和审计,确保镜像的合规性和可追溯性。
- 应用场景:一个医疗行业公司需要记录所有与镜像相关的操作,确保数据合规性,并满足外部监管要求。
简单来说,Docker Registry 适合个人开发、团队协作和小型私有化部署场景,主要关注镜像的基本存储和分发功能;Harbor 适合大型企业和安全性要求高的环境,提供增强的权限管理、安全扫描、多租户支持以及分布式同步等高级功能
六、Docker Registry 和 Harbor 仓库 的优势
Docker Registry 和 Harbor 仓库 都是用于存储和管理 Docker 容器镜像的工具,但它们各自有不同的优势,适用于不同规模和需求的项目。以下是两者的优势:
1. Docker Registry 的优势
-
轻量级和简单部署:
- Docker Registry 是一个轻量级的服务,部署和配置非常简单,适合小型团队或个人项目使用。只需要几行命令就可以启动私有的 Docker Registry 实例。
-
开源与灵活性:
- Docker Registry 是一个完全开源的工具,允许用户根据需求进行自定义。你可以轻松集成到现有的开发环境中,并与 CI/CD 工具无缝对接。
-
适合小型私有化部署:
- 对于只需要管理少量镜像的团队,Docker Registry 提供了一个高效且经济的解决方案,满足基本的镜像存储和分发需求。
-
与 Docker 生态系统紧密集成:
- Docker Registry 与 Docker 工具链无缝集成,支持 Docker 命令行工具(如
docker push
和docker pull
)的所有功能,使镜像的管理和使用非常便捷。
- Docker Registry 与 Docker 工具链无缝集成,支持 Docker 命令行工具(如
-
低资源占用:
- Docker Registry 占用系统资源较少,不需要复杂的设置或额外服务,适合资源有限的小型服务器或开发环境。
2. Harbor 仓库 的优势
-
企业级功能和安全性:
- Harbor 是一个企业级的 Docker Registry,提供了强大的安全特性,包括镜像签名(Notary 集成)和镜像漏洞扫描(Clair 集成)。这些功能确保企业级用户的镜像在交付前是安全的,并且经过了严格的验证。
-
多租户支持与细粒度权限控制:
- Harbor 支持多租户架构,通过项目(Project)隔离不同团队的资源,允许为每个项目设置精细化的权限管理(如只读、读写权限)。这使得大型企业可以在同一实例上支持多个团队,同时确保镜像的访问和操作受到严格控制。
-
镜像复制与分布式管理:
- Harbor 支持镜像的跨实例复制,可以将镜像复制到全球不同数据中心。这对于拥有全球团队或跨地域部署需求的企业非常有帮助,确保不同区域的用户可以快速访问镜像,并降低网络延迟。
-
用户友好的图形界面 (GUI):
- 相比 Docker Registry,Harbor 提供了一个直观的 Web 界面,管理员可以轻松管理镜像、查看镜像安全扫描结果、配置用户权限和查看操作日志。
-
LDAP/OIDC 集成:
- Harbor 支持企业内部身份验证系统的集成(如 LDAP、OIDC),使得用户管理和权限分配可以与现有的 IT 基础设施无缝对接,这对于大型企业尤为重要。
-
镜像日志和审计功能:
- Harbor 提供详细的日志记录和审计功能,可以记录每个镜像的操作历史,包括谁推送了镜像、谁下载了镜像等,确保整个镜像生命周期的透明度和可追溯性。
-
丰富的 API 支持:
- Harbor 提供丰富的 API,允许开发人员和管理员通过编程方式与 Harbor 交互,进行镜像管理、权限控制等操作,便于集成到企业的自动化工作流中。
3. 总结
特性 | Docker Registry | Harbor 仓库 |
---|---|---|
部署复杂度 | 简单、轻量级 | 较复杂,适合企业级场景 |
权限管理 | 基本的权限控制 | 细粒度的多租户权限管理 |
安全性 | 无内置安全扫描或签名 | 提供镜像签名、漏洞扫描等高级安全功能 |
全球镜像同步 | 无镜像同步功能 | 支持跨区域的镜像复制 |
图形界面 | 无 GUI,只能通过命令行操作 | 直观的 Web 界面,便于管理 |
扩展性 | 开源、轻量,适合小型项目 | 高度扩展性,适合企业级复杂场景 |
审计功能 | 无日志或操作审计 | 提供详细的日志和审计 |
身份认证集成 | 无与 LDAP/OIDC 的集成 | 支持与企业内部认证系统集成 |
如果想要有完整的观看体验,请点击这里
Comments NOTHING