Assegnare esclusivamente l'interfaccia fisica alla finestra mobile


12

Vorrei eseguire un test di rete ad alte prestazioni in un contenitore docker e non voglio il sovraccarico del ponte (quindi le tubature non funzioneranno con AFAIK). Vorrei assegnare (oltre al normale dispositivo docker veth) un'interfaccia di rete fisica da 40 GbE dall'host a un contenitore docker come nella modalità lxc "phys". Ciò dovrebbe rendere l'interfaccia fisica invisibile all'host.

Risposte:


4

pipework può spostare un'interfaccia di rete fisica dal default allo spazio dei nomi della rete di container:

    $ sudo pipework --direct-phys eth1 $CONTAINERID 192.168.1.2/24

Per maggiori informazioni vedi qui .


1
Ho accettato questa risposta perché mi sembra semplice, ma non l'ho provata da sola (ho usato la lunga risposta che ho scritto prima che le pipeworks sviluppassero questa funzionalità)
NeilenMarais,

7

Nella mia ricerca mi sono imbattuto in vecchie soluzioni che hanno invaso il passaggio dei parametri lxc-config alla finestra mobile, ma le versioni più recenti della finestra mobile non utilizzano più gli strumenti lxc, quindi non possono funzionare.

Seguendo il suggerimento qui: https://groups.google.com/d/msg/docker-user/pL8wlmiuAEU/QfcoFcKI3kgJ è stata trovata una soluzione. Non ho cercato di modificare lo script della pipework come menzionato sopra, invece usando direttamente i comandi richiesti. Vedi anche post di blog successivo: http://jason.digitalinertia.net/exposing-docker-containers-with-sr-iov/ .

I seguenti comandi dello strumento dello spazio dei nomi di rete di basso livello (cioè non specifici per la finestra mobile) possono essere utilizzati per trasferire un'interfaccia dall'host a un contenitore finestra mobile:

CONTAINER=slave-play # Name of the docker container
HOST_DEV=ethHOST     # Name of the ethernet device on the host
GUEST_DEV=test10gb   # Target name for the same device in the container
ADDRESS_AND_NET=10.101.0.5/24

# Next three lines hooks up the docker container's network namespace 
# such that the ip netns commands below will work
mkdir -p /var/run/netns
PID=$(docker inspect -f '{{.State.Pid}}' $CONTAINER)
ln -s /proc/$PID/ns/net /var/run/netns/$PID

# Move the ethernet device into the container. Leave out 
# the 'name $GUEST_DEV' bit to use an automatically assigned name in 
# the container
ip link set $HOST_DEV netns $PID name $GUEST_DEV

# Enter the container network namespace ('ip netns exec $PID...') 
# and configure the network device in the container
ip netns exec $PID ip addr add $ADDRESS_AND_NET dev $GUEST_DEV

# and bring it up.
ip netns exec $PID ip link set $GUEST_DEV up

# Delete netns link to prevent stale namespaces when the docker
# container is stopped
rm /var/run/netns/$PID

Un piccolo avvertimento sulla denominazione dell'interfaccia se il tuo host ha molti dispositivi ethX (il mio aveva eth0 -> eth5). Ad esempio, dire che si sposta eth3 nel contenitore come eth1 nello spazio dei nomi dei contenitori. Quando si arresta il contenitore, il kernel tenterà di spostare il dispositivo eth1 del contenitore sull'host, ma si noti che esiste già un dispositivo eth1. Rinominerà quindi l'interfaccia in qualcosa di arbitrario; mi ci è voluto un po 'per ritrovarlo. Per questo motivo ho modificato /etc/udev/rules.d/70-persistent-net.rules (penso che questo nome file sia comune alle distribuzioni Linux più popolari; sto usando Debian) per dare all'interfaccia in questione un nome univoco e inconfondibile e utilizzalo sia nel contenitore che nell'host.

Poiché non stiamo utilizzando la finestra mobile per eseguire questa configurazione, non è possibile utilizzare gli strumenti del ciclo di vita della finestra mobile standard (ad es. Finestra mobile in esecuzione --restart = on-failure: 10 ...). Il computer host in questione esegue Debian Wheezy, quindi ho scritto il seguente script init:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          slave-play
# Required-Start:    $local_fs $network $named $time $syslog $docker
# Required-Stop:     $local_fs $network $named $time $syslog $docker
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       some slavishness
### END INIT INFO

CONTAINER=slave-play
SCRIPT="docker start -i $CONTAINER"
RUNAS=root

LOGFILE=/var/log/$CONTAINER.log
LOGFILE=/var/log/$CONTAINER.log

HOST_DEV=test10gb
GUEST_DEV=test10gb
ADDRESS_AND_NET=10.101.0.5/24


start() {
  if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then
echo 'Service already running' >&2
return 1
  fi
  echo 'Starting service…' >&2
  local CMD="$SCRIPT &> \"$LOGFILE\" &"
  su -c "$CMD" $RUNAS 
  sleep 0.5 # Nasty hack so that docker container is already running before we do the rest
  mkdir -p /var/run/netns
  PID=$(docker inspect -f '{{.State.Pid}}' $CONTAINER)
  ln -s /proc/$PID/ns/net /var/run/netns/$PID
  ip link set $HOST_DEV netns $PID name $GUEST_DEV
  ip netns exec $PID ip addr add $ADDRESS_AND_NET dev $GUEST_DEV
  ip netns exec $PID ip link set $GUEST_DEV up
  rm /var/run/netns/$PID
  echo 'Service started' >&2
}

stop() {
  echo "Stopping docker container $CONTAINER" >&2
  docker stop $CONTAINER
  echo "docker container $CONTAINER stopped" >&2
}


case "$1" in
  start)
start
;;
  stop)
stop
;;
  restart)
stop
start
;;
  *)
echo "Usage: $0 {start|stop|restart}"
esac

Leggermente confuso, ma funziona :)


Perché iniziano i nomi dell'interfaccia di rete eth? Debian non fa nomi di dispositivi di rete coerenti?
Michael Hampton

Per chiunque si chiedesse perché /var/run/netns/$PIDè necessario il collegamento simbolico : è necessario che i ip netns exec $PID ...comandi funzionino.
Donn Lee,

2

Per fare ciò scrivo un plug-in di rete docker.

https://github.com/yunify/docker-plugin-hostnic

docker pull qingcloud/docker-plugin-hostnic
docker run -v /run/docker/plugins:/run/docker/plugins -v /etc/docker/hostnic:/etc/docker/hostnic --network host --privileged qingcloud/docker-plugin-hostnic docker-plugin-hostnic
docker network create -d hostnic --subnet=192.168.1.0/24 --gateway 192.168.1.1 hostnic
docker run -it --ip 192.168.1.5 --mac-address 52:54:0e:e5:00:f7 --network hostnic ubuntu:14.04 bash
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.