问题描述
在使用Docker时,发现容器可以使用ifconfig命令获取主机的网络信息。但是,docker0只存在于主机上,而不是容器中。用户想知道为什么容器可以获取主机的网络信息。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
容器并不是直接访问主机的网络接口信息,而是获取了为Docker容器网络创建的桥接适配器的数据。
以下是一个示例,展示了容器和主机的网络信息:
容器的网络信息:
# docker exec -it container_name sh
/var/lib/container_name # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:02
inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1536 (1.5 KiB) TX bytes:0 (0.0 B)
主机的网络信息:
root@host:/data/mydomain.us# ifconfig
br-08d99d9f172e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::42:57ff:fe74:c49b prefixlen 64 scopeid 0x20<link>
ether 02:42:57:74:c4:9b txqueuelen 0 (Ethernet)
RX packets 150 bytes 16535 (16.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 234 bytes 21425 (21.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:82:3d:17:63 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 66.xxx.xxx.205 netmask 255.255.255.0 broadcast 66.xxx.xxx.255
请参阅Docker的网络文档,了解更多关于网络的信息:https://docs.docker.com/v17.09/engine/userguide/networking/
方案2
请注意,这个解决方案可能需要一些额外的配置和操作,并且可能会增加复杂性。
另一种方法是使用脚本或工具来控制容器的网络访问。你可以在容器启动脚本中添加一些逻辑,以限制容器对主机网络的访问。
以下是一个示例脚本,可以在容器启动后检查网络类型:
#!/bin/sh
set -e
# 检查网络接口docker0是否存在
check_network=$(ifconfig | grep docker0 || true)
# 如果网络接口docker0存在,则表示容器正在以主机模式运行,必须退出容器
if [[ ! -z "${check_network}" ]]; then
echo "[crit] Network type detected as 'Host', this will cause major issues, please stop the container and switch back to 'Bridge' mode" | ts '%Y-%m-%d %H:%M:%.S' && exit 1
fi
在上面的示例中,我们首先使用ifconfig
命令检查网络接口docker0是否存在。如果存在,则表示容器正在以主机模式运行,我们会输出一条警告信息并退出容器。
请注意,这只是一个示例脚本,你可以根据自己的需求进行修改和扩展。
正文完