2019獨角獸企業重金招聘Python工程師標準>>>
要點:
1.首先需要在宿主機上虛擬出來一個真實可用橋接網卡比如br0
2.docker啟動的時候默認使用br0進行橋接網絡
3.創建docker容器的時候使用--net=none模式
4.手動為每個創建的容器生成靜態ip。但是ip每次在重啟容器的時候就會失效
這樣的方式其實也是必須自己維護一個ip資源池,不然的話可能ip有問題就會導致不能訪問
其實還是利用了docker橋接網絡的模式,在宿主機創建一對虛擬網卡,然后將一塊橋接到本地網橋上,經另外一塊網卡通過容器的命名空間綁定到該容器上,然后對容器 命名空間中的網卡進行設置ip。
理解了netns相應的原理之后可以進行模擬實踐:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jdk6-tomcat6-sshd-new latest ee3e2b60058d 4 days ago 970.3 MB創建一個無網絡環境的容器sshd-test,該容器創建好后默認只會有一個lo回環網口。
# docker run -itd --name sshd-test -h testssh --net=none jdk6-tomcat6-sshd-new
3ceb61136590f1362be67f1911591d0b3ca41657c6b33f45982b0df4489f5f73獲取該容器的PID為13157,后面會用到
# docker inspect -f "{{.State.Pid}}" 3ceb61136590f1362be67f1911591d0b3ca41657c6
13157添加一對虛擬網卡,分別為veth_3ceb6和eth0
# ip link add veth_3ceb6 type veth peer name eth0
將虛擬網卡veth_3ceb6橋接到br0上
# brctl addif br0 veth_3ceb6
激活veth_3ceb6網卡,并容器內部的網卡eth0綁定到該容器的網絡命名空間內
# ip link set veth_3ceb6 up
# ip link set eth0 netns 13157
將該容器的網絡命名空間暴露出來
# mkdir -p /var/run/netns
# ln -s /proc/13157/ns/net /var/run/netns/13157 此時查看該容器就會發現已經多了一塊網卡eth0@if850
# docker exec sshd-test ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
849: eth0@if850: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000link/ether 46:0a:e8:5b:ac:c0 brd ff:ff:ff:ff:ff:ff查看網絡狀況,新加的網卡名稱為eth0
# docker exec sshd-test ifconfig -a
eth0 Link encap:Ethernet HWaddr 46:0A:E8:5B:AC:C0 BROADCAST MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)通過netns激活該容器內部的eth0網卡,并添加網絡信息
# ip netns exec 13157 ip link set dev eth0 name eth0
# ip netns exec 13157 ip link set eth0 up
# ip netns exec 13157 ip addr add 10.0.0.2/23 dev eth0
# ip netns exec 13157 ip route add default via 10.0.0.254
完成最后的網絡信息的添加后,就可以實現給該容器附加一個獨立vlan中的網絡。
以上操作相當于是手工給容器設置了一個網絡棧,并通過netns將可用的IP附加到容器內部,以實現最基本的容器內部固定ip,且和宿主機共享vlan。
參考文檔: https://yaxin-cn.github.io/Docker/docker-container-use-static-IP.html https://www.xiaomastack.com/2015/02/06/docker-static-ip/ http://blog.csdn.net/samxx8/article/details/46776073