此文作为我以前一篇文章的裁剪,没有十分详尽地展现所有内容,对此我深感抱歉!
1 Docker容器技术
1.1 Docker容器技术概述
Docker是一种新型的容器技术,已经在成为云计算的核心技术之一。Docker是为了解决依赖地域问题而产生的。Docker使用命名空间将各个容器进行隔离,并使用Namespace来对端口、层次进行隔离,使用AUFS技术进行分层并复用共同的层,以达到减少空间使用量。
1.2 Docker网络通信
Docker容器有以下几种网络模式。
(1) bridge模式
使用—net=bridge指定,为Docker的默认设置。这种模式是将容器用docker的网桥连接起来。
作为最常规的格式,bridge模式已经可以满足Docker容器最基本的使用需求。然而其在于外界通信使用NAT协议,增加了通信的复杂性,在复杂的场景下使用会有诸多限制。
(2) host模式
host模式下,容器不会拥有自己的网络命名空间。Docker容器中的进程处于宿主机的网络环境中,此时Docker容器和宿主机之间网络没有映射关系,外界可以通过该主机的IP地址、端口等进行Docker容器的访问。当然,除了network namespace外,其他内容宿主机是隔离的。host模式不用地址映射,可以直接使用宿主机的IP。但是也降低了隔离性,而且由于网络资源一直被竞争,所以可能造成网络的短暂不可用问题。
(3) container模式
container模式是指新创建的容器与已有的容器共享网络信息。在此种模式下,新创建的容器与指定的容器共享IP、端口等。当然,两个容器之间除了网络信息共享外,其它内容均不可共用。由于在这种模式下,两个容器的进程使用回环网卡通信,所以通讯速率加快了。container模式的主要用于部署多个相关的应用,最好能成为一个整体。由于container模式的特点,导致了这种模式隔离性不强,可能会存在安全隐患。
(4) none模式
none模式时,Docker拥有网络协议栈,但是没有对协议栈进行配置。这时,Docker容器的网卡以及IP,均为用户所配置。一般而言,当未给使用这种模式的容器进行网络配置时,用户无法正常使用容器进程,但是优点也很明显,它给用户最大的自由度来自定义容器的网络环境。
1.3 Docker与传统虚拟化比较
Docker与传统的虚拟化技术有着不同,其容器是虚拟的是进程,而这些进程的依赖关系等都已经在布置容器时配置好。用户运行容器,就相当于直接利用宿主机的操作系统运行这些进程。而传统的虚拟化技术是重新虚拟一个操作系统,再在操作系统上运行这些程序进程。如图1所示,展现了Docker与传统虚拟化方式在实现上的不同。
图 1 传统虚拟化技术和Docker比较
从图中可知,Docker与传统的虚拟化技术最大的区别是:传统的虚拟化技术是对操作系统的虚拟化;而Docker是复用了宿主机操作系统,相当于对应用的虚拟化。
当然,应用程序运行时的组合方式有很多,不局限于上面所讲到的两种。图2展示了可能的组合方式。
图2 运行应用程序是可能的层次组合
当然,Docker容器技术越来越受各企业的青睐,原因是它比传统的虚拟化技术有更多的优势。首先,Docker容器技术使得其不需要创建虚拟机,而创建虚拟机所耗费的时间很长,这就间接地降低了容器的启动时长,当然容器技术也让创建容器、删除容器变得迅捷;其次,Docker可以打包每个组件及其依赖,因而Docker在很大程度上解决操作系统层面的冲突依赖、缺少依赖、平台依赖等依赖问题;最后,Docker能够充分利用系统资源,因为Docker较传统的虚拟化技术省却了最耗系统资源的操作系统。
1.4 Docker操作
Docker操作最主要的就是docker和docker daemon这两个部分,通过这两个部分,用户可以快速实现容器和镜像之间的操作。由于docke和docker daemon共用同一个二进制组件,所以docker在使用的时候一般需要root权限。
从docker命令使用出发,梳理出如图3所示的命令结构图。
图3 Docker命令结构图
从图中可以看出,docker操作主要围绕着镜像和容器展开。通常创建可移植性的镜像,需要通过Dockerfile编写相应配置文件,然后创建之后打上标签,上传到Docker仓库中。下次需要运行时,只需要简单地将该镜像拉取至Docker宿主机上,然后运行即可。
总而言之,Docker容器技术使得应用程序的可移植性大大增强,同时还为管理人员创建应用、启动应用、更新应用提供了方便。