认识 Docker 容器技术与镜像仓库

认识 Docker 容器技术和镜像仓库

一、Docker 技术简介

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目 已经超过 5 万 7 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 DockerDocker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 版本开始,则进一步演进为使用 runCcontainerd

Docker 架构

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

  1. 更高效的利用系统资源

    ​ 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

  2. 更快速的启动时间

    ​ 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

  3. 一致的运行环境

    ​ 开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

  4. 持续交付和部署

    ​ 对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

    ​ 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

    ​ 而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

  5. 更轻松的迁移

    ​ 由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

  6. 更轻松的维护和扩展

    Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

  7. 对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 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 分这么几种:

  1. Docker Registry 公开服务
    Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
    最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的 官方镜像。除此以外,还有 Red Hat 的 Quay.io;Google 的 Google Container RegistryKubernetes 的镜像使用的就是这个服务;代码托管平台 GitHub 推出的 ghcr.io
    由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为 加速器。常见的有 阿里云加速器DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 安装 Docker 一节中有详细的配置方法。
    国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 网易云镜像服务DaoCloud 镜像市场阿里云镜像库 等。

  2. 私有 Docker Registry

    ​ 除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。

    ​ 开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

    ​ 除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,HarborSonatype Nexus

2. Harbor 仓库

Harbor 是一个企业级的 Docker Registry 项目,旨在增强和扩展开源 Docker Registry 的功能。它最初由 VMware 开发,目前已经成为 CNCF(Cloud Native Computing Foundation)的一个开源项目。

Harbor 提供了以下功能,使其在企业环境中非常有吸引力:

  1. 身份验证和访问控制:Harbor 支持集成 LDAP、OIDC 等身份验证方式,并可以设置细粒度的权限控制。
  2. 镜像复制:Harbor 支持在不同的 Harbor 实例之间复制镜像,这对于全球分布的团队非常有用。
  3. 镜像签名和安全扫描:Harbor 集成了 Clair 和 Notary,用于镜像的安全扫描和签名,确保镜像的安全性和完整性。
  4. 多租户支持:Harbor 通过项目(Projects)来支持多租户,每个项目可以管理独立的镜像库和用户权限。
  5. **图形用户界面 (GUI)**:相比于基础的 Docker Registry,Harbor 提供了更友好的 Web 界面,方便用户管理和查看镜像。

​ 可以理解为 Harbor 仓库是一个更高级的 Docker Registry,提供了增强的安全性、管理性和可用性功能,适合在企业级环境中使用。

五、Docker Registry 和 Harbor 仓库 的应用场景

1. Docker Registry

  1. 小型开发团队或个人项目
    • 对于个人开发者或小型团队,Docker Hub(公共 Registry)是一个方便的选择。团队可以通过它推送、拉取镜像,用于开发、测试和部署。
    • 应用场景:一个开发者在本地构建了一个新的应用镜像,可以将其推送到 Docker Hub,以便在另一台机器上轻松拉取并部署。
  2. 本地私有镜像存储
    • 如果团队或企业不希望依赖公共的 Docker Hub(例如出于安全或网络限制原因),可以部署自己的私有 Docker Registry。在私有网络环境中,开发人员可以通过内网推送和拉取镜像。
    • 应用场景:企业内部有一个私有的 Registry,所有开发人员将自己构建的镜像推送到这个私有仓库中,确保镜像不公开外泄,同时提高镜像分发速度。
  3. CI/CD 集成
    • 在自动化构建和持续集成/持续交付(CI/CD)过程中,构建的应用镜像需要被存储和管理。CI 工具通常会将构建的镜像推送到 Registry,以便随后在不同环境中进行部署。
    • 应用场景:每次代码提交时,CI/CD 工具链自动构建一个新的应用镜像并将其推送到私有 Docker Registry,然后拉取这些镜像部署到测试或生产环境中。

2. Harbor 仓库

  1. 企业级容器镜像管理

    • 在大型企业中,多个团队和项目共享同一套基础设施。Harbor 的多租户功能允许不同团队管理自己的项目,保证资源和权限的隔离。
    • 应用场景:多个项目团队各自拥有自己的镜像库和权限管理,确保不同团队之间的数据隔离与安全管理。
  2. 镜像的安全性要求

    • 对于对安全性要求较高的企业或机构,Harbor 提供镜像签名和安全扫描功能。通过集成 Clair 进行安全扫描,可以在部署前检测出镜像中的潜在漏洞,降低生产环境中使用不安全镜像的风险。
    • 应用场景:一个金融企业在使用 Harbor 之前,要求所有镜像通过安全扫描,确保没有已知漏洞的镜像被部署到生产环境。
  3. 分布式镜像管理和同步

    • 在全球拥有多个数据中心的企业,Harbor 支持镜像的跨实例复制功能。通过将镜像复制到多个地理位置,可以降低网络延迟并提高镜像的可用性。
    • 应用场景:跨国公司在不同区域的 Harbor 实例之间复制镜像,确保不同地区的开发人员可以快速访问到镜像,而不需要跨地区拉取。
  4. 精细化权限控制

    • 企业可以通过 LDAP 或 OIDC 集成 Harbor,实现基于用户角色的细粒度权限管理。例如,不同用户在不同的项目中具有不同的镜像读写权限。
    • 应用场景:某个团队的开发人员可以推送镜像到 Harbor,但生产运维团队只能从 Harbor 中拉取镜像进行部署,确保开发和运维职责分离。
  5. 镜像合规性与审计

    • Harbor 的日志和审计功能允许管理员对镜像的所有操作(如推送、拉取、删除等)进行记录和审计,确保镜像的合规性和可追溯性。
    • 应用场景:一个医疗行业公司需要记录所有与镜像相关的操作,确保数据合规性,并满足外部监管要求。

