Docker 官网:http://www.docker.com
Docker 中文网站:https://www.docker-cn.com
Docker Hub 官网:https://hub.docker.com
目录
Docker的发展历程
Docker的发展历程可以清晰地划分为以下几个关键阶段:
1. 起源与初创期(2010-2013年)
Docker起源于2010年,由DotCloud公司开始研发。这家公司的初衷是解决跨不同云平台部署应用程序的难题。
2013年,DotCloud决定将其核心容器技术开源,并命名为“Docker”。Docker的第一个版本在GitHub上发布后,迅速引起了开发社区的关注。这一时期的Docker,虽然还处于初创阶段,但已经展现了其巨大的潜力。
2. 快速发展与生态系统构建(2014年)
2014年,Docker公司正式成立,专注于Docker项目的开发和支持。同年,Docker 1.0正式发布,这标志着Docker产品进入了生产就绪状态,开始被越来越多的企业所接受和使用。
随着Docker的普及,其生态系统也开始快速发展。出现了许多围绕Docker的工具和服务,如Docker Compose用于定义和运行多容器Docker应用程序,Docker Machine用于在虚拟主机上安装Docker,以及Docker Hub作为Docker镜像的托管服务。
3. 容器编排与标准化(2015-2016年)
2015年,Docker引入了Docker Swarm,这是一个内置于Docker引擎的集群管理和编排工具。Docker Swarm允许用户将多个Docker守护进程组织成一个虚拟的Docker主机,用于执行容器化的应用程序。随着容器技术的普及,市场上出现了多种容器编排工具。其中,Kubernetes因其强大的功能和社区支持而逐渐成为市场领导者。尽管Docker Swarm也是一款强大的工具,但在与Kubernetes的竞争中逐渐失去了市场份额。
2016年,Docker公司推出了Docker for Mac和Docker for Windows,这使得容器技术更易于在个人电脑上使用。这些产品的推出,进一步推动了Docker的普及和发展。同时,Docker与多家厂商共同成立了开放容器项目OCP(后更名为OCI),旨在实现容器技术的标准化。OCI的成立,为容器技术的长期发展奠定了坚实的基础。
4. 商业化与云原生计算(2017年至今)
2017年,Docker公司宣布将Docker的核心组件捐赠给云原生计算基金会(CNCF),并继续支持开源社区。这一举措表明了Docker公司对开源社区的承诺和支持。Docker继续发展其商业版容器及服务平台,并推出了Docker Enterprise Edition(EE),以满足企业市场的需求。Docker EE提供了更强大的功能和更高的安全性,适用于大型企业级应用。
随着云原生计算的普及,Docker作为容器技术的先驱,其影响力依然深远。尽管Kubernetes成为了容器编排的事实标准,但Docker仍然是最受欢迎的容器运行时之一,并广泛用于开发、测试和部署应用程序。Docker的灵活性和易用性使其成为了许多开发者和企业的首选工具。
综上所述,Docker的发展历程充满了创新和变革。从最初的起源与初创期到如今的商业化与云原生计算时代,Docker一直在不断推动容器技术的发展和普及。
Docker的概念与特点
-
Docker的定义
Docker 是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植且简单易用的容器解决方案。Docker的源代码托管在GitHub上,基于Go语言开发,并遵从Apache 2.0 协议。Docker 可在容器内部快速自动化地部署应用,并通过操作系统内核技术( namespace、CGroups 等)为容器提供资源隔离与安全保障。
-
Docker的优势
1、标准化环境:
Docker通过容器技术封装应用程序及其依赖(如库、配置文件、运行时环境等),确保应用程序在任何环境中都能以一致的方式运行,提升了软件的可移植性和可靠性。
2、快速部署与启动:
Docker容器相比传统虚拟机启动速度快得多,可以在几秒钟内创建、启动或停止容器。这种即时性极大地缩短了应用程序从开发到部署的周期,促进了敏捷开发和DevOps流程。
3、资源高效利用:
容器共享主机内核,相比于全虚拟化技术,容器占用的系统资源更少。一个主机可以运行多个容器,显著提升服务器利用率,降低硬件成本。
4、可移植性:
Docker镜像是一种轻量级、可移植的软件包,可以在任何支持Docker的平台上运行,这使得应用程序可以在本地开发、云环境、不同操作系统之间无缝迁移,实现了“一次构建,到处运行”。
5、环境隔离:
容器为应用程序提供了隔离的运行环境,各容器间互不影响,即使应用程序有冲突的依赖或者不同的配置需求,也能在同一台主机上稳定共存。
6、简化配置与管理:
Docker通过将应用及其依赖打包成单一单元,简化了应用程序的配置和管理。
Dockerfile和Compose文件等工具允许以声明式方式定义容器配置,便于版本控制、自动化构建和部署。
7、持续集成与持续部署(CI/CD):
Docker与CI/CD工具无缝集成,简化了自动化测试、构建和发布流程。
容器化的应用可以作为独立的部署单元,易于版本控制和回滚,加速了软件迭代速度。
8、微服务架构支持:
Docker非常适合构建和管理微服务架构,每个服务可以封装在独立的容器中,易于扩展、升级和替换。容器的轻量级特性使得微服务架构的部署和运维更为灵活和高效。
9、安全性增强:
Docker通过限制容器对主机系统的访问权限,提供了额外的安全层。每个容器有自己的用户命名空间、控制组(cgroups)和安全上下文,有助于防止容器间或容器与主机间的潜在安全风险
Docker架构
Docker采用客户端/服务器( Client/Server, C/S)架构模式。Docker Daemon作为服务器端接收客户端的请求,负责构建、运行和分发容器。客户端和服务器端可以运行在同一个Host上,客户端也可以通过Socket 或REST API 与远程的服务器端通信。
Docker Daemon可以守护进程在宿主机后台运行,用户并不直接与其进行交互,而是通过Docker Client 间接和其通信。Docker Client 以系统命令的形式存在,用户使用Docker命令来与Docker Daemon 交互。Docker Daemon 接收用户指令并与Docker共同守护进程通信。
Docker核心组件
-
Docker 客户端(Client):用户与 Docker 交互的主要方式,通过命令行或其他工具使用 Docker API 与 Docker 守护进程通信。
-
Docker 守护进程(Daemon):Docker Daemon是服务器组件,负责构建、运行和分发 Docker 容器的后台服务,以Linux后台服务的方式运行。
-
Docker 镜像(Image):是Docker 容器的基础,一个只读的模版,包含了运行容器所需的所有信息,包括文件系统、元数据、配置等。
-
Docker 容器(Container):从镜像启动的实例,可以运行应用。容器是一个隔离的环境,多个环境之间不会相互影响,以保证容器中的应用运行在一个相对安全的环境中。
-
Docker 仓库(Registry):存储 Docker 镜像的地方,分为公有仓库和私有仓库,目前最大的公有仓库是Docker Hub。
Docker核心技术
1、命名空间(NameSpace)
Linux 的命名空间提供了一种隔离机制,使得不同的进程组可以看到不同的文件系统、网络接口等。Docker 使用多种类型的命名空间来隔离容器:
-
PID Namespace:进程隔离。
-
Network Namespace:网络隔离。
-
Mount Namespace:挂载点隔离,使得容器有自己的根文件系统。
-
UTS Namespace:主机名和域名隔离。
-
IPC Namespace:进程间通信(IPC)隔离。
-
User Namespace:用户和组隔离。
2、控制组(Cgroups)
Cgroups 限制、记录和隔离进程组使用的物理资源(CPU、内存、磁盘 I/O 等)。Docker 使用 cgroups 来限制每个容器的资源使用,如 CPU 时间、内存等。
- 功能:
(1)Resource limitation: 限制资源使用。比如内存使用上限以及文件系统的缓存限制;
(2)Prioritization: 优先级分配。比如:CPU利用和磁盘IO吞吐,实际上相当于控制任务运行优先级;
(3)Accounting:资源统计。 一些审计或一些统计,如cpu时长,内存用量等,主要目的是为了计费;
(4)Control: 任务控制。对任务进行执行挂起,恢复等操作。
- 子系统分类:
在/sys/fs下有一个cgroup的目录,这个目录下还有很多子目录,比如: cpu,cpuset,memory,blkio……这些,这些都是cgroup的子系统。control group子系统有:
(1)blkio — 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
(2)cpu — 这个子系统使用调度程序提供对CPU的cgroup 任务访问。
(3)cpuacct — 这个子系统自动生成cgroup 中任务所使用的CPU报告。
(4)cpuset — 这个子系统为cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
(5)devices — 这个子系统可允许或者拒绝cgroup 中的任务访问设备。
(6)freezer — 这个子系统挂起或者恢复cgroup 中的任务。
(7)memory — 这个子系统设定cgroup 中任务使用的内存限制,并自动生成内存资源使用报告。
(8)net_cls — 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体cgroup 中生成的数据包。
(9)net_prio — 这个子系统用来设计网络流量的优先级。
(10)hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
3、联合文件系统(Union File Systems)
Docker 使用联合文件系统(如 AUFS, OverlayFS, Btrfs 等)实现镜像的分层存储,使得容器的创建和启动更加高效,并且减少了存储空间的占用。
Docker的版本分类
Docker的早期版本是docker-io,版本号是1.*, 最新版是1.13。 Docker 从1.13版本之后采用时间线的方式作为版本号,分为DockerCE (社区版)和DockerEE (企业版)。DockerCE (社区版)是免费提供给个人开发者和小型团体使用的,DockerEE (企业版)会提供额外的收费服务,如经过官方测试认证的基础设施、容器、插件等。
Docker现在的版本格式为<YY.MM>。Docker CE (社区版)按照Stable和Edge两种方式发布,每个季度更新Stable版本,每个月份更新Edge版本。例如,使用基于月份的发行版本,19.03 的第1版就指向17.03.0,如果有漏洞/安全修复需要发布,那么将会指向19.03.1等。
Docker与传统虚拟机的区别
-
架构区别


