1.docker的host网络模式简介
host模式下,容器将不会虚拟出自己的网卡、配置IP等,而是使用宿主机的IP和端口;也就说,宿主机的就是我的。
2. 以host网络模式创建容器
2.1 创建容器
我们仍然以tomcat这个镜像来说明一下。我们以host模式启动一个容器t3:
bash
docker run -d --network host -p 8081:8080 --name t3 donkey/tomcat8:1.0.0
2.2 创建容器过程中的问题
这里我们看到两个问题:
1.容器启动完成后,打印的信息中有个警告信息:WARNING: Published ports are discarded when using host network mode
2.docker ps查看容器,我们指定了端口映射,但是显示出来的信息却没有。
2.3 问题的分析与解释
为了解释这个问题,我们再启动一个容器t4,t4我们仍然使用host网络模式,但是我们不指定端口映射:
bash
docker run -d --network host --name t4 donkey/tomcat8:1.0.0
这时我们发现容器创建过程中并没有出现警告信息。为什么呢?我们看host模式下,它不仅ip都使用宿主机,就连端口也使用宿主机的的。所以就不需要再设置端口映射了,我们容器暴露的端口是什么,那么就是什么端口。这里我们t3容器暴露的端口是8080,所以我们直接就能用http://127.0.0.1:8080访问。
那现在又有一个问题,我们启动了t3和t4两个容器,由于来自同一个镜像,那么容器暴露的端口就都是8080,是一样的,这怎么办呢?
我们看下容器t4的日志:
bash
docker logs t4
非常不幸,tomcat服务启动失败了,端口被占用了。
3. 以host网络模式下,容器和宿主机网络情况
3.1 大胆猜测
我认为宿主机和容器的网络情况是一模一样的。
3.2 宿主机的网络情况
没有看到之前成对出现的网卡,只有一个docker0和宿主机本身的网络信息。
3.3 容器的网络情况
bash
ker exec -it t4 /bin/bash
3.4 结论
不出所料,宿主机和容器的网路情况是一样的。