Docker容器虚拟化技术全解析
1. Docker容器管理与内核利用
Docker容器管理借助内核功能,过去以控制组和命名空间为人所知。Libcontainer有望被导出到其他语言并支持相关应用,这样在Windows平台使用Docker时就无需像Boot2Docker这样的额外工具。
2. Docker分层文件系统
2.1 联合挂载系统
Docker在引入容器时采用联合挂载系统。这些系统并非安装在多个相同位置,而是在不同位置,因此目录内容可能由不同程序的文件和引用组成。在Docker中,应用可能代表父镜像。例如,一个Web应用可能依赖特定的Web服务器,而该服务器又仅依赖操作系统。也就是说,整个系统在原有层之上添加了一个只读的新层。当应用以容器形式启动时,会在顶部再添加一个可写层。当需要调整或替换只读层中的数据时,会将其复制到可写层再进行更改。而且,对上层所做的更改在容器停止后依然保留,下次启动时继续生效。
2.2 数据卷
数据卷是联合挂载系统的例外。它们提供了一种在容器间共享信息的方式,可直接对系统进行更改,且这些更改在更新所使用的镜像时不会受影响。用户可以创建空白数据卷,也可以挂载目录或主机。这些数据卷可以添加到特定容器,也可以创建专门的数据卷容器。创建的数据卷容器不仅可分配给其他容器,还能增强Docker的迁移、检索和备份等功能。
3. Docker安全问题
3.1 根权限要求
目前使用Docker需要根权限,若违规操作,管理员或主机将面临风险,如Docker守护进程就存在这样的安全威胁。因此,Docker的目标之一是让非根用户也能使用容器。Docker正在将结构改为多个守护进程,新的守护进程将在用户空间创建,而特权功能将转移到内核空间的新服务中。
3.2 镜像签名
2014年12月,Docker引入了镜像签名功能。用户一直期望镜像包含加密签名,以便在处理前进行验证。但详细检查发现,Docker声称对下载镜像的验证仅依赖已签名的清单,却从未确认清单中镜像的校验和。攻击者可能会在已签名的清单旁伪造镜像。此外,还存在一些其他问题,如用于保护镜像的加密材料创建不佳、捕获镜像后处理清单的问题,或者当清单不正确时仅发出警告信息而仍认为镜像有效等。
3.3 Linux用户名空间安全
基于容器的可见性还存在Linux用户名使用的安全问题。用户命名空间中存在未在生产环境充分测试的漏洞。例如,当前发现的一个风险是,该过程可能导致系统入侵,而用户却无法访问此类入侵。这可能通过在用户命名空间中添加额外组来实现,可通过调用预设组来访问,而这可能在引导映射可用之前就已发生(因此在命名空间中只有根权限)。后续几个月还记录了许多其他弱点。2014年12月修复安全问题时,有内核工程师警告称,虽然在用户名空间内看似拥有正确权限,但系统中仍可能隐藏着意外风险,在确保用户空间的不合理构建是安全的之前,仍有发生问题的可能性。
4. Docker性能表现
2014年1月,IBM进行了详细的Docker性能测试。测试将Docker与隐藏内存访问的可视化设备进行比较,包括I/O阻塞、连接和测量MySQL及Redis实例。鉴于两种简化技术的差异,结果在意料之中:“容器和虚拟机在过去十年的硬件和软件开发中都取得了技术进步。通过标准比较,在所有测试案例中,Docker的性能与KVM相当或更优。结果证明,除极端情况外,Docker和KVM都展现出高性能的CPU和内存表现。”当数据收集在共享卷而非联合系统中时,开销增长缓慢。
5. 与Docker相关的未来技术
5.1 Kubernetes
Google是最大的数据中心提供商之一,其所有服务都在Linux容器中运行。不过,他们未分享内部工作方案Omega,而是聘请了企业容器管理器Kubernetes作为开源项目。目前,容器在Docker中运行,即使有rkt的支持(后续会介绍)。
Kubernetes引入了Pod的概念,即紧密打包的容器组,是可使用的最小单元。典型用例是一个关键工具使用Web应用,并搭配多个不同的辅助服务容器。这些不同的容器可以同时启动和停止,并在同一主机上工作。Pod通常会附带标签(键值对),以便查询运行特定Pod组的集群节点。
此外,Kubernetes还推出了服务的概念,即通过标签创建的不同端口组,它们产生相同的端口并执行相同的程序。Pod可能在一个节点上停止工作,并在其他节点上复制,因此使用服务时,一些Pod无需识别哪个Pod在哪个节点上执行,只需使用可见的服务IP地址即可。为支持扩展,Kubernetes引入了副本控制器。副本控制器使用模板根据Pod的结构进行配置,还允许设置要运行的Pod副本数量,这有助于增加或减少活跃应用的数量。另一个用例是应用更新,当在旧版本和新版本中分别使用一个副本控制器时,可以实现持续的零停机更新。
5.2 Mesos
Apache Mesos于2013年发布,它整合了集群中的资源,将其视为一台大型计算机。其设计定义了框架的概念,即为Mesos编写的应用包含一个管理应用功能的调度程序。Kubernetes可作为其中一个框架,用于执行Pod任务。集群、框架和Mesos之间的循环如下:
1. Mesos从节点守护进程在集群的所有节点上运行。
2. 使用主守护进程控制不同的从节点。
3. 从节点将节点上的现有资源提供给主节点。
4. 主节点选择一个框架,并分配一部分现有资源和节点标识符,这是一个策略文档,用于确定框架使用哪些不稳定资源。
5. 框架编辑器确定要在节点上执行的功能,并指定资源分配。
6. 主节点向所选节点的框架提供者请求所需资源。
Mesos在使用大型集群的公司中迅速获得了声誉,如Airbnb、Vimeo、Netflix、PayPal和Twitter等公司都在使用。苹果公司宣布其iOS上的Siri背后也使用了Mesos。基于Mesos构建的Mesosphere数据库专注于增长、容错和自我修复,预计在2015年发布。
5.3 CoreOS
CoreOS是基于Google Chrome操作系统的操作系统。自2013年秋季首次发布以来,它致力于成为以容器为中心的操作系统。这意味着CoreOS没有包管理器,应用以容器形式提供。目前,Docker被用作容器管理器。CoreOS试图针对云基础设施,借助两个重要资源:fleet和etcd。etcd是一个集成管理集合,提供API用于跨多个etcd实例集成更改。此外,还有一个守护进程用于控制集群级别,它允许将容器分发到全球(集群中的所有设备)或单个支持故障转移的机器。
5.4 Snappy Ubuntu Core和LXD
Canonicals的Snappy项目旨在使用安装在容器中的应用。该项目试图提供使用基于容器应用所需的最小应用程序,尽管安装的应用很少。它支持多容器提供商(包括Docker),称为框架。更新以事务方式进行,因此总是可以撤销不成功或不需要的更新。Snappy会保留所有不同软件包的基本版本,更新仅发送与过去版本的差异部分。Ubuntu还创建了Linux Contained Daemon(LXD),旨在“获得Docker的所有技能和速度,并将其转变为完整的可视化体验”。LXD应该是LXC的增强版本,提供REST API,尤其支持容器的实时迁移和重新容器化。
5.5 Project Atomic
Project Atomic(PA)是一组为交付安装系统提供解决方案的材料。其主要成果是Project Atomic Organizations(PAOs),即轻量级应用。这些应用依赖于Fedora、Red Hat Enterprise Linux或CentOS。其特性主要包括Kubernetes、Docker、SE Linux、Project Cockpit和rpm - ostree。为了便于检索,会保留旧版本,因为它通过在新构建的系统根上安装升级版本来工作。该系统还通过保持旧版本稳定来与新版本区分。Project Cockpit(PC)是一个远程Linux服务器管理器,包含基于Web的GUI。其主要优点是能为服务器状态提供清晰的视图,这对新系统管理员非常有用。预计PC也将随Fedora Server 21一起发布。
5.6 rkt
2014年12月,CoreOS团队对Docker项目的发展方向表示担忧,并发布了一篇博客文章引起关注。他们对Docker范围的扩大表示异议,认为“2013年初Docker首次发布时,标准化容器的概念形成并很快具有吸引力,即作为一个可在多种系统中使用的可组合单元。Docker仓库曾包含容器标准的声明,但后来该声明被移除。应该停止关于Docker容器的讨论,转而讨论Docker平台。标准化可组合构建块的设想并未实现”。这种批评可能针对2015年发布的Docker Machine、Docker Swarm和Docker Compose这三个项目。他们还声称,Docker的架构模型,即所有操作都通过中央守护进程执行,从安全角度来看“存在根本缺陷”。
此外,该博客还宣布了Rocket,这是一个新的容器运行时,是Docker的直接竞争对手。CoreOS的愿景是围绕容器规范和“应用容器执行器”展开,并鼓励开发者提供反馈。后来,它更名为rkt(“rockit”)。rkt目前正在大力开发中,文档和示例较少,但已经可以运行原生Docker镜像。该团队还表示,Docker有可能实现他们的应用容器规范,使两个项目能够互操作。同时也提到CentOS将继续提供Docker。
以下是这些技术的对比表格:
| 技术名称 | 特点 | 应用场景 |
| — | — | — |
| Kubernetes | 引入Pod、服务和副本控制器概念,支持容器编排和扩展 | 大规模容器集群管理、应用更新零停机 |
| Mesos | 整合集群资源,定义框架概念 | 大型集群资源管理 |
| CoreOS | 以容器为中心的操作系统,借助fleet和etcd | 云基础设施管理 |
| Snappy Ubuntu Core和LXD | 支持多容器提供商,更新可撤销,LXD功能增强 | 容器化应用部署和管理 |
| Project Atomic | 提供轻量级应用解决方案,保留旧版本 | 交付安装系统 |
| rkt | 新的容器运行时,与Docker竞争且可能互操作 | 替代Docker运行容器 |
下面是Mesos工作流程的mermaid流程图:
graph LR
A[Mesos从节点守护进程] --> B[主守护进程]
B --> C[选择框架并分配资源]
C --> D[框架编辑器确定功能和资源分配]
D --> E[主节点请求资源]
E --> F[节点执行任务]
F --> A
6. Docker编排工具和 API
6.1 Docker 编排工具
6.1.1 Docker Swarm
Docker Swarm 也被称为 Docker 集群工具,它可以将多个 Docker 引擎整合为一个实例。将单个机器添加到集群的最动态解决方案是生成一个集群 ID,然后将其发送到 Swarm 以加入每个节点的命令。Swarm 创建完成后,使用
swarm manage
命令启动 Swarm 管理器,之后所有的 Docker 命令都可以针对整个集群执行。使用 Docker Swarm 时,可以向
docker run
命令传递额外的参数,这些参数可以作为过滤器,根据名称、可用端口、操作系统等条件排除特定节点的选择。
6.1.2 Docker Machine
Docker Machine 不仅可在 Linux 上使用,也支持 Windows 系统。它是经典虚拟化和基于容器的虚拟化共存的一个示例。其基本思想是创建一个专用的虚拟机,主要功能是运行 Docker 守护进程,同时还可以与 Docker Swarm 一起创建集群。它可以执行创建、停止、重启等基本命令,还能将 Docker 守护进程升级到虚拟机中。Docker Machine 可以与 VirtualBox 创建的本地虚拟机或 Microsoft Azure 等云解决方案配合使用。
6.1.3 Docker Compose
在大多数情况下,复杂软件由多个组件组成,如数据库或 Web 服务器。手动安装每个组件是一项重复且容易出错的任务。于是,一个名为
fig
的项目应运而生,后来该项目被弃用,取而代之的是 Docker Compose。其核心思想是能够链接多个容器,从而使用多个镜像组合成一个复杂的应用程序。它使用 YAML 配置文件,可以指定暴露端口、挂载数据卷和传递环境变量等设置。Docker Compose 与 Docker Swarm 配合使用效果良好,链接的容器可以共享同一主机。
6.2 Docker API
Docker 平台使用三个独立的 API 来允许与第三方应用程序进行交互:
-
Docker Hub API
:通过 HTTP 工作,遵循 REST 风格,为用户提供注册、更新、登录以及创建和删除存储库等服务。
-
Docker Registry API
:负责处理镜像的上传和下载,并提供搜索功能。
-
Docker Remote API
:用于与容器建立远程连接。
以下是 Docker 编排工具和 API 的功能对比表格:
| 工具/API 名称 | 主要功能 | 特点 |
| — | — | — |
| Docker Swarm | 集群管理,将多个 Docker 引擎整合为一个实例 | 支持节点过滤,方便资源分配 |
| Docker Machine | 创建专用虚拟机运行 Docker 守护进程,可与 Swarm 配合创建集群 | 跨平台支持,可与多种虚拟化和云解决方案配合 |
| Docker Compose | 链接多个容器,使用 YAML 配置组合复杂应用 | 简化复杂应用部署,与 Swarm 配合良好 |
| Docker Hub API | 提供用户注册、更新、存储库管理等服务 | 遵循 REST 风格,方便第三方集成 |
| Docker Registry API | 处理镜像上传、下载和搜索 | 支持镜像的基本操作 |
| Docker Remote API | 建立与容器的远程连接 | 实现远程控制容器 |
7. 在 Linux 上安装 Docker
在 Ubuntu 16.04 上安装 Docker Engine 是一个不错的选择,因为该版本提供 5 年的长期支持,稳定性较高。用户需要具备
sudo
权限,以便以超级用户(root)身份执行命令,同时需要稳定的网络连接。以下是具体的安装步骤:
1.
更新系统软件包
:
sudo apt-get update && sudo apt-get upgrade
- 确保安装必要的软件包 :
sudo apt-get install apt-transport-https ca-certificates
- 添加 GNU 隐私保护密钥 :
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
- 添加 Docker APT 存储库 :
echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
- 更新本地 APT 包索引 :
sudo apt-get update
- 安装 Docker 所需的包 :
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
- 安装 Docker Engine :
sudo apt-get install docker-engine
下面是安装 Docker 的 mermaid 流程图:
graph LR
A[更新系统软件包] --> B[安装必要软件包]
B --> C[添加密钥]
C --> D[添加存储库]
D --> E[更新包索引]
E --> F[安装所需包]
F --> G[安装 Docker Engine]
8. Docker 使用案例:WordPress
这个使用案例展示了如何使用 Docker 和 WordPress 容器镜像以及支持的 MySQL 数据库来搭建一个 WordPress 应用。在非 Docker 环境中搭建完整的 WordPress LAMP(Linux + Apache + MySQL + PHP)堆栈,需要完成以下操作:
1.
安装和配置 Apache
:
- 安装 Apache 服务器:
sudo apt-get install apache2
- 配置 Apache 服务器,例如修改配置文件 `/etc/apache2/apache2.conf` 等。
-
安装和配置 MySQL
:
- 安装 MySQL 服务器:
sudo apt-get install mysql-server
- 配置 MySQL 服务器,如设置 root 密码、创建数据库等:
sudo mysql_secure_installation
mysql -u root -p
CREATE DATABASE wordpress;
而使用 Docker 可以更方便地完成这些操作,以下是基本步骤:
1.
拉取 WordPress 和 MySQL 镜像
:
docker pull wordpress
docker pull mysql
- 创建 MySQL 容器 :
docker run -d --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -e MYSQL_DATABASE=wordpress mysql
- 创建 WordPress 容器并链接到 MySQL 容器 :
docker run -d --name wordpress-container --link mysql-container:mysql -p 80:80 wordpress
以下是非 Docker 环境和 Docker 环境搭建 WordPress 的步骤对比列表:
| 环境类型 | 步骤 |
| — | — |
| 非 Docker 环境 | 1. 安装和配置 Apache
2. 安装和配置 MySQL |
| Docker 环境 | 1. 拉取 WordPress 和 MySQL 镜像
2. 创建 MySQL 容器
3. 创建 WordPress 容器并链接到 MySQL 容器 |
通过以上内容,我们对 Docker 容器虚拟化、相关未来技术、编排工具、API、安装方法以及实际使用案例有了较为全面的了解。Docker 作为一种强大的容器化技术,在软件开发、部署和管理等方面都有着广泛的应用前景。
超级会员免费看
2884

被折叠的 条评论
为什么被折叠?



