专栏简介
本专栏将带领您进入 Docker 的世界。您是否对 Docker 有所耳闻?那么,您是否知道使用 Docker 可以带来什么样的好处呢?如果您还不了解 Docker,不用担心,让我们一起探索这个神奇的世界吧!
Docker
Docker最初是dotCloud公司内部项目,由Solomon Hykes在法国创立。它基于dotCloud公司多年的云服务技术,并于2013年3月以Apache 2.0授权协议开源,主要项目代码在GitHub上进行维护。Docker项目后来加入了Linux基金会,并成立了推动开放容器联盟(OCI)。自开源以来,Docker受到广泛的关注和讨论,其GitHub项目已经超过5万7千个星标和一万多个fork。甚至由于Docker项目的火爆,dotCloud公司在2013年底决定改名为Docker。
概念介绍
Docker是一个开源软件项目,可自动化应用程序的容器化部署。它在Linux操作系统上提供了一个额外的软件 抽象层和操作系统层虚拟化的自动管理机制。
原理分析
Docker利用Linux核心中的资源分离机制,如cgroups和Linux核心命名空间,来创建独立的软件容器。这可以在单一Linux实体下运行,避免启动虚拟机造成的额外负担。Linux核心对命名空间的支持完全隔离了应用程序的视野,包括进程树、网络、用户ID和挂载文件系统。核心的cgroup提供了资源隔离,包括CPU、存储器、block I/O和网络。自Docker 0.9版本起,它开始使用libcontainer库作为基础,直接使用Linux核心提供的虚拟化设施。根据行业分析公司“451研究”的说法,Docker具备打包应用程序及其虚拟容器的能力,可以在任何Linux服务器上运行,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云还是单机。
功能特点
Docker早起基于LXC,后来基于自研的JlibContainer,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作为一种新兴的虚拟化方式, Docker 跟传统的虚拟化方式相比具有众多的优势。
Docker在容器技术的基础上进行了进一步的封装,不仅包括文件系统和网络互联,还包括进程隔离等多种功能,这大大简化了容器的创建和维护过程。相比虚拟机技术,Docker技术更加轻便、快捷。下面的图片比较了Docker和传统虚拟化方式的不同之处。传统虚拟机技术需要虚拟出一套硬件环境,并在其上运行一个完整的操作系统,再在该系统上运行所需的应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,也没有进行硬件虚拟化。因此,容器比传统虚拟机更为轻便。
虚拟机的架构
每个虚拟化应用程序不仅包括应用程序(可能只有10MB)和必要的二进制文件和库,也是一个完整的操作系统,其重量可能为10GB。
Docker的架构
Docker引擎容器只包含应用程序及其依赖项。它作为孤立运行主机操作系统用户空间中的进程,与其他容器共享内核。因此,它喜欢虚拟机的资源隔离和分配优势更加便携和高效。
Docker与虚拟机相同点
- 可以在不同的主机之间进行迁移,这意味着开发人员可以在不同的环境中部署和运行它们,而无需担心任何兼容性问题。
- 具有root权限,这使得它们能够访问和修改系统的各个部分,从而为开发人员和运维人员提供更大的灵活性和控制权。
- 可以进行远程控制,这意味着开发人员和运维人员可以从远程位置访问和管理它们,而无需直接访问它们所在的主机。
- 具有备份和回滚操作功能,这意味着开发人员和运维人员可以轻松地备份和还原它们,以确保系统的稳定性和可靠性。
Docker与虚拟机不同点
运行原理
- Docker:这种容器化技术允许多个容器共享同一个内核,这样就可以更有效地利用系统资源。容器引擎负责管理和运行这些容器,每个容器都运行在容器引擎之上,而不是在一个完整的操作系统之上。这意味着容器共享操作系统,并且在进程级别进行隔离,从而保证容器之间的安全性和稳定性。
- 虚拟机:建立在虚拟硬件之上的,提供指令级的虚拟化技术,因此可以运行一个完整的操作系统。这种虚拟化技术使得多个虚拟机可以在同一台物理服务器上运行,每个虚拟机都独立于其他虚拟机,从而实现了更高的安全性和稳定性。
资源管理
- Docker:弹性资源分配:资源可以在没有关闭容器的情况下添加,数据卷也无需重新分配大小
- 虚拟机:需要重启,虚拟机里边的操作系统需要处理新加入的资源,如磁盘等,都需要重新分区。
内核控制权
- Docker:对内核没有控制权限,只有容器的提供者具备升级权限。只有一个内核运行在物理节点上,几乎不能实现不同的操作系统混合。容器提供者一般仅提供少数的几个操作系统
- 虚拟机:每一台虚拟机都具有更大的负载,耗费更多的资源,用户需要全权维护和管理。一台物理机上能够运行的虚拟机非常有限。
Docker解决的问题
服务架构级别问题攻克
简化环境管理
传统的软件开发和发布环境非常复杂,配置繁琐,常常会出现这样的问题:在开发环境中可以运行代码,但一旦部署到服务器上,就无法正常运行。这个问题很常见,也确实很烦人。但是问题总是要解决的,因为在开发、测试和生产环境中,都有可能出现各种问题。如果能够实现一键部署,就会方便很多。例如,一键安装Linux、一键安装MySQL、一键安装Nginx等。Docker技术彻底解决了这个问题,使得各个环境中的部署变得非常简单和方便。
虚拟化更加轻量级
当谈到容器和虚拟化时,许多人往往会想到虚拟机、VMware、VirtualBox等工具。然而,与这些虚拟技术不同,Docker虚拟化更加轻量级。传统的虚拟机先要虚拟出一个操作系统,然后在操作系统上完成各种配置。这种方法并不能充分利用物理机的性能。Docker则是一种操作系统级别的虚拟技术,它运行在操作系统之上的用户空间。所有的容器都共用一个系统内核和公共库,容器引擎提供了进程级别的隔离,让每个容器都像运行在单独的系统之上,但又能够共享很多底层资源。因此,Docker更为轻量、快速和易于管理。
程序可移植性
由于Docker容器在不同的环境中具有相同的运行时环境,因此可以在不同的操作系统、云平台或主机上运行相同的Docker容器,而不需要进行任何修改。这意味着,一旦开发人员在本地开发和测试了Docker容器,他们可以将其部署到任何其他支持Docker的环境中,而不必担心任何兼容性问题。此外,Docker容器还具有很好的可重复性,可以确保在不同的环境中始终以相同的方式运行,从而减少了由于环境差异导致的错误和故障。总之,Docker的程序可移植性为开发人员和运维人员提供了更高的灵活性和便利性。
功能性能级别问题攻克
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销, Docker 对系统资源的利用率更高。无论是 应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同 配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启 动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未 在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性, 从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进 行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境 中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。 而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应 用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外, Docker 团队同各个开源项目团队一起维护了一大 批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像 制作成本。
对比虚拟机总结
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker的应用场景
以下是Docker的场景:
- 加速本地开发:Docker可以在本地环境中创建虚拟化的容器,避免了在不同的开发环境中进行部署和测试的麻烦,提高了开发人员的工作效率。
- 自动打包和部署应用:Docker可以将应用程序和依赖项打包成一个容器镜像,便于在不同的环境中进行部署和测试,同时也可以通过Docker Hub等平台进行容器镜像的分享和分发。
- 创建轻量、私有的PaaS环境:Docker可以用于创建轻量级的PaaS平台,提供类似于Heroku和Google App Engine等平台的服务,便于开发人员进行应用程序的部署和管理。
- 自动化测试和持续集成/部署:Docker可以与CI/CD工具进行集成,实现自动化测试和持续集成/部署,提高了应用程序的质量和部署效率。
- 部署并扩展Web应用、数据库和后端服务器:Docker可以用于部署和扩展Web应用、数据库和后端服务器,提高了应用程序的可伸缩性和性能。
- 创建安全沙盒:Docker可以用于创建安全沙盒,隔离应用程序和系统环境,提高了应用程序的安全性和稳定性。
- 轻量级的桌面虚拟化:Docker可以用于创建轻量级的桌面虚拟化环境,提供与应用程序和依赖项相关的环境,便于开发人员进行本地开发和测试。
Docker的技术特点
Docker是一种容器化技术,具有以下特性:
- 隔离性:Docker容器之间是相互隔离的,每个容器都有自己的文件系统、网络和进程空间,避免了应用程序之间的干扰,提高了应用程序的稳定性和安全性。
- 可度量性:Docker可以对容器进行资源限制和监控,可以通过容器的CPU使用率、内存使用率等指标来评估应用程序的性能和健康状况,从而进行调优和优化。
- 移植性:Docker容器可以在不同的操作系统和云平台上运行,不需要修改应用程序的代码,提高了应用程序的移植性和可扩展性。
- 安全性:Docker容器可以使用安全隔离技术,避免了容器之间的相互影响,同时也可以使用安全策略和访问控制机制来保护应用程序的安全性。Docker还提供了容器镜像签名和加密等安全特性,保护容器镜像的完整性和机密性。