답변:
pipework
물리적 네트워크 인터페이스를 기본값에서 컨테이너 네트워크 네임 스페이스로 이동할 수 있습니다.
$ sudo pipework --direct-phys eth1 $CONTAINERID 192.168.1.2/24
내 검색에서 lxc-config 매개 변수를 docker에 전달하는 오래된 솔루션을 찾았지만 최신 버전의 docker는 더 이상 lxc 도구를 사용하지 않으므로 작동하지 않습니다.
제안에 따라 https://groups.google.com/d/msg/docker-user/pL8wlmiuAEU/QfcoFcKI3kgJ 해결책을 찾았습니다. 위에서 언급 한 것처럼 파이프 스크립트를 수정하는 대신 필요한 명령을 직접 사용하지 않았습니다. 다음 블로그 게시물을 참조하십시오 : http://jason.digitalinertia.net/exposing-docker-containers-with-sr-iov/ .
호스트에서 도커 컨테이너로 인터페이스를 전송하는 데 다음과 같은 저수준 (즉,도 커별이 아닌) 네트워크 네임 스페이스 도구 명령을 사용할 수 있습니다.
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
호스트에 많은 ethX 장치가있는 경우 인터페이스 이름에 약간의 경고가 있습니다 (mine은 eth0-> eth5). 예를 들어 컨테이너 네임 스페이스에서 eth3을 컨테이너로 eth1로 이동한다고 가정하십시오. 컨테이너를 중지하면 커널은 컨테이너의 eth1 장치를 다시 호스트로 이동하려고 시도하지만 이미 eth1 장치가 있음을 알 수 있습니다. 그런 다음 인터페이스 이름을 임의의 이름으로 바꿉니다. 다시 찾기 위해 시간이 걸렸습니다. 이런 이유로 나는 /etc/udev/rules.d/70-persistent-net.rules (이 파일 이름은 가장 인기있는 Linux 배포판에서 일반적이라고 생각합니다; 데비안을 사용하고 있습니다)를 수정하여 문제의 인터페이스를 고유하고 확실한 이름으로 지정했습니다. 컨테이너와 호스트 모두에서 사용하십시오.
Docker를 사용하여이 구성을 수행하지 않기 때문에 표준 docker 라이프 사이클 도구 (예 : docker run --restart = on-failure : 10 ...)를 사용할 수 없습니다. 문제의 호스트 시스템은 데비안 Wheezy를 실행하므로 다음 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
약간 해 키지 만 작동합니다 :)
eth
합니까? 데비안은 일관된 네트워크 장치 이름을 사용하지 않습니까?
/var/run/netns/$PID
가 왜 필요한지 궁금해하는 다른 사람들을 위해 : ip netns exec $PID ...
명령이 작동 하기 위해 필요합니다 .
이를 위해 도커 네트워크 플러그인을 작성합니다.
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