docker: how to get veth bridge interface pair easily?

bridge, docker, networking

Solution

Here's a variation on the ethtool trick mentioned above, without actually using ethtool:

function veth_interface_for_container() {
  # Get the process ID for the container named ${1}:
  local pid=$(docker inspect -f '{{.State.Pid}}' "${1}")

  # Make the container's network namespace available to the ip-netns command:
  mkdir -p /var/run/netns
  ln -sf /proc/$pid/ns/net "/var/run/netns/${1}"

  # Get the interface index of the container's eth0:
  local index=$(ip netns exec "${1}" ip link show eth0 | head -n1 | sed s/:.*//)
  # Increment the index to determine the veth index, which we assume is
  # always one greater than the container's index:
  let index=index+1

  # Write the name of the veth interface to stdout:
  ip link show | grep "^${index}:" | sed "s/${index}: \(.*\):.*/\1/"

  # Clean up the netns symlink, since we don't need it anymore
  rm -f "/var/run/netns/${1}"
}

Problem

i have 2 containers by docker, and bridge like this: ``` # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef99087167cb images.docker.sae.sina.com.cn/ubuntu:latest /bin/bash -c /home/c 2 days ago Up 21 minutes 0.0.0.0:49240->22223/tcp night_leve3 c8a7b18ec20d images.docker.sae.sina.com.cn/ubuntu:latest /bin/bash -c /home/c 2 days ago Up 54 minutes 0.0.0.0:49239->22223/tcp night_leve2 #brctl show cbr0 bridge name bridge id STP enabled interfaces docker0 8000.72b675c52895 no vethRQOy1I vethjKYWka ``` How can i get which container match `veth*` ? `ef99 => vethRQOy1I or ef99 => vethjKYWka` //---------------------------------------------------------- I know it works by `ethtool`, but is there any better way?

Original source

Related problems