-
特性比较
特性 | Docker容器技术 | 传统虚拟机技术 |
启动速度 | 秒级启动(直接运行在宿主机内核上)。 | 分钟级启动(需启动完整的 Guest OS)。 |
性能 | 接近原生(无虚拟化层开销) | 较弱(有 Hypervisor 虚拟化层开销,性能略低于原生) |
基础架构 | 基于容器化技术,共享宿主机的操作系统内核。 | 基于 Hypervisor(如 VMware ESXi)虚拟化硬件,每个虚拟机包含完整的 Guest OS。 |
资源占用 | 轻量级,仅包含应用及依赖库,共享内核,资源消耗低。 | 重量级,需为每个虚拟机分配独立资源(CPU、内存、磁盘),包含完整 OS,资源消耗高。 |
镜像体积 | 镜像小(通常为 MB ),仅包含应用和运行环境 | 镜像大(通常为 GB ),包含完整 OS 和虚拟硬件。 |
迁移性 | 优秀 | 一般 |
适用场景 | 微服务、云原生应用、CI/CD 流水线、高密度部署。 | 传统单体应用、需要强隔离的环境(如不同 OS)、物理资源丰富的场景。 |
资源利用率 | 高(多个容器共享宿主机资源)。 | 低(每个虚拟机独占分配的资源)。 |
安全性 | 共享内核存在安全风险(内核漏洞可能影响所有容器)。 | 强隔离性(虚拟机之间互不影响)。 |
内存代价 | 很小 | 较多 |
隔离性 | 安全隔离 | 完全隔离 |
运行密度 | 单机支持上千个容器 | 单机仅支持几十个容器 |
跨平台支持 | 依赖宿主机内核,Linux 容器无法直接在 Windows 运行(需使用 Linux 虚拟机或 WSL)。 | 支持跨平台(如 Windows 宿主机运行 Linux 虚拟机) |