আমার সন্ধানে আমি পুরানো সমাধানগুলি পেয়েছি যা ডক্সারের কাছে lxc-config পরামিতিগুলি পাস করে, কিন্তু ডকারের আরও নতুন সংস্করণগুলি আর 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
আপনার হোস্টে প্রচুর এথএক্স ডিভাইস থাকলে (খনিতে এথ0 -> এথ 5 ছিল) ইন্টারফেসের নামকরণের একটি ছোটখাটো সতর্কতা। উদাহরণস্বরূপ আপনি ধারকগুলিতে নেটিম স্পেসে এথ 1 হিসাবে E3 স্থানান্তর করুন। আপনি যখন ধারকটি থামান, কার্নেলটি ধারকটির এথ 1 ডিভাইসটিকে হোস্টে ফিরে যাওয়ার চেষ্টা করবে, তবে লক্ষ্য করুন যে ইতিমধ্যে একটি এথ 1 ডিভাইস রয়েছে। এরপরে এটি ইন্টারফেসটির নামকরণ করে নির্বিচারে কিছু; আবার খুঁজে পেতে আমাকে কিছুটা সময় নিল এই কারণে আমি /etc/udev/rules.d/70-pers depend-net.rules সম্পাদনা করেছি (আমি মনে করি এই ফাইলের নামটি সর্বাধিক জনপ্রিয় লিনাক্স ডিস্ট্রোসের কাছে সাধারণ; আমি দেবিয়ান ব্যবহার করছি) প্রশ্নের ইন্টারফেসটিকে একটি অনন্য, অনিচ্ছাকৃত নাম দেওয়ার জন্য , এবং এটি ধারক এবং হোস্ট উভয়ই ব্যবহার করুন।
যেহেতু আমরা এই কনফিগারেশনটি করার জন্য ডকার ব্যবহার করছি না, তাই মানক ডকার লাইফাইসাইকেল সরঞ্জামগুলি (যেমন ডকার রান --restart = অন-ব্যর্থতা: 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
সামান্য হ্যাকি, তবে এটি কাজ করে :)