Docker 配置固定IP及桥接的实现方法_docker

docker默认使用bridge模式,通过网桥连接到宿主机,而容器内部的ip则从网桥所在的ip段取未用的ip。这样做一个不方便的地方在于容器内部的ip不是固定的,想要连接容器时只能通过映射到宿主机的端口,因而有很多项目使用overlay来为docker提供网络的配置,比如Pipework、Flannel、Kubernetes、Weave、opencontrail等。

想要使用overlay来为docker配置网络,需要首先了解下docker的网络模式:

一、Docker的四种网络模式

Docker在创建容器时有四种网络模式,bridge为默认不需要用--net去指定,其他三种模式需要在创建容器时使用--net去指定。

  1. bridge模式,使用--net=bridge指定,默认设置。
  2. none模式,使用--net=none指定。
  3. host模式,使用--net=host指定。
  4. container模式,使用--net=container:容器名称或ID指定。(如:--net=container:30b668ccb630)

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 bridge

root@Docker:~# apt-get install bridge-utils #安装brctl命令包

root@Docker:~# docker -v          #docker版本

Docker version 1.5.0, build a8a31ef

root@Docker:~# ps -ef | grep docker     #正在运行
root   6834  1 0 16:28 ?    00:00:00 /usr/bin/docker -d

root@Docker:~# service docker stop     #停止

root@Docker:~# ifconfig | grep docker0   #docker默认网桥
docker0 Link encap:以太网 硬件地址 56:84:7a:fe:97:99

root@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.0

root@Docker:~# echo 'DOCKER_OPTS="-b=docker_new0"' >> /etc/default/docker #指定网桥写入docker配置文件

root@Docker:~# service docker start     #启动docker

root@Docker:~# ps -ef | grep docker     #成功启动,并且成功加载了docker_new0
root  21345  1 0 18:44 ?    00:00:00 /usr/bin/docker -d -b=docker_new0

root@Docker:~# brctl show          #查看当前网桥下是否有容器连接
bridge name       bridge id       STP enabled  interfaces
docker_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自动分配,不属于指定固定IP
eth0   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:Link

root@Docker:~# brctl show          #该网桥上已经连接着一个网络设备了
bridge name        bridge id       STP enabled  interfaces
docker_new0      8000.fa3ce276c3b9      no     veth17f560a

注:veth设备是成双成对出现的,一端是容器内部命名eth0,一端是加入到网桥并命名的veth17f560a(通常命名为veth*),他们组成了一个数据传输通道,一端进一端出,veth设备连接了两个网络设备    并实现了数据通信。


root@Docker:~# wget https://github.com/jpetazzo/pipework/archive/master.zip #下载 pipework

root@Docker:~# unzip master.zip      #解压

root@Docker:~# cp pipework-master/pipework /usr/bin/           #拷贝pipework到 /usr/bin/下

root@Docker:~# chmod +x /usr/bin/pipework  #赋予该命令执行权限

root@Docker:~# pipework docker_new0 -i eth1 $(docker run -itd -p 9197:80 centos:centos6 /bin/bash) 192.168.6.27/24@192.168.6.1 #创建容器,并指定固定IP
格式:pipework 网桥名 -i 指定在那块网卡上配置 <容器名or容器ID> 指定容器内IP/子网@网关 注:容器内网关就是物理机网桥的IP       

root@Docker:~# docker attach 2966430e2dbe  #进入新容器

[root@2966430e2dbe /]# ifconfig       #容器内IP为指定的IP 192.168.6.27
eth0   Link encap:Ethernet HWaddr 02:42:C0:A8:06:05
     inet addr:192.168.6.7 Bcast:0.0.0.0 Mask:255.255.255.0    #docker_new0网桥创建容器时DHCP分配的IP

eth1   Link encap:Ethernet HWaddr 82:DB:F7:A3:33:92
     inet addr:192.168.6.27 Bcast:0.0.0.0 Mask:255.255.255.0    #pipework指定的固定IP,网桥还是docker_new0

