容器如何使用ifconfig获取主机信息

47次阅读
没有评论

问题描述

在使用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是否存在。如果存在,则表示容器正在以主机模式运行,我们会输出一条警告信息并退出容器。
请注意,这只是一个示例脚本,你可以根据自己的需求进行修改和扩展。

正文完