摘要:地址給一個簡單的例子來說下,比如,我要為我創建的使用一個我指定的分析下,第一行,創建容器,注意其中的標示,不用自帶的分配模式。第二行,我為這個容器分配,掩碼位,對應的為,并將這個添加到上。待加入到容器中。
pipework介紹
docker 使用中,網絡部分是其中最重要的一環,對docker容器進行網絡設置,官方提供了 fannel ,同時也可以借助高大上的ovs來搞,但是這里也有一個小巧的工具 pipework,可以針對單個docker容器實現簡單的網絡設置,雖然不比上述兩者全面,但是小、簡是pipework的優勢,個人非常喜歡這個工具。
pipework 地址:https://github.com/jpetazzo/pipework
給一個簡單的例子來說下,比如,我要為我創建的docker使用一個我指定的ip:
$did=$(docker run -it -d --net=none baseimage:v1) pipework br0 $did 172.30.36.100/16@172.30.0.254
分析下,第一行,創建docker容器,注意其中的 --net=none 標示,不用自帶的net分配模式。
第二行,我為這個容器分配ip:172.30.36.100,掩碼16位,對應的gateway為:172.30.0.254,并將這個ip添加到bridge br0上。
在容器中查看:
~# docker exec $did ifconfig ~# eth1 Link encap:Ethernet HWaddr CA:81:40:85:5E:EA inet addr:172.30.36.100 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::c881:40ff:fe85:5eea/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:118503937 errors:0 dropped:1545004 overruns:0 frame:0 TX packets:389952 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:9431032966 (8.7 GiB) TX bytes:70378592 (67.1 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:345910 errors:0 dropped:0 overruns:0 frame:0 TX packets:345910 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:42510919 (40.5 MiB) TX bytes:42510919 (40.5 MiB)
~# docker exec $did route -n ~# Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.30.0.254 0.0.0.0 UG 0 0 0 eth1 172.30.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
ok,下面我們來看下,它這條命令究竟干了什么。
pipework流程代碼解析首先我先創建一個 net=none的容器:
docker run -it -d --net=none baseimage:v1
得到containerid : cdb492d88f1e
接下來進行操作
pipework br0 cdb492d88f1e 172.30.36.200/16@172.30.0.254
第一步,必然是先獲取對應的變量值,在這里:
IFNAME=br0
GUESTNAME=cdb492d88f1e
IPADDR=172.30.36.100/16@172.30.0.254
之后判斷br0的類型:
if [ -d "/sys/class/net/$IFNAME" ] then if [ -d "/sys/class/net/$IFNAME/bridge" ]; then IFTYPE=bridge BRTYPE=linux fi fi
這時,IFTYPE=bridge,BRTYPE=linux
第二步,找到這個guest,目前只支持LXC container, 先找到cgroup地址:
while read _ mnt fstype options _; do [ "$fstype" != "cgroup" ] && continue echo "$options" | grep -qw devices || continue CGROUPMNT=$mnt done < /proc/mounts
此時, CGROUPMNT=/sys/fs/cgroup/devices (筆者使用的是centos7 x86_64,可能因人而異)
之后,從docker中獲取對應的pid:
DOCKERPID=$(docker inspect --format="{{ .State.Pid }}" "$GUESTNAME")
此時, DOCKERPID=21927(因人而異),即 所對應docker容器中的init進程在宿主機上對應的pid;
分解 gateway:
GATEWAY="${IPADDR#*@}" GATEWAY="${GATEWAY%%@*}" IPADDR="${IPADDR%%@*}"
此時,GATEWAY=172.30.0.254, IPADDR=172.30.36.100/16
第三步,預操作結束,開始實際操作。
首先,添加net namespace,可參考文章 "linux network namespace 學習 "
因為ip netns list直接讀取/var/run/netns中的內容,于是
rm -f "/var/run/netns/$DOCKERPID" ln -s "/proc/$DOCKERPID/ns/net" "/var/run/netns/$DOCKERPID" #將網絡命名空間文件軟鏈接到/var/run/netns,以便ip netns能夠讀取
之后創建一個veth pair
[ "$IFTYPE" = bridge ] && { LOCAL_IFNAME="v${CONTAINER_IFNAME}pl${NSPID}" GUEST_IFNAME="v${CONTAINER_IFNAME}pg${NSPID}" # Does the link already exist? if ip link show "$LOCAL_IFNAME" >/dev/null 2>&1; then # link exists, is it in use? if ip link show "$LOCAL_IFNAME" up | grep -q "UP"; then echo "Link $LOCAL_IFNAME exists and is up" exit 1 fi # delete the link so we can re-add it afterwards ip link del "$LOCAL_IFNAME" fi ip link add name "$LOCAL_IFNAME" mtu "$MTU" type veth peer name "$GUEST_IFNAME" mtu "$MTU" (ip link set "$LOCAL_IFNAME" master "$IFNAME" > /dev/null 2>&1) || (brctl addif "$IFNAME" "$LOCAL_IFNAME") ip link set "$LOCAL_IFNAME" up }
在這里,創建了一對veth pair ,LOCAL_IFNAME=veth1pl24305, GUEST_IFNAME=veth1pg24305
LOCAL_IFNAME 已和本地br0相綁定。
GUEST_IFNAME 待加入到容器中。
然后,將GUEST_IFNAME添加入docker 容器中:
ip link set "$GUEST_IFNAME" netns "$DOCKERPID" ip netns exec "$DOCKERPID" ip link set "$GUEST_IFNAME" name "$CONTAINER_IFNAME"
這樣,容器內就添加了一個veth網卡和宿主機做了關聯,但是現在在容器內部還看不見他,最后執行:
ip netns exec "$DOCKERPID" ip addr add "$IPADDR" dev "$CONTAINER_IFNAME" [ "$GATEWAY" ] && { ip netns exec "$DOCKERPID" ip route delete default >/dev/null 2>&1 && true } ip netns exec "$DOCKERPID" ip link set "$CONTAINER_IFNAME" up [ "$GATEWAY" ] && { ip netns exec "$DOCKERPID" ip route get "$GATEWAY" >/dev/null 2>&1 || ip netns exec "$DOCKERPID" ip route add "$GATEWAY/32" dev "$CONTAINER_IFNAME" ip netns exec "$DOCKERPID" ip route replace default via "$GATEWAY" }
OK,讓我來查看下:
~# docker exec 17e5e58553ae ifconfig ~# eth1 Link encap:Ethernet HWaddr 2A:E8:48:5C:77:9F inet addr:172.30.36.200 Bcast:0.0.0.0 Mask:255.255.255.255 inet6 addr: fe80::28e8:48ff:fe5c:779f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:960 (960.0 b) TX bytes:960 (960.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:960 (960.0 b) TX bytes:960 (960.0 b)
搞定! 最后來個清理:
rm -f "/var/run/netns/$DOCKERPID"
Done
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26499.html
摘要:干的具體的事是容器的虛擬網卡設備劃分處理的原理也非常簡單,包進入到時打上,發出去時去掉,發出去的端口與包的不匹配時不處理,這便實現了二層隔離。 初始化環境 升級內核: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-r...
摘要:默認指定了接口的地址和子網掩碼,讓主機和容器之間可以通過網橋相互通信。解決方法是創建一對接口,分別放到兩個容器中,配置成點對點鏈路。點到點鏈路不需要子網和子網掩碼。 容器訪問控制 檢查本地系統的轉發支持 sysctl net.ipv4.ip_forward sysctl -w net.ipv4.ip_forward=1 # 手動打開 如果在啟動Docker服務的時候設定--ip-fo...
摘要:大家好今天我分享的主題與游戲行業相關,為大家介紹的是在騰訊游戲中的應用實踐。隨著技術的興起,我們開始調研在游戲容器化方面的應用。也就是說,將不同游戲業務部署到同一臺母機,采用綁定核的方式。在母機上架部署時,創建設備和設備并將它們進行關聯。 今天小數的推送內容來自騰訊互娛高級工程師黃惠波,讓我們一起來看看吧~~~ 黃惠波,騰訊互娛高級工程師目前主要負責游戲計算資源容器化平臺的研發工作,包...
閱讀 1552·2021-11-17 09:33
閱讀 1100·2021-11-12 10:36
閱讀 2414·2019-08-30 15:54
閱讀 2441·2019-08-30 13:14
閱讀 2914·2019-08-26 14:05
閱讀 3289·2019-08-26 11:32
閱讀 3001·2019-08-26 10:09
閱讀 2995·2019-08-26 10:09