अपनी खोज में मैं पुराने समाधानों के पार आया, जो कि डॉकिंग के लिए lxc-config पैरामीटर्स को उत्तीर्ण करते हैं, लेकिन docker के नए संस्करण किसी भी अधिक lxc टूल का उपयोग नहीं करते हैं, ताकि काम न कर सकें।
सुझाव के बाद यहां: https://groups.google.com/d/msg/docker-user/pL8wlmiuAEU/QfcoFcKI3kgJ एक समाधान पाया गया। मैंने ऊपर बताए अनुसार पाइपवर्क स्क्रिप्ट को संशोधित करने की आवश्यकता नहीं देखी, इसके बजाय सीधे आवश्यक आदेशों का उपयोग कर रहा हूं। बाद की ब्लॉग पोस्ट भी देखें: http://jason.digitalinertia.net/exposing-docker-containers-with-sr-iov/ ।
निम्न निम्न-स्तर (यानी विशिष्ट नहीं docker विशिष्ट) नेटवर्क नेमस्पेस टूल कमांड का उपयोग होस्ट से डॉकटर कंटेनर में इंटरफ़ेस को स्थानांतरित करने के लिए किया जा सकता है:
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
यदि आपके होस्ट में बहुत सारे ईएक्सएक्स डिवाइस हैं, तो नामकरण पर एक मामूली चेतावनी। (मेरा eth0 -> eth5) था। उदाहरण के लिए, आप कंटेनर में eth3 को eth1 नाम के कंटेनर में स्थानांतरित करते हैं। जब आप कंटेनर को रोकते हैं, तो कर्नेल कंटेनर के एथ 1 डिवाइस को होस्ट में वापस ले जाने की कोशिश करेगा, लेकिन ध्यान दें कि पहले से ही एथ 1 डिवाइस है। यह तब मनमाने ढंग से कुछ के लिए इंटरफ़ेस का नाम बदल देगा; मुझे फिर से खोजने में थोड़ा समय लगा। इस कारण से मैंने संपादित किया /etc/udev/rules.d/70-persistent-net.rules (मुझे लगता है कि यह फ़ाइलनाम सबसे लोकप्रिय लिनक्स डिस्ट्रोस के लिए आम है; मैं देबिन का उपयोग कर रहा हूं) प्रश्न को एक अनूठा, अचूक नाम देने के लिए इंटरफ़ेस देना। , और कंटेनर में और मेजबान पर दोनों का उपयोग करें।
चूँकि हम इस कॉन्फ़िगरेशन को करने के लिए docker का उपयोग नहीं कर रहे हैं, मानक docker जीवनचक्र उपकरण (जैसे docker run --restart = on-विफलता: 10 ...) का उपयोग नहीं किया जा सकता है। प्रश्न में होस्ट मशीन डेबियन व्हीज़ी चलाता है, इसलिए मैंने निम्नलिखित इनिट स्क्रिप्ट लिखी है:
#!/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
थोड़ा हैकी, लेकिन यह काम करता है :)