Docker是一个用于开发、发布和运行应用程序的开源应用容器引擎[5]。可以帮助开发人员在不同的环境中快速、简单、可移植地进行应用程序开发[1]。Docker最初由Docker公司开发,并于2013年发布[4]。Docker是一个构建在LXC(Linux Containers)之上的,基于进程容器(Process container)的轻量级虚拟容器解决方案[6]。Docker使开发者可以打包其应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows机器上[7]。与传统的虚拟机相比,Docker具有轻量、高性能、更快的启动速度、更少的资源占用和更好的移植性等优点[8]。
起源阶段(2008-2013年)
2008年,由Solomon Hykes、Kamel Founadi和Sebastien Pahl在巴黎创立了一家名为DotCloud的初创公司,该公司旨在为软件开发人员提供云托管服务。在接下来的几年里,Hykes领导了基于容器的工具的开发,以帮助DotCloud加速和扩展其运营[9]。
2013 年,Hykes推出了工具Docker,并将其作为开源软件发布,供任何人下载、使用和修改[9]。
2014年,Docker公司发布了Docker 1.0版本,引入了镜像和容器的概念,并提供了一套完整的命令行工具和API[10]。同年3月,Amazon宣布在其Elastic Beanstalk产品中添加Docker支持[11]。同年6月,Google开源了一个容器节点管理器,该管理器根据YAML清单管理一组Docker容器[12]。同年8月,Red Hat发布了Project Atomic,这是一个用于运行Docker容器的原型系统[13]。
发展阶段(2014-2016年)
2015年,Docker引入了Docker Compose和Docker Swarm[14]。Docker Compose用于定义和管理多容器应用程序[15],而Docker Swarm则是Docker的集群管理和编排工具[16]。同年Docker公司宣布成立了一个新的非营利性组织Docker开放容器倡议(OCI),旨在推广Docker的开放标准化和互操作性。OCI不仅包括Docker公司,还包括Red Hat、Google、IBM等多个知名公司[17]。
2016年,Docker推出了Docker for Mac[18]和Docker for Windows[19],为开发人员提供了在本地环境中运行和测试Docker容器的工具。同年9月,微软在亚特兰大举行的Ignite大会上宣布全面推出Windows Server 2016,Windows 2016推出了容器功能,并且Windows Server 2016上的容器由 Docker 提供支持[20]。
商业化阶段(2017-至今)
2017年,Docker公司推出了Docker Enterprise Edition(Docker EE)[21],为企业级用户提供了更为稳定和可靠的容器服务[18]。同年10月,在DockerCon EU 2017上,Docker宣布Docker引擎工具将对Kubernetes提供支持[21]。
2020年,Docker发布了Docker CLI改进版,引入了实验性功能和命令,提供更强大和灵活的命令行界面[22]。
2021年,Docker公司宣布了新的产品订阅策略[23],将产品订阅分为四级,分别为个人免费(Personal)、专业付费版(Pro)、团队付费版(Team)和企业付费版(Business)[24]。对于拥有超过 250 名员工或年收入超过 1000 万美元的公司,必须使用付费订阅模式[24]。
架构
Docker使用客户端-服务器架构,Docker客户端与Docker守护进程进行通信以完成Docker的功能。客户端用于发送操作指令,守护进程负责处理构建、运行和分发Docker容器的任务。Docker客户端和守护进程可以在同一系统上运行,也可以通过网络连接到远程的Docker守护进程。客户端和守护进程之间使用REST API通过UNIX套接字或网络接口进行通信。另外,Docker还提供了Docker Compose作为另一个客户端工具,它可以处理由一组容器组成的应用程序[25]。Docker架构图如下图所示。

