读《Docker核心技术与实现原理》文章笔记

Docker采用C/S架构,包括客户端和服务端,Dokcer守护进程Daemon作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)

客户端和服务端可以运行在一个主机上,也能通过socketRESTful 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")命名空间允许每个容器拥有独立的 hostnamedomain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。

  • user 命名空间
    每个容器可以拥有不同的用户和组id,也就是说可以在容器内用容器内部的用户执行程序,而非主机上的用户

因此Docker利用命名空间实现了进程和网络的隔离

网络

虽然容器通过命名空间实现了网络的隔离,但是却没有办法通过宿主机的网络与互联网连通,会造成很多不便和限制。Docker为我们提供了四种网络配置模式Host、Container、NoneBridge模式。
默认的是网桥(Bridge)模式

  • Bridge
  1. Docker服务在主机启动后会创建一个虚拟网桥docker0,随后在主机上启动的所有服务默认都会与该网桥相连。
  2. Docker创建一个新容器的时候会创建一对虚拟网卡,一个放到容器中,并改名为eth0,该eth0只在容器的命名空间内可见;
  3. 另一个桥接到docker0网桥上,并具有唯一的名字,如veth7689
  4. 从网桥的可用地址中分一个ip地址给容器的eth0,并配置默认路由到网桥docker0veth7689

可以在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫花海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值