通过在Docker宿主机上添加静态路由实现跨宿主机通信

模拟环境 主机1(192.168.58.144) 设置docker0 网关 (172.17.0.1/16)
                主机2(192.168.58.145) 设置docker0 网关 (172.18.0.1/16)
   修改方式 编辑 /etc/docker/daemon.json修改如下 两台主机分别设置不一样网关

{"bip":"172.18.0.1/16"}

重启docker

service docker restart

使用ifconfig查看docker0的ip是否修改
分别在两个主机上启动1个容器

docker run -itd --name s1  centos

分别查看ip 是否是 172.17.0.2和172.18.0.1

[root@cdh3 ~]# docker inspect s1 | grep IPA
                "SecondaryIPAddresses": null,
                "IPAddress": "172.18.0.2",
                        "IPAMConfig": null,
                        "IPAddress": "172.18.0.2",

在主机144上 要求能访问 172.18段 添加路由

route add -net 172.18.0.0 netmask 255.255.0.0 gw 192.168.58.145

在主机145上 要求能访问 172.17段 添加路由

route add -net 172.17.0.0 netmask 255.255.0.0 gw 192.168.58.145

主机两台主机的 ip_forward功能必须开启 否则不会在网卡间转发

[root@cdh2 ~]# sysctl -a | grep net.ipv4.ip_forward
    net.ipv4.ip_forward = 1

如果值不是 1 修改 /etc/sysctl.conf 添加一行

net.ipv4.ip_forward = 1

执行命令 sysctl -p 生效即可  成功后 互相ping对方的docker容器的ip发现成功
模拟环境图:

3》Pipework指定静态ip

Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。
使用新建的bri0网桥代替缺省的docker0网桥
bri0网桥与缺省的docker0网桥的区别:bri0和主机网卡之间是也是veth pair 可以为容器分配和主机相同的网段静态ip
模拟环境图

该方式创建的容器 使用none的网络模式 自己定义网桥和网卡等 启动容器时可以通过--net=none指定容器网络模式。

安装网桥

yum install -y bridge-utils

查看所有网桥

[root@cdh2 ~]# brctl show
    bridge name     bridge id               STP enabled     interfaces
    docker0         8000.0242027435aa       no

修改网络文件/etc/sysconfig/network-scripts/ifcfg-eno16777736

[root@cdh2 network-scripts]# more ifcfg-eno16777736
    TYPE=Ethernet
    #BOOTPROTO=dhcp
    BOOTPROTO=none
    #IPADDR=192.168.58.144
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    NAME=eno16777736
    UUID=1c2310e2-e82e-4ce7-a1aa-60d05aa47f1e
    DEVICE=eno16777736
    ONBOOT=yes
    PEERDNS=yes
    PEERROUTES=yes
    IPV6_PEERDNS=yes
    IPV6_PEERROUTES=yes
    BRIDGE="br-ex"

将静态ip相关注释 添加 BRIDGE=设备名称  添加一个新的网卡文件ifcfg-br-ex 内容

[root@cdh2 network-scripts]# more ifcfg-br-ex
    TYPE=Bridge
    BOOTPROTO=static
    IPADDR=192.168.58.144
    NETMASK=255.255.255.0
    GATEWAY=192.168.58.2
    PREFIX=24
    DNS1=192.168.58.2
    NAME=br-ex
    ONBOOT=yes
    DEVICE=br-ex

重启网卡后 查看网络和网桥

