Docker 采用C/S 架构,包括客户端和服务端,Dokcer 守护进程Daemon 作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)
客户端和服务端可以运行在一个主机上,也能通过socket 和RESTful API 进行通信
进程
命名空间(Namespace)
Linux 通过Namespace 来实现进程的隔离,Docker 容器内部的任意进程对宿主机中的进程一无所知,运行在其中的应用就像独立的操作系统中运行一样。
- pid 命名空间
不同用户的进程就是通过pid命名空间隔离开的,且不同命名空间中可以拥有相同的pid 。每个容器进程在Docker中 的父进程就是Dokcer 进程,每个容器进程拥有不同的pid 命名空间,且允许嵌套
- net 命名空间
每个容器通过net命名空间来实现网络隔离,每个net 命名空间拥有独立的网络设备,ip,路由表,/proc/net 目录。Docker 采用默认的veth 方式,将容器中的虚拟网卡同主机host 的一个网桥Docker0 连接在一起
- ipc 命名空间
容器中进程的交互还是采用了Linux常 用的进程间交互方式(interprocess communication - IPC) ,包括信号量,消息队列,共享内存。容器的进程间交互实际上还是 host 上具有相同pid 命名空间中的进程间交互,因此需要在IPC 资源申请时加入命名空间信息,每个IPC 资源有一个唯一的 32 位 id。
- mnt 命名空间
类似chroot ,将一个进程放到一个特定的目录执行。mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个命名空间中的容器在/proc/mounts 的信息只包含所在命名空间的mount point 。
- uts 命名空间
UTS("UNIX Time-sharing System") 命名空间允许每个容器拥有独立的 hostname 和domain name , 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。
- user 命名空间
每个容器可以拥有不同的用户和组id,也就是说可以在容器内用容器内部的用户执行程序,而非主机上的用户
因此Docker利用命名空间实现了进程和网络的隔离
网络
虽然容器通过命名空间实现了网络的隔离,但是却没有办法通过宿主机的网络与互联网连通,会造成很多不便和限制。Docker 为我们提供了四种网络配置模式Host、Container、None 和Bridge 模式。 默认的是网桥(Bridge) 模式
- 当
Docker 服务在主机启动后会创建一个虚拟网桥docker0 ,随后在主机上启动的所有服务默认都会与该网桥相连。 Docker 创建一个新容器的时候会创建一对虚拟网卡,一个放到容器中,并改名为eth0,该eth0只在容器的命名空间内可见;- 另一个桥接到
docker0 网桥上,并具有唯一的名字,如veth7689 - 从网桥的可用地址中分一个ip地址给容器的
eth0 ,并配置默认路由到网桥docker0 的veth7689
可以在docker run 的时候通过- -net= 参数来指定容器的网络配置,有四个选项:
- –net=bridge
这个是默认值,连接到默认的网桥。 - –net=host
告诉 Docker 不要将容器网络放到隔离的命名空间中,让容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus ,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --privileged=true ,容器会被允许直接配置主机的网络堆栈。 - –net=container:NAME_or_ID
让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 lo 环回接口通信。 - –net=none
让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。
CGroups
倘若其中的某一个容器正在执行 CPU 密集型的任务,那么就会影响其他容器中任务的性能与执行效率,导致多个容器相互影响并且抢占资源,因此Docker 通过CGroups 技术隔离主机上的物理资源,如CPU、内存、磁盘I/O 和网络带宽等。
每一个CGroup 都是一组被相同的标准和参数限制的进程,不同的 CGroup 之间是有层级关系的,可以继承。在CGroup 这种机制中,所有的资源控制都是以CGroup 作为单位实现的,每一个进程都可以随时加入和退出一个 CGroup 。
UnionFS
联合文件系统UnionFS 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下.
目前版本的的Docker 默认使用overlay2 存储驱动,之前是aufs
|