在Docker中,如果我将networking设置为主机,是否需要发布端口?

我今天遇到了一个问题,我有一个Dockerfile EXPOSEs几个端口,我想用--net=host标志运行它。

但是,所有与该集装箱应该在监听的港口的连接都被拒绝了。

运行docker inspect容器我注意到这一点:

  "Ports": { "8000/tcp": {}, } 

越来越激怒,我一起删除了--net标志,并去了默认的bridgenetworking。 惊喜的作品!

  "Ports": { "8000/tcp": null, } 

除了现在它有这个奇怪的null设置。 这里有什么区别? 此外,我正在试图与另一个虚拟机通信的虚拟机内部运行。 可能有一百万个原因,这是行不通的。

当networking模式是host时是否需要发布选项?

回答

不,主机networking堆栈由容器直接使用:

'host': use the Docker host network stack. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.

certificate

netcat启动容器:

 user@host:~$ docker run -it --rm --net host nc:1.10-41 root@container:/# nc -l -p 9999 

回到主机:

 user@host:~$ nc 127.0.0.1 9999 Sending a message for test <enter> 

该消息将从容器中执行的netcat命令显示。

监控

主机的netstat将显示已build立的连接:

 user@host:~$ netstat latuep |grep 9999 tcp 0 0 localhost:38600 localhost:9999 ESTABLISHED tcp 0 0 localhost:9999 localhost:38600 ESTABLISHED 

至于你的问题

错误可能来自另一个configuration/networking环境。 虚拟机能互相ping通吗? 他们共享相同的局域网吗? 防火墙是否设置?