একচেটিয়াভাবে ডকারে শারীরিক ইন্টারফেস বরাদ্দ করুন


12

আমি একটি ডকার পাত্রে একটি উচ্চ কার্যকারিতা নেটওয়ার্ক পরীক্ষা চালাতে চাই এবং ব্রিজিংয়ের ওভারহেড চাই না (যাতে পাইপওয়ার্কগুলি আফাইক কাজ করবে না)। আমি lxc "ফিজি" মোড হিসাবে হোস্ট থেকে একটি ডকার পাত্রে একটি শারীরিক 40GbE নেটওয়ার্ক ইন্টারফেসের (সাধারণ ডকার ভেথ ডিভাইস ছাড়াও) বরাদ্দ করতে চাই। এটি শারীরিক ইন্টারফেস হোস্টের জন্য অদৃশ্য হয়ে উঠতে পারে।

উত্তর:


4

pipework একটি শারীরিক নেটওয়ার্ক ইন্টারফেসটি ডিফল্ট থেকে ধারক নেটওয়ার্ক নেমস্পেসে স্থানান্তর করতে পারে:

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

আরও তথ্যের জন্য এখানে দেখুন


1
আমি এই উত্তরটি গ্রহণ করেছি কারণ এটি সহজ বলে মনে হচ্ছে, তবে আমি নিজেই এটি চেষ্টা করে দেখিনি (পাইপওয়ার্কগুলি এই কার্যকারিতাটি বৃদ্ধির আগে আমি যে দীর্ঘ উত্তরটি লিখেছিলাম তা ব্যবহার করেছি)
NeilenMarais

7

আমার সন্ধানে আমি পুরানো সমাধানগুলি পেয়েছি যা ডক্সারের কাছে 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

সামান্য হ্যাকি, তবে এটি কাজ করে :)


আপনার নেটওয়ার্ক ইন্টারফেসের নামগুলি কেন শুরু হয় eth? ডেবিয়ান কি নিয়মিত নেটওয়ার্ক ডিভাইসের নাম করে না?
মাইকেল হ্যাম্পটন

যে কারও জন্য যারা ভাবছিলেন যে কেন সিমলিংক /var/run/netns/$PIDপ্রয়োজন: ip netns exec $PID ...কমান্ডগুলি কাজ করার জন্য আপনার এটি দরকার ।
ডন লি

2

এটি করার জন্য আমি একটি ডকার নেটওয়ার্ক প্লাগইন লিখি।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.