时间:2021-05-19
docker默认使用bridge模式,通过网桥连接到宿主机,而容器内部的ip则从网桥所在的ip段取未用的ip。这样做一个不方便的地方在于容器内部的ip不是固定的,想要连接容器时只能通过映射到宿主机的端口,因而有很多项目使用overlay来为docker提供网络的配置,比如Pipework、Flannel、Kubernetes、Weave、opencontrail等。
想要使用overlay来为docker配置网络,需要首先了解下docker的网络模式:
一、Docker的四种网络模式
Docker在创建容器时有四种网络模式,bridge为默认不需要用--net去指定,其他三种模式需要在创建容器时使用--net去指定。
bridge模式:docker网络隔离基于网络命名空间<Network Namespace>,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。
host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。
container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。
二、Docker配置自己的网桥
例子一、
1)、自定义新网桥
root@Docker:~# dpkg -l | grep bridge* #查看是否有安装brctl命令包ii bridge-utils 1.5-6Ubuntu2 amd64 Utilities for configuring the Linux Ethernet bridgeroot@Docker:~# apt-get install bridge-utils #安装brctl命令包root@Docker:~# docker -v #docker版本Docker version 1.5.0, build a8a31efroot@Docker:~# ps -ef | grep docker #正在运行 root 6834 1 0 16:28 ? 00:00:00 /usr/bin/docker -droot@Docker:~# service docker stop #停止root@Docker:~# ifconfig | grep docker0 #docker默认网桥docker0 Link encap:以太网 硬件地址 56:84:7a:fe:97:99root@Docker:~# ifconfig docker0 down #停止docker默认网桥root@Docker:~# brctl show #查看物理机上有哪些网桥root@Docker:~# brctl delbr docker0 #删除docker默认网桥root@Docker:~# brctl addbr docker_new0 #自定义网桥root@Docker:~# ifconfig docker_new0 192.168.6.1 netmask 255.255.255.0 #给自定义网桥指定IP和子网root@Docker:~# ifconfig | grep docker_new0 #查看发现自定义网桥已经启动docker_new0 Link encap:以太网 硬件地址 0a:5b:26:48:dc:04 inet 地址:192.168.6.1 广播:192.168.6.255 掩码:255.255.255.0root@Docker:~# echo 'DOCKER_OPTS="-b=docker_new0"' >> /etc/default/docker #指定网桥写入docker配置文件root@Docker:~# service docker start #启动dockerroot@Docker:~# ps -ef | grep docker #成功启动,并且成功加载了docker_new0root 21345 1 0 18:44 ? 00:00:00 /usr/bin/docker -d -b=docker_new0root@Docker:~# brctl show #查看当前网桥下是否有容器连接bridge name bridge id STP enabled interfacesdocker_new0 8000.fa3ce276c3b9 no root@Docker:~# docker run -itd CentOS:centos6 /bin/bash #创建容器测试root@Docker:~# docker attach 7f8ff622237f #进入容器[root@7f8ff622237f /]# ifconfig eth0 | grep addr #容器IP已经和自定义网桥一个网段,该容器IP为DHCP自动分配,不属于指定固定IPeth0 Link encap:Ethernet HWaddr 02:42:C0:A8:06:02 inet addr:192.168.6.2 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::42:c0ff:fea8:602/64 Scope:Linkroot@Docker:~# brctl show #该网桥上已经连接着一个网络设备了bridge name bridge id STP enabled interfacesdocker_new0 8000.fa3ce276c3b9 no veth17f560a注:veth设备是成双成对出现的,一端是容器内部命名eth0,一端是加入到网桥并命名的veth17f560a(通常命名为veth*),他们组成了一个数据传输通道,一端进一端出,veth设备连接了两个网络设备 并实现了数据通信。
例子二:
首先,配置一个用于创建container interface的网桥,可以使用ovs,也可以使用Linux bridge,以Linux bridge为例:
br_name=dockerbrctl addbr $br_nameip addr add 192.168.33.2/24 dev $br_nameip addr del 192.168.33.2/24 dev em1ip link set $br_name upbrctl addif $br_name eth0接着,可以启动容器了,注意用--net=none方式启动:
# start new containerhostname='docker.test.com'cid=$(docker run -d -i -h $hostname --net=none -t centos)pid=$(docker inspect -f '{{.State.Pid}}' $cid)下面,为该容器配置网络namespace,并设置固定ip:
# set up netnsmkdir -p /var/run/netnsln -s /proc/$pid/ns/net /var/run/netns/$pid# set up bridgeip link add q$pid type veth peer name r$pidbrctl addif $br_name q$pidip link set q$pid up# set up docker interfacefixed_ip='192.168.33.3/24'gateway='192.168.33.1'ip link set r$pid netns $pidip netns exec $pid ip link set dev r$pid name eth0ip netns exec $pid ip link set eth0 upip netns exec $pid ip addr add $fixed_ip dev eth0ip netns exec $pid ip route add default via 192.168.33.1这样,容器的网络就配置好了,如果容器内部开启了sshd服务,通过192.168.33.3就可以直接ssh连接到容器,非常方便。上面的步骤比较长,可以借助pipework来为容器设置固定ip(除了设置IP,还封装了配置网关、macvlan、vlan、dhcp等功能):
pipework docker0 be8365e3b2834 10.88.88.8/24
那么,当容器需要删除的时候,怎么清理网络呢,其实也很简单:
# stop and delete containerdocker stop $ciddocker rm $cid# delete docker's net namespace (also delete veth pair)ip netns delete $pid更多docker网络的配置,可以参考官方手册。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
由于默认的bridge桥接网络,重启容器后会改变ip地址。在一些场景下我们希望固定容器IP地址。docker-compose是docker的一个编排工具,相对于
本节描述如何在Docker默认网桥中配置容器DNS。当您安装Docker时,就会自动创建一个名为bridge的桥接网络。注意:Docker网络功能允许您创建除默
为docker配置固定ip首先,配置一个用于创建containerinterface的网桥,可以使用ovs,也可以使用Linuxbridge,以Linuxbri
工具/原料网络两台无线路由器(其中至少一台有桥接功能)步骤一配置PC环境1、为保证后续无线桥接配置的正确和完整性,建议用网线连接路由器,并将本机的IP(IPv4
路由器桥接是会影响网速的,其相关的解决方法如下: 1、IP冲突 主路由器和扩展路由器的IP不能相同,最好把桥接的从路由DHCP关掉。 2、兼容问题 使用