docker 1.12使用新版macvlan設置與宿主機同網段ip
******************************************
由於開發的一些特殊需求,需要將容器部署在與宿主機同一個網段中,部署步驟如下:
步驟一:創建網絡
$ docker network create -d macvlan --subnet=172.16.0.0/24 --gateway=172.16.0.1 -o parent=eno16777736 mynet
548d79fe04c613d3ca180e8689f2207f71534020bc39566d62d0b5aeb67fc8b5
參數解析:
-d macvlan 加載kernel的模塊名
--subnet 宿主機所在網段
--gateway 宿主機所在網段網關
-o parent 繼承指定網段的網卡
步驟二:運行容器
$ docker run --net=mynet --ip=172.16.0.100 -it -d --rm centos:6.7 /bin/bash
參數解析:
--ip 可以指定容器的IP
*******************************************************************************************
http://www.itnpc.com/news/web/146104788357316.html
在知乎上看到這一段,先mark一下。
沒有用過國內的雲服務,不是很清楚。就像 @向軍 所說的那樣,修改interface可以解決問題 另外,docker不是一定要用172.*的地址段,你可以用docker -b BRIDGE指定其他的interface,使用其他的IP段 參見:https://docs.docker.com/articles/networking/#bridge-building e.g. # brctl addbr mydockerbridge # ip addr add 192.168.1.1/24 dev mydockerbridge # ip link set dev mydockerbridge up # docker -d -b mydockerbridge 之后所有的docker container 就會使用192.168.1.*這個IP段了 作者:Honglin Feng 鏈接:https://www.zhihu.com/question/24863856/answer/29256378 來源:知乎 著作權歸作者所有,轉載請聯系作者獲得授權。
騰訊雲沒用過,按照相同思路排查下。
作者:向軍
鏈接:https://www.zhihu.com/question/24863856/answer/29253733
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
必須在--net=none模式下才能拿用pipework設置ip.
1、網絡模式
docker支持四種網絡模式,使用--net選項指定:
-
host,--net=host,如果指定此模式,容器將不會獲得一個獨立的network namespace,而是和宿主機共用一個。容器將不會虛擬出自己的網卡,IP等,而是使用宿主機的IP和端口,也就是說如果容器是個web,那直接訪問宿主機:端口,不需要做NAT轉換,跟在宿主機跑web一樣。容器中除了網絡,其他都還是隔離的。
-
container,--net=container:NAME_or_ID,與指定的容器共同使用網絡,也沒有網卡,IP等,兩個容器除了網絡,其他都還是隔離的。
-
none ,--net=none,獲得獨立的network namespace,但是,並不為容器進行任何網絡配置,需要我們自己手動配置。
-
bridge,--net=bridge,默認docker與容器使用nat網絡,一般分配IP是172.17.0.0/16網段,要想改為其他網段,可以直接修改網橋IP地址,例如:
$ sudo ifconfig docker0 192.168.10.1 netmask 255.255.255.0
2、容器默認網絡配置過程
先創建一個docker0的網橋,使用Veth pair創建一對虛擬網卡,一端放到新創建的容器中,並重命名eth0,另一端放到宿主機中,以veth+隨機7個字符串名字命名,並將這個網絡設備加入到docker0網橋中,網橋自動為容器分配一個IP,並設置docker0的IP為容器默認網關。同時在iptables添加SNAT轉換網橋段IP,以便容器訪問外網。
Veth par是用於不同network namespace間進行通信的方式,而network namespace是實現隔離網絡。
3、容器橋接宿主機網絡
關閉docker並設置橋接模式:
$ sudo apt-get install bridge-utils
$ sudo service docker stop
#關閉默認網橋
$ sudo ip link set dev docker0 down
#刪除默認網橋
$ sudo brctl delbr docker0
創建橋接網卡:
$ sudo brctl addbr br0 #創建網橋
$ sudo vi /etc/network/interfaces #將原有宿主機IP配置到新創建的網橋上
1
2
3
4
5
6
7
8
|
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.10.10
#宿主機IP
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 192.168.10.1
|
$ sudo /etc/init.d/networking restart
重啟網卡后,再通過ifconfig命令查看,多了br0網橋,並且IP地址也綁定在了上面。
#修改docker橋接網橋,並重啟
$ sudo vi /etc/default/docker
DOCKER_OPTS="-b=br0"
$ sudo service docker restart
接下來啟動一個容器,先不配置網絡信息:
$ sudo docker run -itd --name=ubuntu_test --net=none ubuntu
不配置ip的原因是:容器啟動后自動隨機分配一個網橋段的IP,這個IP不管你宿主機網絡中是否已經分配,它都會根據自身的算法來分配IP,docker有自己的一套分配算法。
所以既然選擇橋接網絡,就要事先規划好IP分配。
4、創建容器沒配置網絡,該怎么配置呢?
pipework是一個LXC網絡管理工具,用shell寫的,有200多行代碼。可以給容器配置固定IP地址:
$ git clone https://github.com/jpetazzo/pipework.git
$ sudo cp pipework/pipework /usr/local/bin/
$ sudo pipework br0 ubuntu_test 192.168.18.29/24@192.168.18.1
Warning: arping not found; interface may not be immediately reachable
這一步是給配置容器網絡並連接網橋,@左邊是與宿主機同網段IP,右邊是網關。
提示arping命令沒發現,可以通過apt-get install arping來安裝。
$ sudo brctl show #查看虛擬網卡veth開頭的已加入網橋
$ sudo docker attach ubuntu_test
#進入容器用ifconfig命令查看,IP信息已經配置上,通過ping百度及同網段IP是相通的,配置成功。
pipework工具怎么實現配置的IP呢?
pipework是通過ip netns exec進入容器的net命名空間,來配置容器net命名空間的網絡參數。