如何在Docker容器内获取宿主机eth0网卡的IP地址?
在Alpine 3.18容器内获取宿主机eth0网卡IP的方法
问题背景
需求:在基于
alpine:3.18的Docker容器内,获取宿主机eth0网卡的IP地址。
容器内执行ifconfig的输出:/ # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04 inet addr:172.17.0.4 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:65535 Metric:1 RX packets:49 errors:0 dropped:0 overruns:0 frame:0 TX packets:54 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:6433 (6.2 KiB) TX bytes:5904 (5.7 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)宿主机eth0网卡信息:
eth0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM> ether 9c:3e:53:92:e9:86 inet6 fe80::fb:c60b:fa61:92bd%en0 prefixlen 64 secured scopeid 0xc inet 192.168.1.63 netmask 0xffffff00 broadcast 192.168.1.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active需实现容器内命令行获取该IP,同时确认是否可通过挂载Docker套接字(
-v /var/run/docker.sock:/var/run/docker.sock)实现。
实现方法
方法一:挂载Docker套接字实现
挂载Docker套接字后,容器内可直接调用宿主机的Docker命令获取信息:
- 启动容器并挂载套接字:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock alpine:3.18 sh - 安装Docker CLI工具(Alpine默认未预装):
apk add --no-cache docker-cli - 获取宿主机eth0 IP:
方式一:通过临时特权容器直接查询宿主机网卡信息:
方式二:通过当前容器ID查询宿主机网关,再映射到物理网卡IP(适用于默认Docker网桥配置):docker run --rm --net=host alpine:3.18 ifconfig eth0 | grep -oP 'inet addr:\K[\d.]+'# 获取当前容器ID CONTAINER_ID=$(cat /proc/self/cgroup | grep -oP 'docker/\K[^/]+' | head -n1) # 获取宿主机Docker网关 GATEWAY=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' $CONTAINER_ID) # 通过ARP表获取网关对应的物理IP(即宿主机eth0 IP,单网卡场景有效) arp -a $GATEWAY | awk '{print $2}' | sed 's/[()]//g'
方法二:无需挂载Docker套接字的命令行方法
如果不想暴露Docker套接字,可通过以下两种方式:
- 利用容器网关与ARP表查询:
# 安装iproute2工具(Alpine默认无) apk add --no-cache iproute2 # 获取默认网关(通常是宿主机网桥IP) GATEWAY=$(ip route show default | awk '{print $3}') # 通过ARP表获取网关对应的物理IP arp -a $GATEWAY | awk '{print $2}' | sed 's/[()]//g' - 启动容器时传递环境变量:
在宿主机启动容器时,直接将eth0 IP传入容器环境变量:# 宿主机执行:传递eth0 IP到容器 docker run -it -e HOST_ETH0_IP=$(ifconfig eth0 | grep -oP 'inet addr:\K[\d.]+') alpine:3.18 sh # 容器内直接读取: echo $HOST_ETH0_IP
内容的提问来源于stack exchange,提问作者Exdet
相关产品推荐
相关产品推荐

