Docker macvlan macvlan

默認情況下docker使用bridge網絡,這是一個私有網絡,只能在host和container之間互通,如果發佈服務,需要使用端口映射的方式來解決,比如一個nginx容器要想對外提供服務則在容器啓動時指定參數-p 80:80,然後使用host主機的ip加端口即可訪問容器。這在大部分場景下都夠用了,但是總有一些需求無法滿足,比如如果多個容器都需要使用80端口,或者只使用ip通信的網絡應用,macvlan可以做到。

macvlan

macvlan是可以虛擬mac地址,單獨的macvlan存在意義不大,結合docker給每一個容器都虛擬一個mac地址,這樣每個容器在局域網中都相當於一個獨立的主機。

創建

docker network create -d macvlan \
  --subnet=192.168.10.0/24 \
  --ip-range=192.168.10.32/28 \
  --gateway=192.168.10.1 \
  --aux-address="my-router=192.168.32.33" \
  -o parent=eth0 macnet
  • subnet:子網
  • ip-range:docker自動分配ip範圍,防止和局域網內其他主機重複
  • gateway:網關
  • aux-address:docker分配ip時排除的ip(這個ip有其他用途)
  • parent:父接口,也就是host主機的物理網卡
    以上參數強烈建議都指定,可以減少不必要的麻煩

創建容器

docker run -d --net=macnet --ip=192.168.10.34 --name nginx nginx
  • --net:指定關聯上面創建的macvlan網絡
  • --ip:指定ip,可以不指定(讓docker自動分配),也可以去容器裏修改

經過上面操作運行了一個nginx容器,此容器擁有一個虛擬的mac地址,在網內相當於一個真實的主機,任何網內的其他主機(非host)都可以通過爲其指定的ip訪問該容器。
如果使用相同的方法運行多個nginx容器,並不需要每個容器指定不同的端口,因爲網絡namespace是隔離的。

但是目前有個問題:hostcontainer是無法互通的,因爲是macvlan的原因,同一個網口的流量是無法回傳的,除非在外部有一個支持VEPA或者VN-Link的交換機。

以上命令中的網絡接口、ip請根據實際情況進行調整

https://docs.docker.com/network/macvlan/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章