默認情況下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是隔離的。
但是目前有個問題:host
和container
是無法互通的,因爲是macvlan的原因,同一個網口的流量是無法回傳的,除非在外部有一個支持VEPA
或者VN-Link
的交換機。
以上命令中的網絡接口、ip請根據實際情況進行調整