docker容器架构

容器发展史

1979年,在Unix V7 的开发过程中,引入Chroot Jail以及Chroot系统调用Chroot jail被用于

“Change Root”,它被认为是最早的容器化技术之一。它允许您将进程及其子进程与操作系统的其

余部分隔离开来。这种隔离的唯一问题是根进程(root process)可以轻松地退出chroot。它从未

考虑实现安全机制。

1982年,Chroot加入BSD。

2000年,在FreeBSD OS中引入FreeBSD Jail,旨在为简单的Chroot文件隔离带来更多安全性。

FreeBSD Jail允许管理员将FreeBSD OS划分为几个独立的小型系统 - 称为“jails”,还可以为每个小型

系统分配IP地址。

2001年,Linux内核具有操作系统级的虚拟化的功能以后推出了Linux VServer。它使用了类似

chroot的机制与“安全上下文”(“security context”)以及操作系统虚拟化(容器化)相结合来提供

虚拟化解决方案,允许您在单个Linux发行版上运行多个Linux发行版。

2004年,Solaris Containers问世,它使用系统资源控制和“区域”(zone)实现边界分离。

2006年,Google推出Process Containers,旨在限制,计算和隔离一组进程的资源使用(CPU,内

存,磁盘I/O,网络)。2007年,命名为控制组-cgroups,最终合并到Linux内核2.6.24。

2008年,LXC(LinuX Containers)是第一个Linux容器管理器,使用cgroups和命名空间

(namespace)在单个Linux内核上运行多个容器。

2013年,Docker推出了的第一个版本。在LXC的基础上,Docker进一步优化了容器的使用体验。

后来用自己的库libcontainer替换了该容器管理器。

2014年,Google推出容器LMCTFY(Let me contain that for you),谷歌容器栈的开源版本,提

供Linux应用程序容器。谷歌工程师一直在与Docker合作libcontainer,并将核心概念和抽象移植到

libcontainer。因此没有积极开发LMCTFY项目,未来LMCTFY项目的核心可能会被libcontainer取

代。谷歌是容器化行业的领导者。谷歌的一切都在容器上运行。每周有超过20亿个容器在Google基

础架构上运行。

2014年12月,CoreOS发布并开始支持rkt。

容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运

行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服

务器或公有云主机上运行。

容器与虚拟机

谈到容器,就不得不将它与虚拟机进行对比,因为两者都是为应用提供封装和隔离。

容器由两部分组成:

  1. 应用程序本身虚拟机

容器

启动速度

数秒至数十秒

秒甚至毫秒启动

系统内核

不共享内核

共享内核

实现技术

依赖虚拟化技术实现,由Hypervisor层

实现对资源的隔离

利用Linux内核技术

Namespace/Cgroup等实现。

隔离效果

系统资源级别的隔离

进程级别的隔离

资源消耗(性

能)

使用虚拟化技术,就会有额外的资源消

耗和占用

容器中的应用只是宿主机上的一个普

通进程

资源调用

(敏捷性)

应用进程需经过Hypervisor的拦截和处

理,才能调用系统资源

应用进程直接由宿主机OS管理

运行数量

一台服务器上一般不超过100台虚拟机

一台服务器上能启动1000+容器

应用

用于硬件资源划分

DevOps、微服务等

镜像

非分层镜像

分层镜像

  1. 依赖:比如应用程序需要的库或其他软件

容器在 Host 操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。

传统的虚拟化技术,比如 VMWare, KVM, Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应

用本身及其依赖(通常几十 MB),还得安装整个操作系统(几十 GB)。

下图展示了二者的区别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

008 Docker组件如何协作?

还记得我们运行的第一个容器吗?现在通过它来体会一下 Docker 各个组件是如何协作的。

容器启动过程如下:

  1. Docker 客户端执行 docker run 命令。
  2. Docker daemon 发现本地没有 httpd 镜像。
  3. daemon 从 Docker Hub 下载镜像。
  4. 下载完成,镜像 httpd 被保存到本地。
  5. Docker daemon 启动容器。

docker images 可以查看到 httpd 已经下载到本地。

Docker 借鉴了集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模型运用到自己的设计

哲学中,唯一不同的是:集装箱运输货物,而 Docker 运输软件。

每个容器都有一个软件镜像,相当于集装箱中的货物。容器可以被创建、启动、关闭和销毁。和集装箱

一样,Docker 在执行这些操作时,并不关心容器里到底装的什么,它不管里面是 Web Server,还是

Database。

[root@docker ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

httpd latest 9cb0a2315602 7 weeks ago 148MB用户不需要关心容器最终会在哪里运行,因为哪里都可以运行。

开发人员可以在笔记本上构建镜像并上传到 Registry,然后 测试人员将镜像下载到物理或虚拟机做测

试,最终容器会部署到生产环境。

使用 Docker 以及容器技术,我们可以快速构建一个应用服务器、一个消息中间件、一个数据库、一个持

续集成环境。因为 Docker Hub 上有我们能想到的几乎所有的镜像。

不知大家是否意识到,潘多拉盒子已经被打开。容器不但降低了我们学习新技术的门槛,更提高了效

率。

如果你是一个运维人员,想研究负载均衡软件 HAProxy,只需要执行 docker run haproxy ,无需繁琐

的手工安装和配置既可以直接进入实战。

如果你是一个开发人员,想学习怎么用 django 开发 Python Web 应用,执行 docker run django ,在

容器里随便折腾吧,不用担心会搞乱 Host 的环境。

更提高了效

率。

如果你是一个运维人员,想研究负载均衡软件 HAProxy,只需要执行 docker run haproxy ,无需繁琐

的手工安装和配置既可以直接进入实战。

如果你是一个开发人员,想学习怎么用 django 开发 Python Web 应用,执行 docker run django ,在

容器里随便折腾吧,不用担心会搞乱 Host 的环境。

不夸张的说:容器大大提升了 IT 人员的幸福指数。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。