In order to troubleshoot a network issue, we will need to figure out the veth end points connecting a container to its host. There are multiple ways of going about this problem, I will show 2 simple ways and point out to a third.
# Technique-1: Quick & Simple
Get the interface details inside the container:
/ # ip addr show eth0
9: eth0@if10: mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
The output is telling us that, the veth has two end points. One end point is called eth0@if10 which is assigned to the container and on the host the other end point will be named as vethxxx@if9.
Lets check the host to confirm this.
root@botserver1:~# ip a | grep veth
10: vetha708f89@if9: mtu 1500 qdisc noqueue master docker0 state UP group default
Cool. The host has a vetha708f89@if9 which is saying its mapped to if10 interface on the container.
# Technique-2:
This technique explores the under-hood mechanism followed by Technique-1. When we go into details, the
On the container, get the iflink value by executing:
On the host, get the ifindex of the vethxxx by executing:
root@botserver1:~# grep -l 10 /sys/class/net/veth*/ifindex
/sys/class/net/vetha708f89/ifindex
Great. We have identified the veth interface that is connected to the container.
The same in script form:
# Technique-3
In case, the container does not have cat or any necessary utilities you can try out this script @ https://github.com/micahculpepper/dockerveth/blob/master/dockerveth.sh
References:
* https://superuser.com/questions/1183454/finding-out-the-veth-interface-of-a-docker-container
# Technique-1: Quick & Simple
Get the interface details inside the container:
/ # ip addr show eth0
9: eth0@if10:
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
The output is telling us that, the veth has two end points. One end point is called eth0@if10 which is assigned to the container and on the host the other end point will be named as vethxxx@if9.
Lets check the host to confirm this.
root@botserver1:~# ip a | grep veth
10: vetha708f89@if9:
Cool. The host has a vetha708f89@if9 which is saying its mapped to if10 interface on the container.
# Technique-2:
This technique explores the under-hood mechanism followed by Technique-1. When we go into details, the
iflink of the container is the same as the ifindex of the vethxxx. So by extracting these values we can establish the link between the container and host's interfaces.On the container, get the iflink value by executing:
/ # cat /sys/class/net/eth0/iflink (Note: eth0 is the interface we are interested in)
10On the host, get the ifindex of the vethxxx by executing:
root@botserver1:~# grep -l 10 /sys/class/net/veth*/ifindex
/sys/class/net/vetha708f89/ifindex
Great. We have identified the veth interface that is connected to the container.
The same in script form:
#!/bin/bash
for container in $(docker ps -q); do
iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth0/iflink'`
iflink=`echo $iflink|tr -d '\r'`
veth=`grep -l $iflink /sys/class/net/veth*/ifindex`
veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'`
echo $container:$veth
done
# Technique-3
In case, the container does not have cat or any necessary utilities you can try out this script @ https://github.com/micahculpepper/dockerveth/blob/master/dockerveth.sh
References:
* https://superuser.com/questions/1183454/finding-out-the-veth-interface-of-a-docker-container
Comments