​ 简单来说,Docker Registry 适合个人开发、团队协作和小型私有化部署场景,主要关注镜像的基本存储和分发功能;Harbor 适合大型企业和安全性要求高的环境,提供增强的权限管理、安全扫描、多租户支持以及分布式同步等高级功能

六、Docker Registry 和 Harbor 仓库 的优势

Docker RegistryHarbor 仓库 都是用于存储和管理 Docker 容器镜像的工具,但它们各自有不同的优势,适用于不同规模和需求的项目。以下是两者的优势:

1. Docker Registry 的优势

  1. 轻量级和简单部署

    • Docker Registry 是一个轻量级的服务,部署和配置非常简单,适合小型团队或个人项目使用。只需要几行命令就可以启动私有的 Docker Registry 实例。
  2. 开源与灵活性

    • Docker Registry 是一个完全开源的工具,允许用户根据需求进行自定义。你可以轻松集成到现有的开发环境中,并与 CI/CD 工具无缝对接。
  3. 适合小型私有化部署

    • 对于只需要管理少量镜像的团队,Docker Registry 提供了一个高效且经济的解决方案,满足基本的镜像存储和分发需求。
  4. 与 Docker 生态系统紧密集成

    • Docker Registry 与 Docker 工具链无缝集成,支持 Docker 命令行工具(如 docker pushdocker pull)的所有功能,使镜像的管理和使用非常便捷。
  5. 低资源占用

    • Docker Registry 占用系统资源较少,不需要复杂的设置或额外服务,适合资源有限的小型服务器或开发环境。

2. Harbor 仓库 的优势

  1. 企业级功能和安全性

    • Harbor 是一个企业级的 Docker Registry,提供了强大的安全特性,包括镜像签名(Notary 集成)和镜像漏洞扫描(Clair 集成)。这些功能确保企业级用户的镜像在交付前是安全的,并且经过了严格的验证。
  2. 多租户支持与细粒度权限控制

    • Harbor 支持多租户架构,通过项目(Project)隔离不同团队的资源,允许为每个项目设置精细化的权限管理(如只读、读写权限)。这使得大型企业可以在同一实例上支持多个团队,同时确保镜像的访问和操作受到严格控制。
  3. 镜像复制与分布式管理

    • Harbor 支持镜像的跨实例复制,可以将镜像复制到全球不同数据中心。这对于拥有全球团队或跨地域部署需求的企业非常有帮助,确保不同区域的用户可以快速访问镜像,并降低网络延迟。
  4. **用户友好的图形界面 (GUI)**:

    • 相比 Docker Registry,Harbor 提供了一个直观的 Web 界面,管理员可以轻松管理镜像、查看镜像安全扫描结果、配置用户权限和查看操作日志。
  5. LDAP/OIDC 集成

    • Harbor 支持企业内部身份验证系统的集成(如 LDAP、OIDC),使得用户管理和权限分配可以与现有的 IT 基础设施无缝对接,这对于大型企业尤为重要。
  6. 镜像日志和审计功能

    • Harbor 提供详细的日志记录和审计功能,可以记录每个镜像的操作历史,包括谁推送了镜像、谁下载了镜像等,确保整个镜像生命周期的透明度和可追溯性。
  7. 丰富的 API 支持

    • Harbor 提供丰富的 API,允许开发人员和管理员通过编程方式与 Harbor 交互,进行镜像管理、权限控制等操作,便于集成到企业的自动化工作流中。

3. 总结

特性 Docker Registry Harbor 仓库
部署复杂度 简单、轻量级 较复杂,适合企业级场景
权限管理 基本的权限控制 细粒度的多租户权限管理
安全性 无内置安全扫描或签名 提供镜像签名、漏洞扫描等高级安全功能
全球镜像同步 无镜像同步功能 支持跨区域的镜像复制
图形界面 无 GUI,只能通过命令行操作 直观的 Web 界面,便于管理
扩展性 开源、轻量,适合小型项目 高度扩展性,适合企业级复杂场景
审计功能 无日志或操作审计 提供详细的日志和审计
身份认证集成 无与 LDAP/OIDC 的集成 支持与企业内部认证系统集成

认识 Docker 容器技术与镜像仓库
https://moka.anitsuri.top/2024/09/04/Docker_Basic_Introduction/
作者
アニつり
发布于
2024年9月4日
许可协议