Docker高级应用(随笔)
在实际应用中,因为一些问题而对Docker做了更深层次的了解,下面将列举一些Docker容器及Linux操作系统相关的知识。
资源隔离
Linux内核从2.4.19开始引入namespace的概念,其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace中的进程看起来拥有它们自己的隔离的全局系统资源实例。
namespace | 系统调用参数 | 隔离内容 | 在容器语境下的隔离效果 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主机名和域名 | 每个容器可以有自己的hostname和domainname |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 每个容器有其自己的System V IPC和POSIX消息队列文件系统,因此,只有在同一个IPC的进程之间才能互相通信 |
PID | CLONE_NEWPID | 进程编号 | 每个PID中的namespace中的进程可以有其独立的PID;每个容器可以有其PID为1的root进程;也使得容器可以在不同的host之间迁移,因为namespace中的进程ID和host无关了。这也使得容器中的每个进程有两个PID:容器中的PID和host上的PID |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 每个容器都有其独立的网络设备,IP地址,IP路由表,/proc/net目录,端口号等。这也使得多个容器内的同一个应用都绑定在各自容器的80端口上 |
Mount | CLONE_NEWNS | 挂载点(文件系统) | 每个容器能看到不同的文件系统层次结构 |
User | CLONE_NEWUSER | 用户和组ID空间 | 在User中的进程的用户和组ID可以和在host上不通。每个container可以有不同的user和group id;一个host上的非特权用户可以成为User中的特权用户 |
Docker的资源隔离也是通过这六种方式实现的,在容器启动时,Docker会创建这六种namespace实例,然后把容器中的所有进程放到这些namespace中,使得Docker容器中只能看到隔离的系统资源。
网络模式
docker目前支持四种网络工作的方式,分别为host,container,none,bridge。下面简单介绍下这几种网络模式。
-
host模式
Docker使用了Linux的Namespaces技术来进行资源隔离,如网卡、路由、进程等。如果启动容器的时候使用host模式,那么容器不会自己去创建一个独立的Network Namespace,而是与主机共用一个Network Namespace。容器也不会虚拟出自己的网卡、IP等,而是使用宿主机的IP和端口。
-
container模式
container模式指定创建的新的容器和已经存在的一个容器共享一个Network Namespace。container模式通过-net=container:NAME_OR_ID指定共享的容器。
-
none模式
在这种模式下,容器拥有自己的Network Namespace,但是不做任何网络配置,需要我们自己给容器添加网卡、IP等。
-
bridge模式
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到虚拟网桥上,实现容器和容器的主机的互连。