从操作系统功能上看,Docker底层依赖的核心技术主要包括linux操作系统的命名空间,控制组,联合文件系统和linux网络虚拟化支持。
基本架构
- 服务端
Docker目前采用标准的C/S架构,Docker Daemon一般在宿主主机上运行,作为服务端接受来自客户端的请求,并处理请求。 - 客户端
Docker客户端为用户提供一系列可执行命令,与服务端交互。
命名空间
命名空间是linux内核的一个强大特性,每个容器拥有自己单独的命名空间,运行在容器的应用像是在独立的操作系统中一样,保证了容器之间互不影响。
- 进程命名空间
有了pid命名空间,每个命名空间中的进程就会相互隔离。 - 网络命名空间
通过网络命名空间,可以实现网络隔离,将不同容器的网络隔离开来。 - IPC命名空间
- 挂载命名空间
-UTS命名空间 - 用户命名空间
控制组
控制组是linux内核的一个特性,主要用来对共享资源进行隔离,限制,审计等。通过控制分配到具体容器的资源 ,来避免多个容器同时运行时对宿主主机系统的资源竞争。
联合文件系统
联合文件系统支持将文件系统中的修改信息作为一次提交,并层层叠加,是Docker镜像的实现基础。可以通过docker history来查看一个镜像由哪些层组成。
执行docker history hub.c.163.com/public/ubuntu:16.04-tools
后输出如下:
[vagrant@localhost ~]$ docker history hub.c.163.com/public/ubuntu:16.04-tools
IMAGE CREATED CREATED BY SIZE COMMENT
1196ea15dad6 14 months ago /bin/sh -c #(nop) CMD ["/usr/bin/supervisor… 0B
<missing> 14 months ago /bin/sh -c #(nop) COPY file:32c4496c7e250e69… 70B
<missing> 14 months ago /bin/sh -c #(nop) EXPOSE 22/tcp 0B
<missing> 14 months ago /bin/sh -c cp -f /usr/share/zoneinfo/Asia/Sh… 414B
<missing> 14 months ago /bin/sh -c sed -i s/"PermitRootLogin without… 2.53kB
<missing> 14 months ago /bin/sh -c apt-get update && apt-get upd… 112MB
<missing> 15 months ago /bin/sh -c mkdir -p /var/run/sshd 0B
<missing> 15 months ago /bin/sh -c #(nop) MAINTAINER netease "ops" 0B
<missing> 2 years ago /bin/sh -c #(nop) CMD ["/usr/sbin/sshd" "-D"] 0B
<missing> 2 years ago /bin/sh -c #(nop) EXPOSE 22/tcp 0B
<missing> 2 years ago /bin/sh -c sed -ri 's/^#PasswordAuthenticati… 2.54kB
<missing> 2 years ago /bin/sh -c mkdir /var/run/sshd 0B
<missing> 2 years ago /bin/sh -c apt-get install -y openssh-server… 83.5MB
<missing> 2 years ago /bin/sh -c apt-get update 22.4MB
<missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 years ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 1.9kB
<missing> 2 years ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli… 701B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:9ade4e2863c54c630… 118MB
这些层都是只读,不可修改的 。当docker利用镜像启动一个容器的时候,在文件系统的顶层再挂载一个新的可读写的层给容器,进行更新操作。
网友评论