[root@2966430e2dbe /]# route -n       #查看路由路径
Kernel IP routing table
Destination  Gateway    Genmask    Flags Metric Ref  Use Iface
0.0.0.0    192.168.6.1  0.0.0.0    UG  0   0    0 eth0
192.168.6.0  0.0.0.0    255.255.255.0 U  0   0    0 eth0
192.168.6.0  0.0.0.0    255.255.255.0 U  0   0    0 eth1

[root@2966430e2dbe /]# ping www.linuxidc.com  #测试网络
PING www.linuxidc.com (119.75.218.70) 56(84) bytes of data.
64 bytes from 119.75.218.70: icmp_seq=1 ttl=127 time=3.98 ms
64 bytes from 119.75.218.70: icmp_seq=2 ttl=127 time=2.98 ms

[root@2966430e2dbe /]# netstat -anptu | grep 80               #容器内80端口已经开启
tcp    0   0 :::80           :::*            LISTEN   -

root@Docker:~# telnet 192.168.6.27 80    #物理机上测试指定的IP是否和映射的端口等通信正常
Trying 192.168.6.27...
Connected to 192.168.6.27.
Escape character is '^]'.

root@Docker:~# iptables-save > iptables-rules #拷贝防火墙规则到本地文件

root@Docker:~# vi iptables-rules       #打开规则文件查看你会发现你物理机的防火墙自动添加了很多条规则,这个是容器到网桥到本地网卡到公网的地址转换通信规则

例子二:

首先,配置一个用于创建container interface的网桥,可以使用ovs,也可以使用Linux bridge,以Linux bridge为例:

br_name=docker
brctl addbr $br_name
ip addr add 192.168.33.2/24 dev $br_name
ip addr del 192.168.33.2/24 dev em1
ip link set $br_name up
brctl addif $br_name eth0

接着,可以启动容器了,注意用--net=none方式启动:

# start new container
hostname='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 netns
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
# set up bridge
ip link add q$pid type veth peer name r$pid
brctl addif $br_name q$pid
ip link set q$pid up
# set up docker interface
fixed_ip='192.168.33.3/24'
gateway='192.168.33.1'
ip link set r$pid netns $pid
ip netns exec $pid ip link set dev r$pid name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add $fixed_ip dev eth0
ip 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 container
docker stop $cid
docker rm $cid
# delete docker's net namespace (also delete veth pair)
ip netns delete $pid

更多docker网络的配置,可以参考官方手册。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索docker
配置固定IP及桥接
docker 固定ip、docker 固定容器ip、docker 设置固定ip、docker容器设置固定ip、docker容器分配固定ip,以便于您获取更多的相关知识。

时间: 2024-09-14 17:47:51

Docker 配置固定IP及桥接的实现方法_docker的相关文章

【OS】Linux环境下配置固定IP地址

[OS]Linux环境下配置固定IP地址 ---red hat重启网卡service network restart/etc/rc.d/init.d/network restart ---suse重启网卡service network restartrcnetwork restart/etc/rc.d/init.d/network restart ----卸载网卡ifconfig eth0 down --- 单独重启网卡ifdown eth0 && ifup eth0ifconfig et

为 instance 配置静态 IP - 每天5分钟玩转 OpenStack(157)

  这是 OpenStack 实施经验分享系列的第 7 篇. 传统运维中为服务器配置静态 IP 是再常见不过的了.但在 OpenStack 环境下只能指定 network,IP 都是 Neutron 从 subnet IP 池中自动分配的.   有同学就会想办法了:等 instance 起来后手工把 IP 改掉行不行? 非常遗憾,不行! instance 网卡的 IP 和 Mac 地址是记录在 port 中的,计算节点的 iptable 会根据 port 信息生成相应的 rule,只有与 por

Linux内核bug引起Mesos、Kubernetes、Docker的TCP/IP数据包失效

