تعيين واجهة المادية لعامل الميناء حصرا

وأود أن تشغيل اختبار شبكة عالية الأداء في حاوية عامل الميناء ، ولا تريد النفقات العامة من سد (حتى بيبيوركس لن تعمل أفيك). أود تعيين (بالإضافة إلى جهاز دوكر فيث العادي) واجهة شبكة 40 جيجابت المادية من المضيف إلى حاوية دوكر كما هو الحال في وضع "فيز" لك. هذا يجب أن يسبب واجهة المادية لتصبح غير مرئية للمضيف.

في بحثي جئت عبر الحلول القديمة التي إنفوفلد تمرير المعلمات لك-التكوين إلى عامل الميناء، ولكن الإصدارات الأحدث من عامل الميناء لا تستخدم أدوات لك أي أكثر من ذلك ، بحيث لا يمكن أن تعمل.

بعد الاقتراح هنا: 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 containerHOST_DEV=ethHOST     # Name of the ethernet device on the hostGUEST_DEV=test10gb   # Target name for the same device in the containerADDRESS_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 workmkdir -p /var/run/netnsPID=$(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 containerip 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 containerip 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 stoppedrm /var/run/netns/$PID

>تحذير بسيط على تسمية الواجهة إذا كان المضيف الخاص بك لديه الكثير من أجهزة إيثكس (الألغام كان إيث0 - إيث5). على سبيل المثال ، لنفترض أنك نقلت إيث3 إلى الحاوية كإيث1 في مساحة اسم الحاويات. عند إيقاف الحاوية ، ستحاول النواة نقل جهاز إيث 1 للحاوية مرة أخرى إلى المضيف ، ولكن لاحظ أن هناك بالفعل جهاز إيث 1. فإنه سيتم بعد ذلك إعادة تسمية واجهة إلى شيء تعسفي ؛ استغرق مني بعض الوقت للعثور عليه مرة أخرى. لهذا السبب أنا تحرير / الخ/أوديف / القواعد.د / 70-ثابت-صافي.القواعد (أعتقد أن اسم الملف هذا شائع في توزيعات لينكس الأكثر شيوعا ؛ أنا أستخدم ديبيان) لإعطاء الواجهة المعنية اسما فريدا لا لبس فيه ، واستخدامه في كل من الحاوية والمضيف.

نظرا لأننا لا نستخدم عامل الإرساء للقيام بهذا التكوين ، فإن أدوات دورة حياة عامل الإرساء القياسية (على سبيل المثال ، تشغيل عامل الإرساء-إعادة التشغيل=عند الفشل: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 INFOCONTAINER=slave-playSCRIPT="docker start -i $CONTAINER"RUNAS=rootLOGFILE=/var/log/$CONTAINER.logLOGFILE=/var/log/$CONTAINER.logHOST_DEV=test10gbGUEST_DEV=test10gbADDRESS_AND_NET=10.101.0.5/24start() {  if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); thenecho 'Service already running' >&2return 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)stopstart;;  *)echo "Usage: $0 {start|stop|restart}"esac

هاكي قليلا ، لكنه يعمل :)

pipework يمكن نقل واجهة شبكة فعلية من الافتراضي إلى مساحة اسم شبكة الحاويات:

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

لمزيد من المعلومات انظر هنا.

أنا أكتب المساعد شبكة عامل الميناء للقيام بذلك.

https://github.com/yunify/docker-plugin-hostnic

docker pull qingcloud/docker-plugin-hostnicdocker run -v /run/docker/plugins:/run/docker/plugins -v /etc/docker/hostnic:/etc/docker/hostnic --network host --privileged qingcloud/docker-plugin-hostnic docker-plugin-hostnicdocker network create -d hostnic --subnet=192.168.1.0/24 --gateway 192.168.1.1 hostnicdocker run -it --ip 192.168.1.5 --mac-address 52:54:0e:e5:00:f7 --network hostnic ubuntu:14.04 bash