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容器连接到虚拟网桥上,实现容器和容器的主机的互连。​


关注我的微信公众号:FramePower
我会不定期发布相关技术积累,欢迎对技术有追求、志同道合的朋友加入,一起学习成长!


Docker高级应用(随笔)_第1张图片
微信公众号

你可能感兴趣的:(Docker高级应用(随笔))