许多人已经知道这个,但Linux“容器”并不真正存在。Linux中没有叫“容器”的东西。容器,因为每个人都知道它们是使用称为命名空间和cgroups的Linux内核的两个功能执行的正常进程。命名空间允许您为隐藏这些名称空间之外的所有内容的进程提供“视图”,从而使其自己的环境运行。这使得进程无法看到或干扰其他进程:
Namespaces include:
- Hostname
- Process IDs
- File System
- Network interfaces
- Inter-Process Communication (IPC)
虽然我在上面说的那个命名空间中运行的进程无法干扰那些并不真实的进程。一个过程可以使用它运行的物理机上的所有资源,从而删除了资源的其他进程。为了限制它,Linux有一个名为cgroups的功能。进程可以在CGroup中运行,如命名空间,但cgroup限制了过程可以使用的资源。这些资源包括CPU,RAM,块I / O,网络I / O等CPU通常受毫在千核(核心1000)的限制,并且内存受RAM的字节限制。过程本身可以像正常一样运行,但它只能使用CGroup允许的CPU,并且如果超过CGroup上设置的内存限制,则会获取内存错误。
有很多关于学习更多关于名称空间和cgroups的资源,只要搜索谷歌就可以了,所以我建议你去看看。这里有几个很好的例子
- What even is a container: namespaces and cgroups
- Cgroups, namespaces, and beyond: what are containers made from?
这里我想指出的是,cgroups和每个命名空间类型是独立的特性。上面列出的名称空间的一些子集可以使用,也可以完全不使用。你可以只使用cgroups或者两者的其他组合(好吧,你仍然在使用命名空间,而cgroups只是根空间)。命名空间和cgroups也用于进程组。在一个名称空间中运行多个进程。这样它们就可以看到彼此,并相互交流。或者你可以在一个cgroup中运行它们。这样,这些过程将被限制在一个特定的范围内
Combinations of Combinations
当你正常使用Docker运行一个容器时,Docker会为每个容器创建命名空间和cgroups,这样它们就会一一映射。这就是开发人员通常对容器的看法。
容器本质上是独立的筒仓,除了它们可能有一个映射到主机的卷或端口,以便它们可以进行通信之外。然而,通过一些额外的命令行参数,您可以使用单个名称空间组合Docker容器。首先让我们为nginx创建一个容器。
$ cat <<EOF >> nginx.conf> error_log stderr;> events { worker_connections 1024; }> http {> access_log /dev/stdout combined;> server {> listen 80 default_server;> server_name example.com www.example.com;> location / {> proxy_pass http://127.0.0.1:2368;> }> }> }> EOF$ docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf -p 8080:80 nginx
接下来,我们将运行一个幽灵运行在它的容器。但这一次,我们将添加一些额外的参数,让它加入nginx容器的名称空间。
docker run -d --name ghost --net=container:nginx --ipc=container:nginx --pid=container:nginx ghost
现在我们的nginx容器可以直接在localhost上的请求到我们的鬼容器。如果您访问,您应该能够看到通过nginx代理运行的ghost。这些命令在一组名称空间中创建一组运行的容器。这些命名空间允许Docker容器彼此发现和通信.http:// localhost:8080 /
References:
