容器是一种轻量级、可移植、自包含的软件打包技术,他使得应用程序可以在几乎任何地方以相同的方式运行。 软件开发工程师在任何设备测试完成自己的容器,无需任何修改可以在生产系统的虚拟机、物理机、或云主机上运行。
容器是由应用程序本身和它的环境依赖(库和其他应用程序)两部分组成,并在宿主机(Host)操作系统的用户空间中运行的,但与操作系统的其他进程互相隔离(类似沙箱),他们的实现机制与有别于VMWare、KVM 和Xen等实现的方案的传统虚拟技术。
可以发现同一个容器都共享其底层系统(内核空间), 这就使得容器在体积上要比传统虚拟机小得多。 启动容器无需启动整个操作系统,所以容易部署和启动速度更快,开销更小,也更容易迁移。
容器服务技术的功能
随着IT不断发展,开发语言多种多样,多种中间件(MQ、Redis、DB)等部署到不同的环境中,如物理服务器、虚拟服务器、私有云、公有云之上。这些不同的云服务器有这不同的系统环境CentOS、RHEL 、Debian等Linux 发行版,甚至还有Window 环境。
现在应用程序都包含了多种服务,每种服务均可能存在依赖的库和软件的包;另一方面存在多种部署环境,而服务在运行时又可能需要动态迁移到不同的环境中,于是,各种服务和环境产生了一个大部署矩阵。在开发的过程中需要考虑不同的运行环境(PHP、Python 、C 工程师感觉很难受),而运维需要为不同的服务平台配置环境。
容器历史
容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的位置,从而达到了进程隔离的目的。 2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术。Jails 英译过来是监狱的意思,这个“监狱”(用沙盒更为准确)包含了文件系统、用户、网络、进程等的隔离。 2001 Linux 也发布自己的容器技术 Linux VServer, 2004 Solaris 也发布了 Solaris Containers,两者都将资源进行划分,形成一个个 zones,又叫做虚拟服务器。 2005 年推出 OpenVZ,它通过对 Linux 内核进行补丁来提供虚拟化的支持,每个 OpenVZ 容器完整支持了文件系统、用户及用户组、进程、网络、设备和 IPC 对象的隔离。 2007 年 Google 实现了 Control Groups( cgroups ),并加入到 Linux 内核中,这是划时代的,为后期容器的资源配额提供了技术保障。 2008 年基于 cgroups 和 linux namespace 推出了第一个最为完善的 Linux 容器 LXC。 2013 年推出到现在为止最为流行和使用最广泛的容器 Docker,相比其他早期的容器技术,Docker 引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的 Rest API。 2014 年 CoreOS 也推出了一个类似于 Docker 的容器 Rocket,CoreOS 一个更加轻量级的 Linux 操作系统,在安全性上比 Docker 更严格。 2016 年微软也在 Windows 上提供了容器的支持,Docker 可以以原生方式运行在 Windows 上,而不是需要使用 Linux 虚拟机。 基本上到这个时间节点,容器技术就已经很成熟了,再往后就是容器云的发展,由此也衍生出多种容器云的平台管理技术,其中以 Kubernetes 最为出众,有了这样一些细粒度的容器集群管理技术,也为微服务的发展奠定了基石。 因此,对于未来来说,应用的微服务化是一个较大的趋势。
为什么使用容器?
就像货物的运输问题一样,如何将不同的货物放在不同的运输机器上,减少因货物的不同而频繁进行货物的装载和卸载,浪费大量的人力物力。
为此人们发明了集装箱,将货物根据尺寸形状等的不同,用不同规格的集装箱装载,然后再放到运输机上运输,由于集装箱密封,只有货物到达目的地才需拆封,在运输过程能够再不同运输机上平滑过渡,所以避免了资源的浪费。
容器与镜像
镜像
容器镜像有一个官方的类比,”生活中常见的集装箱”,虽然拥有不同的规格,但箱子(OCI 标准镜像规范)本身是不可变的(Immutable),只是其中装的内容不同。
容器
一种轻量级的虚拟化技术,目的和虚拟机一样,都是为了创造“隔离环境”。可以解析并运行OCI镜像规范文件的程序。 因此百花齐放就会有像Docker、Containerd、cri-o Docker 只是容器的其中一种
何为容器运行时
容器运行时顾名思义就是要掌控容器运行的整个生命周期,以 docker 为例,其作为一个整体的系统,主要提供的功能如下:
- 制定容器镜像格式 构建容器镜像
docker build
- 管理容器镜像
docker images
- 管理容器实例
docker ps
- 运行容器
docker run
- 实现容器镜像共享
docker pull/push
然而这些功能均可由小的组件单独实现,且没有相互依赖。而后 Docker 公司与 CoreOS 和 Google 共同创建了 OCI (Open Container Initial),并提供了两种规范:
- 运行时规范(https://github.com/opencontainers/runtime-spec)) 描述如何运行filesystem bundle
- 镜像规范(https://github.com/opencontainers/image-spec)) 制定镜像格式、操作等