原文鏈接
https://github.com/alfredhuang211/study-docker-doc/blob/master/docker%E8%B7%A8%E4%B8%BB%E6%9C%BAmacvlan%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE.md#搭建環境
-----以下部分轉自原文-----
搭建環境
-
virtualbox, ubuntu14.04.4 內核4.2.0 docker 1.12.0-rc1
-
virtualbox上運行兩套主機系統,設置使用橋接模式,網卡混雜模式開啟全部允許.
-
主機上配置的eth0網口或者創建的vlan網口,均需要開啟混雜模式,命令
ip link set eth0 promisc on
ip link set eth0.100 promisc on
注意 : 如果不開啟混雜模式,會導致macvlan網絡無法訪問外界,具體在不使用vlan時,表現為無法ping通路由,無法ping通同一網絡內其他主機
搭建過程1-不使用vlan
1. 創建docker macvlan網絡
兩台主機上 eth0 使用分別為 192.168.15.75/192.168.15.21. 分別在兩台主機上使用相同命令 docker network create -d macvlan --subnet=192.168.15.0/24 --gateway=192.168.15.1 -o parent=eth0 -o macvlan_mode=bridge eth0_1
創建eth0_1的macvlan網絡.
2. 創建容器
主機1 運行容器 使用命令:
docker run --net=eth0_1 --ip=192.168.15.101 -id --name test101 busybox sh
docker run --net=eth0_1 --ip=192.168.15.102 -id --name test102 busybox sh
主機2 運行容器 使用命令:
docker run --net=eth0_1 --ip=192.168.15.201 -id --name test201 busybox sh
docker run --net=eth0_1 --ip=192.168.15.202 -id --name test202 busybox sh
3. 測試網絡
主機1上測試:
運行命令:
docker exec test101 ping 192.168.15.1
ping網關: 通
docker exec test101 ping test102
使用容器名ping本主機容器: 通
docker exec test102 ping 192.168.15.101
ping本主機容器: 通
docker exec test102 ping 192.168.15.199
ping本網絡其他主機: 通
docker exec test101 ping 192.168.15.201
ping另一主機容器: 通
docker exec test101 ping test201
使用容器名ping另一主機容器: 不通
ping 192.168.15.101
本主機ping本主機容器: 不通
ping 192.168.15.201
本主機ping另一主機容器: 通
主機2上測試獲取相同結果.
搭建過程2-使用vlan
1. 創建vlan
使用命令vconfig add eth0 100
創建eth0.100的vlan.設置兩台主機的vlan ip分別為192.168.100.50/192.168.100.51
2. 創建docker macvlan網絡
分別在兩台主機上使用命令 docker network create -d macvlan --subnet=192.168.100.0/24 --gateway=192.168.100.1 -o parent=eth0.100 -o macvlan_mode=bridge 100_1
創建相同的100_1的macvlan網絡.
3. 創建容器
主機1 運行容器 使用命令:
docker run --net=100_1 --ip=192.168.100.101 -id --name test100.101 busybox sh
docker run --net=100_1 --ip=192.168.100.102 -id --name test100.102 busybox sh
主機2 運行容器 使用命令:
docker run --net=100_1 --ip=192.168.100.201 -id --name test100.201 busybox sh
docker run --net=100_1 --ip=192.168.100.202 -id --name test100.202 busybox sh
4. 測試網絡
主機1上測試:
運行命令:
docker exec test100.101 ping 192.168.100.1
ping網關: 不通
docker exec test100.101 ping 192.168.100.50
ping本地eth0.100地址: 不通
docker exec test100.101 ping 192.168.100.51
ping另一個主機的eth0.100地址:通
docker exec test100.101 ping 192.168.100.102
ping本主機容器: 通
docker exec test100.101 ping 192.168.100.201
ping另一主機容器: 通
docker exec test100.101 ping test100.102
使用容器名ping本主機容器: 通
docker exec test100.101 ping test100.201
使用容器名ping另一主機容器: 不通
docker exec test100.101 ping 192.168.15.199
ping跨網絡主機: 不通
ping 192.168.100.101
本主機ping本主機容器: 不通
ping 192.168.100.201
本主機ping另一主機容器: 通
主機2測試相同
一些問題
macvlan網絡在創建時要指定parent.其中parent僅能使用一次,即eth0在創建一個macvlan網絡時使用了,則在創建另一個的時候就無法再使用了.
在創建macvlan的時候,如果不指定網段,默認網段為172.18.0.0/16, 此時加入此網絡的容器,在同一台主機上時可以互相ping通,無法ping通外部網絡,同時加入此網絡的容器,創建時不能手工指定ip,僅能使用ipam自動分配.
在使用和主機相同網段的macvlan時,如果在創建容器時不指定ip,則默認ipam從192.168.15.2開始分配,不檢查網段內是否已有相同ip,這種情況下會造成容器ip和網絡內其他設備ip沖突.具體情況可看如下:
root@ubuntu:~# arp -a 192.168.15.5 bogon (192.168.15.5) at 00:17:61:12:0b:d1 [ether] on eth0 root@ubuntu:~# root@ubuntu:~# root@ubuntu:~# arp -a 192.168.15.5 bogon (192.168.15.5) at 02:42:c0:a8:0f:05 [ether] on eth0
如上是在創建的容器對網關ping之前和ping之后查看的arp,可以看到發生了ip沖突
相關鏈接
http://t.cn/RXYNXqK
http://t.cn/RXQU43D
http://hustcat.github.io/docker-macvlan/