为docker容器设置独立ip
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命名空间的网络参数。