网站建设可研,建设银行网站显示404,糖果网站是李笑来做的吗,做网站和做程序一样吗Docker采用c/s架构#xff0c;Docker守护进程#xff08; Daemon #xff09;作为服务端#xff0c;接受来自客户端#xff08;命令行#xff09;的请求#xff0c;并处理这些请求#xff08;创建、运行、分发容器#xff09; 。客户端和服务端既可以运行在一个机器上…Docker采用c/s架构Docker守护进程 Daemon 作为服务端接受来自客户端命令行的请求并处理这些请求创建、运行、分发容器 。客户端和服务端既可以运行在一个机器上 也可通过 socket 或者RESTful API来进行通信。
命名空间
命名空间保证了容器之间彼此互不影响通过不同资源的命名空间实现了资源的隔离。
pid命名空间pid隔离所有容器中的进程的父进程为Docker进程不同容器中进程具有不同的命名空间。net命名空间网络隔离每个 net 命名空间有独立的网络设备、IP 地址、路由表、/proc/net目录等。ipc命名空间进程间交互方法(interprocess communication - IPC)包括信号量、消息队列和共享内存等的隔离容器的进程间交互实际上还是host上具有相同pid命名空间中的进程间交互因此需要在 IPC 资源申请时加入命名空间信息每个 IPC 资源有一个唯一的32位id。mnt命名空间类似chroot每个命名空间中的进程所看到的文件目录就被隔离开了。UTS(UNIX Time-sharing System) 命名空间允许每个容器拥有独立的 hostname 和 domainname使其在网络上可以被视作一个独立的节点而非主机上的一个进程。user命名空间每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
控制组(cgroups)
控制组(cgroups)是 Linux 内核的一个特性主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源才能避免当多个容器同时运行时的对系统资源的竞争。控制组可以提供对容器的内存、CPU、磁盘IO等资源的限制和审计管理。
联合文件系统UnionFS
联合文件系统UnionFS是一种分层、轻量级并且高性能的文件系统它支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承基于基础镜像没有父镜像可以制作各种具体的应用镜像。
Docker网络
Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备。Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡只是它不需要真正同外部网络设备通信速度要快很多。
Docker 创建一个容器的时候会执行如下操作
创建一对虚拟接口分别放到本地主机和新容器中本地主机一端桥接到默认的 docker0 或指定网桥上并具有一个唯一的名字如veth65f9容器一端放到新容器中并修改名字作为 eth0这个接口只在容器的命名空间可见从网桥可用地址段中获取一个空闲地址分配给容器的 eth0并配置默认路由到桥接网卡veth65f9。
在 docker run 的时候通过 --net 参数来指定容器的网络配置有4个可选值
--netbridge 这个是默认值 连接到默认的网桥。--nethost 告诉 Docker 不要将容器网络放到隔离的命名空间中即不要容器化容器内的网络。此时容器使用本地主机的网络它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程一样可以打开低范围的端口可以访问本地网络服务比如 Dbus还可以让容器做一些影响整个主机系统的事情比如重启主机。因此使用这个选项的时候要非常小心。 如果进一步的使用 --privilegedtrue 容器会被允许直接配置主机的网络堆栈。--netcontainer:NAME_or_ID 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中新容器进程有自己的文件系统、进程列表和资源限制但会和已存在的容器共享IP地址和端口等网络资源两者进程可以直接通过 lo 环回接口通信。--netnone 让 Docker 将新容器放到隔离的网络栈中但是不进行网络配置。之后用户可以自己进行配置。
模拟网络配置流程
首先启动一个/bin/bash容器 指定--netnone参数。
$ docker run -i -t --rm --netnone base /bin/bash
root63f36fc01b5f:/#
在本地主机查找容器的进程 id 并为它创建网络命名空间。
$ docker inspect -f {{.State.Pid}} 63f36fc01b5f
2778$ pid2778
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
检查桥接网卡的 IP 和子网掩码信息。
$ ip addr show docker0
21: docker0: ...
inet 172.17.42.1/16 scope global docker0
...
创建一对“veth pair”接口 A 和 B绑定 A 到网桥 docker0 并启用它。
$ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up
将B放到容器的网络命名空间 命名为 eth0 启动它并配置一个可用 IP 桥接网段和默认网关。
$ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0
$ sudo ip netns exec $pid ip link set eth0 up
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0
$ sudo ip netns exec $pid ip route add default via 172.17.42.1