本文讲的是Linux内核bug引起Mesos.Kubernetes.Docker的TCP/IP数据包失效,[编者的话]最近发现Linux内核bug,会造成使用veth设备进行路由的容器(例如Docker on IPv6.Kubernetes.Google Container Engine和Mesos)不检查TCP校验码(checksum),这会造成应用在某些场合下,例如坏的网络设备,接收错误数据.这个bug可以在三年前任何一个测试过的内核版本中发现.补丁已经被整合进核心代码,正在回迁入3.14之

交换机-TP-LINK设置固定IP 如何能同时上外网和内网

问题描述 TP-LINK设置固定IP 如何能同时上外网和内网 TP-LINK设置固定IP 如何能同时上外网和内网, 固定IP我有分配 这个IP是能同时上外网和内网的 如 192.168.12.123 子网 255.255.255.0 网关 192.168.12.1 主DNS 130.1.1.1 副DNS 130.1.1.1 我该如何设置交换机成固定IP 然后使其他连到这个交换机上的电脑能同时能上外网和内网 解决方案 请说明你的TP-LINK交换机型号,你是两层网管还是三层,单播,多播还是组播等信

Fedora虚拟机如何设置固定IP上网

Fedora虚拟机设置固定IP上网(配置IP.网关.DNS.防止resolv.conf被重写) 首先声明:该方法在Fedora 17和18版本下有效,其它版本也许可行也许有所差异. 1.  虚拟机相关配置 如果不是虚拟机系统,则这步不需要,若是相关配置详细信息请看"Linux系列:Ubuntu虚拟机设置固定IP上网(配置IP.网关.DNS.防止resolv.conf被重写)". 2. 设置静态IP地址 首先选取你想要配置的网络接口,可以通过ifconfig -a命令查看目前有哪些接口,

让Windows同时拥有动态和固定IP

很多时候,我们会在不同的网络中工作,重复地修改IP地址是一件很令人头疼的事情.但默认情况下,Windows中的网卡只允许选择固定IP或者从DHCP服务器上动态获得IP.其实不然,如果我们仔细研究,可以让网卡具有双重身份,即如果有DHCP服务器,则会从DHCP服务器上获得IP,否则则使用一个我们指定的IP,这样会给我们带来很大的方便. 一.Windows XP 如果用的是Windows XP系统,比较简单:双击"控制面板"中的"网络连接"图标,再右击相应的网卡,如&q

腾达FH332设置固定IP(静态IP)上网教程

  本文档适用于腾达FH332使用固定IP.子网掩码.网关.DNS上网的用户 第一步:连接好线路 直接将入户的网线(没有猫的用户)或者"猫"出来的网线(有猫的用户)接在路由器的WAN口,再找一根短网线一头接电脑,一头接路由器LAN1/LAN2/LAN3任意接口,接线方式如下图: 注意:路由器正常工作状态是指示灯SYS闪烁,WAN口常亮或闪烁,LAN1/LAN2/LAN3口中与电脑相连的端口常亮或闪烁. 第二步:记录电脑当前IP地址并将IP地址改为自动获取 将电脑上的本地连接IP地址设置

Mac固定IP地址怎么设置

  Mac电脑设置固定IP地址图文教程 一.Mac电脑怎么设置固定IP地址 第一步.点击Mac桌面"系统偏好设置"图标 第二步.在打开的系统偏好设置界面,点击互联网和无线选项中的"网络" 第三步.在网络界面,点击"高级",进入高级设置. 第四步.在以太网设置界面,在TCP/IP选项下,点击"配置IPv4"后面的箭头,选项中点击"手动" 第五步.在IPv4选项处填入你所要用到的固定IP地址,点击"好

linux设置固定ip

编辑网卡配置文件 vi /etc/sysconfig/network-script/ifcfg-eth0 进入编辑模式 按i键进行编辑 修改 DEVICE=eth0                                #物理设备名 IPADDR=192.168.1.10                   #IP地址 NETMASK=255.255.255.0            #掩码值 NETWORK=192.168.1.0                #网络地址(可不要) B