root@cdh2 network-scripts]# ifconfig
    br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.58.144  netmask 255.255.255.0  broadcast 192.168.58.255
            inet6 fe80::20c:29ff:fe90:75c5  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:90:75:c5  txqueuelen 0  (Ethernet)
            RX packets 268  bytes 24407 (23.8 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 136  bytes 17574 (17.1 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@cdh2 network-scripts]# brctl show
    bridge name     bridge id               STP enabled     interfaces
    br-ex           8000.000c299075c5       no              eno16777736
    docker0         8000.0242027435aa       no

下载pipework脚本

[root@cdh2 ~]# git clone https://github.com/jpetazzo/pipework.git

进入查看 其中有个文件pipework就是脚本

[root@cdh2 ~]# cd pipework
    [root@cdh2 pipework]# ll
    total 60
    -rw-r--r-- 1 root root    75 Jun  6 11:28 docker-compose.yml
    drwxr-xr-x 2 root root    23 Jun  6 11:28 doctoc
    -rw-r--r-- 1 root root 11358 Jun  6 11:28 LICENSE
    -rwxr-xr-x 1 root root 14698 Jun  6 11:28 pipework
    -rw-r--r-- 1 root root   827 Jun  6 11:28 pipework.spec
    -rw-r--r-- 1 root root 22328 Jun  6 11:28 README.md

将该脚本拷贝到/usr/local/bin目录 方便执行

[root@cdh2 pipework]# cp -rp pipework /usr/local/bin

分别添加容器 指定 none网络模式

docker run -itd --net none --name s1  centos

给容器制定固定ip

[root@cdh2 pipework]# pipework br-ex s1 192.168.58.142/24@192.168.58.144
    [root@cdh2 pipework]# ping 192.168.58.142
    PING 192.168.58.142 (192.168.58.142) 56(84) bytes of data.
    64 bytes from 192.168.58.142: icmp_seq=1 ttl=64 time=0.249 ms

piepework参数
pipework 网桥名称 容器名称 容器固定ip/24@网桥ip
其他机器上ping  192.168.58.142发现成功
主机2配置同上即可
---------------------
作者:liaomin416100569
来源:CSDN
原文:https://blog.csdn.net/liaomin416100569/article/details/80350144
版权声明:本文为博主原创文章,转载请附上博文链接!

docker 网络 路由的更多相关文章

  1. [docker]docker网络-直接路由模式

    linux namespace连接参考: http://www.cnblogs.com/iiiiher/p/8057922.html docker网络-直接路由模式 参考: https://www.y ...

  2. docker网络配置方法总结

    docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...

  3. Docker网络详解

         当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机.它会在挂载到它的网口之间进行转发.      ...

  4. 【转】Docker网络详解及pipework源码解读与实践

    好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...

  5. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  6. docker网络解析

    Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ...

  7. Docker 网络之理解 bridge 驱动

    笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...

  8. Docker 网络之进阶篇

    笔者在<Docker 基础 : 网络配置>一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段.时过境迁,随着 docker 的快速发展,其网络架构也在不断 ...

  9. Docker网络和容器的通信

    Docker的本地网络实现其实就是利用了Linux上的网络命名空间和虚拟网络设备(特别是veth pair). 基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界 ...

随机推荐

  1. 第八次作业:聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    import numpy as np x = np.random.randint(1,100,[20,1]) y = np.zeros(20) k = 3 def initcenter(x,k): r ...

  2. JDBC原理

    JDBC原理   JDBC是什么: Java Database Connectivity:Java访问数据库的解决方案 JDBC是Java应用程序访问数据库的里程碑式解决方案.Java研发者希望用相同 ...

  3. jS弹出新窗口被拦截的解决方法

    使用ajax处理数据,在回调中跳转到或打开新页面,这时就会被浏览器拦截 解决方案:先用window.open打开一个窗口,然后修改该窗口地址 var w = window.open('about:bl ...

  4. 【SoftwareTesting】Lab 2

    一.    在火狐浏览器上安装selenium插件 点击“开发者”的选项,然后点击“获取更多工具”,输入seleniumIDE进行搜索,找到后进行安装即可.安装完成后火狐浏览器的右上角会多出一个小的带 ...

  5. python单列模式

    单例模式:就是永远用一个对象的实例 初级版 #初级版 class Foo(object): instance=None def __init__(self): pass @classmethod # ...

  6. URL路由系统-命名空间

    命名空间 1.工程Django下的urs.py from django.conf.urls import url,include from django.urls import path,re_pat ...

  7. linux bash 命令

    export:显示所有的环境变量,如果你想获取某个变量的详细信息,使用 echo $VARIABLE_NAMEv whereis:使用系统自动构建的数据库来搜索可执行文件,源文件和手册页面 which ...

  8. 2017-9-3模拟赛T3 密码(key)

    题目 题解 这题用类似暴力+优化(划掉)的思想. 对于每个轨迹串,求出每一位向后的第一个0-9间某个数字的位置(如123112中3后面第1个2的位置为从左往右数第6个),复杂度O(Σn)=O(L). ...

  9. python练习:实现一个整数数组里面两个数之和为183的所有整数对

    l1 = [183,0,1,2,-184,367] num = [] for i in range (0,len(l1)): for l in range (i+1,len(l1)): if l1[i ...

  10. java中字符串“不可变性”的破坏,使用反射破坏final属性。以及涉及到字符串常量池的问题。

    大家都清楚java中String类是不可变的,它的定义中包含final关键字.一旦被创建,值就不能被改变(引用是可以改变的). 但这种“不可变性”不是完全可靠的,可以通过反射机制破坏.参考一下代码: ...