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)
10
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:
#!/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