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 :)