Docker网络详解之Host

Docker中的host模式指定是容器与主机享受相同的network namespace,在这种情况下,我们访问主机端口就能访问我们的容器。比如说我们运行tomcat容器并且用
-- network=host 来指定我们的网络模式为host,这样我们访问本机的8080端口就能访问到我们的tomcat容器。下面这段是官网对于host模式的定义:

If you use the host network driver for a container, that container’s network stack is not isolated 
from the Docker host. For instance, if you run a container which binds to port 80 and you use 
host networking, the container’s application will be available on port 80 on the host’s IP address.

The host networking driver only works on Linux hosts, and is not supported on Docker for Mac, 
Docker for Windows, or Docker EE for Windows Server.

In Docker 17.06 and higher, you can also use a host network for a swarm service, by passing --
network host to the docker container create command. In this case, control traffic (traffic related 
to managing the swarm and the service) is still sent across an overlay network, but the individual 
swarm service containers send data using the Docker daemon’s host network and ports. This 
creates some extra limitations. For instance, if a service container binds to port 80, only one 
service container can run on a given swarm node.

If your container or service publishes no ports, host networking has no effect.

这里面说明了host模式只能在linux下运行,其实我们想想也就知道,docker的网络模式通过linux下的network namespace来实现的。我们也能够在Docker Swarm中使用host模式来创建我们的container,但是这种情况下我们运行在一个端口的容器只能使用一个。如果我们的容器或者服务没有监听任何端口,那么我们的host 模式将不会生效。

对于host模式的思考:
1.host模式下是怎么占领端口的?
host模式端口占用模式是你的容器占用你主机上当前所监听的端口(官网描述为publish),比如我们都知道tomcat占用8080端口,那么当我们用host模式启动的时候,主机上的8080端口会被tomcat占用,这个时候其他的容器就不能指定我们的8080端口了,但是可以指定其他端口,所以说一台主机上可以运行多个host模式的容器,只要彼此监听的端口不一样就行。

2.host模式下使用-p或者-P会出现WARNING: Published ports are discarded when using host network mode
当你是host模式的时候,主机会自动把他上面的端口分配给容器,这个时候使用-p或者-P是无用的。但是还是可以在Dockerfile中声明EXPOSE端口,关于EXPOSE命令的详细解释接下来我会继续写篇文章。

3.host模式设计的原因
host模式设计出来就是为了性能,访问主机的端口就能访问到我们的容器,使容器直接暴露在公网下,但是这却对docker的隔离性造成了破坏,使得安全性大大降低。这种模式有利有弊,对于每个人来说看法都不一样,具体取舍看个人。

展开阅读全文

没有更多推荐了,返回首页