Docker守护进程 (Docker Daemon)
Docker守护进程也称为Docker引擎,是运行在主机上的后台服务。它负责管理Docker对象(镜像、容器、网络等),接收来自Docker客户端的命令,并执行相应的操作[26]。
在Docker守护进程中还存在着Docker镜像(Docker Image)、Docker容器(Docker Container)、Docker注册表(Docker Registry)、数据卷(Volume)等重要组件[26]。
Docker镜像(Docker Image)
Docker镜像是一个轻量级的、可移植的打包格式,它包含了运行应用程序所需的所有文件和配置。Docker镜像可以通过Dockerfile定义,也可以从Docker Hub等镜像仓库中获取[26]。
Docker容器(Docker Container)
Docker容器是由Docker镜像启动的运行实例,它包含了应用程序和运行时所需的所有依赖项。Docker容器是轻量级、可随时启动和停止的,同时也具有良好的隔离性和可移植性[26]。
Docker注册表(Docker Registry)
Docker注册表用于存储Docker镜像的仓库。默认情况下,Docker官方提供了一个公共注册表(Docker Hub),开发者可以从中获取常用的镜像。此外,也可以搭建私有的Docker注册表来存储和共享自己的镜像[26]。
数据卷(Volume)
数据卷是解决容器持久化数据的问题的一种机制。在容器中,当删除容器时,容器内部产生的需要持久化的数据也会被删除,这会导致数据的丢失。为了解决这个问题,可以使用数据卷将数据持久化到宿主机上,实现容器与宿主机之间的数据共享。数据卷允许将宿主机上的目录或文件与容器中的目录进行映射,容器中的应用程序在容器的目录中读写数据时,对应的操作便会同步到宿主机上的目录中,从而实现数据的持久化。例如,对于数据库容器,可以将数据存储到宿主机上的实际磁盘中,以确保数据的持久性[26]。
Docker客户端(Docker Client)
Docker客户端是用于与Docker引擎进行交互的工具,它通过Docker API与Docker引擎进行通信。Docker客户端可以在本地或远程主机上运行,可以通过命令行界面或者Docker API来操作Docker引擎。一个Docker客户端可以与多个Docker引擎通信[26]。
Linux下的核心实现原理
Docker利用Linux内核的命名空间(Namespaces),控制组(Control Groups)和层功能(Layer Capabilities)实现容器技术[27]。
命名空间允许Docker在容器中隔离每个容器的进程ID和网络等资源[27]。控制组允许Docker限制容器的CPU和内存等计算资源[27]。层功能允许Docker在容器中构建一个轻量级的镜像系统,由多个层组合而成[27]。容器运行时环境负责管理每个容器的生命周期,可以根据镜像系统创建和启动容器,停止和删除容器[27]。
Windows下的核心实现原理
在Windows下,Docker利用Hyper-V虚拟化技术作为容器运行时的后端,并结合Windows容器技术来实现容器的隔离和高效运行。同时,通过引入Compute Services提供的容器的管理功能对容器进行管理[28]。
Hyper-V虚拟化技术在Windows中起到重要作用。它允许在主机上创建和管理虚拟机,每个虚拟机可以运行独立的操作系统和应用程序。在Windows下,Docker利用Hyper-V作为容器运行时的后端。这意味着Docker容器实际上是在Hyper-V虚拟机中运行的,每个容器在自己的虚拟机中具有独立的操作系统和文件系统,从而实现了隔离性和安全性[29]。Windows引入了Windows容器技术(Windows Server Container)[30],它是一种轻量级的虚拟化形式。Windows容器允许多个容器共享同一个操作系统内核,但在用户空间提供隔离。这种轻量级虚拟化技术使得容器的启动和运行更加高效和快速。Windows容器可以提供与主机相同的API和文件系统视图,使得容器化应用程序能够在Windows环境中无缝运行。Compute Services是Windows提供的一个组件,用于管理容器的生命周期。它抽象了Windows操作系统提供的底层功能,如命名空间、控制组和容器运行时等。Compute Services提供了公共接口,用于管理容器的创建、启动、停止和删除等操作。它与Docker引擎和其他容器管理组件进行通信,提供容器管理的功能[31]。
生态系统
Docker是一个强大的容器化平台,它不仅仅是一个容器技术,而是一个生态系统,包括许多相关工具和服务,使得Docker容器更加易于使用和扩展。以下是Docker生态系统的一些主要组件和工具。
Docker Hub
Docker Hub是Docker官方的镜像仓库,是世界上最大的容器镜像存储库,开发人员可以从中获取所需的镜像。Docker Hub还提供了自动构建服务和私有仓库等功能[32]。
Docker Compose
Docker Compose是一个部署工具,可以通过一个单独的配置文件来定义和运行多个Docker容器。使用Docker Compose可以快速地构建和启动复杂的多容器应用程序,例如Web应用程序和数据库应用程序等[15]。
Docker Swarm
Docker Swarm是Docker的官方集群管理工具,它可以将多个Docker主机组成一个集群,以实现容器的高可用性和负载均衡。Docker Swarm还提供了内置的服务发现和容器编排功能,可以方便地管理和扩展容器应用程序[16]。
Docker Machine
Docker Machine是一个管理工具,通过它可以在本地或云平台上快速地创建和管理Docker主机。使用Docker Machine可以简化部署和管理Docker容器集群的过程,同时也可以方便地在开发和测试环境中使用Docker[33]。
简化开发生命周期
快速、一致地交付应用程序:使用Docker容器,开发人员可以在标准化环境中工作,快速交付应用程序。容器提供了一个隔离的运行环境,确保应用程序在不同的开发环境中具有一致的行为。这简化了开发过程,并使得持续集成和持续交付(CI/CD)工作流程更加流畅[25]。
简化开发和测试过程:开发人员可以在本地编写代码,并使用Docker容器与团队成员共享他们的工作。使用Docker,他们可以轻松地将应用程序推送到测试环境中进行自动化和手动测试。当发现问题时,开发人员可以在开发环境中修复bug,并重新部署到测试环境进行验证[25]。
简化生产环境部署:一旦测试完成并通过验证,使用Docker将更新后的镜像推送到生产环境变得非常简单。这使得修复问题和部署更新变得快速和可靠,减少了生产环境中的停机时间[25]。
响应式部署和扩展
Docker基于容器的平台具有高度可移植性,可以在各种环境中运行,如开发人员的本地机器、数据中心、云服务商等。这使得动态管理工作负载变得容易,可以根据业务需求实时扩展或拆除应用程序和服务[25]。
在相同硬件上运行更多工作负载
Docker的轻量和高效性使得在相同的硬件上能够运行更多的工作负载成为可能。相比于传统的基于管理程序的虚拟机,Docker提供了更经济高效的解决方案,能够在同样的服务器容量下实现更多的业务目标,适用于高密度环境和中小型部署[25]。
安全性问题
容器技术在容器安全方面存在一些重要问题。容器安全首次被列入高德纳(Gartner)年度十大安全项目,进一步确认了其在安全研究和应用方面的广泛性。尤其在微服务架构和DevOps开发模式的流行下,越来越多的开发人员采用了容器技术。然而,容器技术作为一种新型技术革命,不仅仅面临传统主机安全问题,还带来了新的安全威胁[34],Docker的安全性问题主要在以下几个方面。
逃逸安全风险
Docker容器的逃逸安全风险包括危险配置、隔离不完善和内核漏洞等。危险配置可能使攻击者获得逃逸的机会,隔离不完善可能导致关键信息泄露,而内核漏洞可能使攻击者逃离容器并访问宿主机[34]。
镜像安全风险
镜像是Docker容器的静态表示形式,其安全性影响着容器的运行时安全。镜像脚本安全威胁可能导致容器中的漏洞或恶意利用,而镜像漏洞安全威胁涉及镜像中软件的CVE漏洞和恶意上传的镜像[34]。
网络安全风险
Docker容器的网络默认采用桥接方式连接,但容器之间的通信未进行过滤,容易受到ARP欺骗和MAC泛洪攻击。恶意使用容器中的内核资源也可能影响其他容器的正常运行[34]。
应用场景
Docker可以用来构建和管理开发环境,确保开发环境的一致性和可移植性。开发人员可以使用Docker容器在他们的本地环境中运行应用程序,而不会影响其他应用程序或主机[25]。
Docker可以用来构建和管理测试环境,确保测试环境的一致性和可移植性。测试人员可以使用Docker容器在不同的环境中测试应用程序,而不需要进行任何修改[25]。
Docker可以用来支持持续集成和持续部署流程。开发人员可以使用Docker容器来构建和打包应用程序[25],而DevOps团队可以使用Docker容器来部署应用程序到各种不同的环境中[35]。
Docker可以用来支持微服务架构,将应用程序拆分为多个小型服务,每个服务运行在一个独立的Docker容器中。这可以使应用程序更容易管理和扩展,同时也可以提高可用性和可靠性[36]。
Docker可以用来支持多租户应用程序,每个租户可以运行在一个独立的Docker容器中。这可以使应用程序更易于管理和隔离,同时也可以提高安全性和可靠性[37]。
应用实例
AWS Amazon ECR和Amazon ECR Public:AWS客户可以使用高可用性和高性能的容器构件注册表,与他们的容器应用程序一起使用。通过使用Docker官方镜像和Amazon ECR Public,AWS客户可以获得高可用性和快速下载的优势[38]。

Datadog:Datadog超过一半的应用程序在容器化基础设施上运行,并且Docker Hub是容器镜像的主要来源。Datadog被认可为Docker认证发布者,他们提供安全可靠的容器镜像,用于监控基础设施和应用程序的性能[38]。

VMware:VMware加入了Docker Verified Publisher计划,使开发人员能够通过容器访问VMware提供的工件,并安全地采用他们的开源技术。特别是VMware Tanzu的客户可以从更广泛的补充服务中受益,以便快速推出应用程序[38]。

版本演进
| 版本 | 说明 |
|---|---|
| Docker 0.1 | 2013年3月发布的版本,它是首次公开发布的版本,实现了基础功能[39] |
| Docker 1.0 | 2014年6月发布的版本,这也意味着Docker的稳定性和可靠性已经基本满足了生产环境的运行需求[39] |
| Docker 1.3 | 2014年12月发布的版本,引入了对签名镜像的支持[39] |
| Docker 1.6 | 2015年4月发布的版本,引入了对Docker Registry 2.0和Docker Compose 1.2的支持[39] |
| Docker 1.9 | 2015年11月发布的版本,引入了对多主机网络和卷插件的支持[39] |
| Docker 1.10 | 2016年2月发布的版本,引入了对内容可寻址存储和运行时权限控制的支持[39] |
| Docker 1.12 | 2016年6月发布的版本,引入了对Swarm模式和服务部署API的支持[39] |
| Docker CE 17.03 | 2017年4月发布的版本,这是第一个使用新的YY.MM版本方案的版本[40] |
| Docker CE 17.09 | 2017年9月发布的版本,引入了对多阶段构建和数据管理命令的支持[41] |
| Docker CE 18.01 | 2018年1月发布的版本,主要更新包括对overlay2存储驱动程序的改进,对Docker for Mac的Kubernetes支持,以及对Docker for Windows的命名管道挂载支持[42] |
| Docker CE 19.03 | 2019年7月发布的版本,主要更新包括对Nvidia GPU的实验性支持,对根文件系统挂载的支持,以及对上下文感知的帮助文本的支持[22] |
| Docker CE 20.10 | 2020年11月发布的版本,主要更新包括对cgroups v2的支持,对根less模式的支持,以及对多个平台的镜像构建和推送的支持。此外,还修复了一些错误并进行了一些小的改进[43] |
| Docker CE 23.0 | 2023年2月发布的版本,从该版本开始不再使用CalVer 版本控制, 并开始使用 SemVer 版本控制格式[44] |
| Docker CE 24.0 | 2023年5月发布的版本,该版本对containerd作为内容存储的实验性支持,限制对默认seccomp配置文件中的系统调用系列的访问,引入了对在容器上设置OCI运行时注释的支持[45] |
与其它容器技术的对比
容器技术描述优点缺点Docker开源的容器化平台[5],提供了容器的构建、打包和分发功能[7]。使用控制组、命名空间、层功能实现进程隔离[27]庞大的生态系统[15][16][32][33]、被广泛使用[46],支持Windows操作系统[20]商业使用收费[24],作为容器技术存在着一定的安全风险[34]LXC原始的Linux内核包含的容器技术,提供了轻量级的虚拟化和隔离功能[47]。使用命名空间实现进程隔离[48]完全免费[47],几乎涵盖Linux内核支持的所有特性[49]商业支持较少,依赖于Linux发行版修复和更新[47],作为容器技术存在着一定的安全风险[34]rkt (Rocket)红帽公司开发的容器引擎,引入了Pod概念[50],使用systemd-nspawn技术实现进程隔离[51]强调安全性和易于Kubernetes集成[52],实现appc规范[53]并且支持OCI规范[18]已停止维护[52],作为容器技术存在着一定的安全风险[34]
参考资料 53
- Develop faster. — docker官网
- Contact Docker — docker官网
- https://book.douban.com/subject/35425844/
- 参考 4
- Get Docker — Docker官网
- 参考 6
- 参考 7
- 参考 8
- docker rise fall rebirth — businessinsider
- Docker 1.0 Released at DockerCon — infoq
- Amazon Adds Docker Support to Elastic Beanstalk — infoq
- Everything at Google Runs in Containers — infoq
- Red Hat Releases Project Atomic — infoq
- 参考 14
- docker compose — Docker官网
- Swarm mode overview — docker官网
- Open Container Initiative — OCI
- What is Docker Enterprise and why do we need it? — dockerlabs
- Release notes for previous versions — docker官网
- Introducing Docker for Windows Server 2016 — docker官网
- Biggest Announcements of DockerCon EU 2017 — autoize
- Docker Engine 19.03 release notes — Docker官网
- Docker Now Requiring Paid Subscription for Large Businesses — infoq
- Pricing and Subscriptions — docker官网
- Docker overview — Docker官网
- Docker 架构及工作原理 — Docker官网
- 参考 27
- 参考 28
- 参考 29
- 参考 30
- 参考 31
- docker-hub verview — docker官网
- docker machine — docker machine github
- Docker容器安全性分析与增强方案研究 — 国家保密局
- 参考 35
- 参考 36
- 参考 37
- Docker Expands Trusted Content Offerings for Developers — Docker官网
- Docker Engine release notes — Docker官网
- Docker Engine 17.03 release notes — Docker官网
- Docker Engine 17.09 release notes — Docker官网
- Docker Engine 18.01 release notes — Docker官网
- Docker Engine 20.10 release notes — Docker官网
- Docker Engine 23.0 release notes — Docker官网
- Docker Engine 24.0 release notes — Docker官网
- 参考 46
- Linux容器-LXC — linuxcontainers
- 参考 48
- Linux — linuxcontainers
- Featured links — redhat
- 参考 51
- rkt仓库 — github
- Name already in use — github