前言:Docker的5种网络模式

Bridge

此时docker引擎会创建一个veth对,一端连接到容器实例并命名为eth0,另一端连接到指定的网桥中(比如docker0),因此同在一个主机的容器实例由于连接在同一个网桥中,它们能够互相通信。容器创建时还会自动创建一条SNAT规则,用于容器与外部通信时,类似家里上网用的ISP提供给我们的动态IP。如果用户使用了-p或者-P端口,还会创建对应的端口映射规则,使得外部请求能够访问容器的服务,但是你不能通过IP直接访问,本文提供了3种方式实现容器的跨主机访问。

Host

与宿主机共享网络,此时容器没有使用网络的namespace,宿主机的所有设备,会暴露到容器中,因此存在安全隐患。

None

不设置网络,相当于容器内没有配置网卡,用户可以手动配置。

Container

指定与某个容器实例共享网络

Network

使用自定义网络,可以使用docker network create创建,并且默认支持多种网络驱动,用户可以自由创建桥接网络或者overlay网络。

Prework:

  1. 安装Docker
  2. 安装OVS(非编译)
    apt-get install openvswitch-switch
  3. 编译安装OVS:
	apt-get install git
	apt-get install autoconf automake libtool
	apt-get install openssl
	apt-get install libssl-dev
	apt-get install make
	apt-get install make-guile
	apt-get install python-six

获取代码:
git clone https://github.com/openvswitch/ovs.git

编译操作:

	cd ovs
	./boot.sh
	./configure
	make
	make install

加载模块
/sbin/modprobe openvswitch
查看安装是否成功:
/sbin/lsmod | grep openvswitch
修改环境变量:
export PATH=$PATH:/usr/local/share/openvswitch/scripts


1. 直接路由方式

这种方式最简单,只需一步:在左侧本机增加一个静态路由。
ip route add 172.17.42.0/24 via 172.31.4.143

在右侧主机新增一条静态路由:
ip route add 172.17.43.0/24 via 172.31.15.168

当然前提是,docker0 网桥的网段改掉,参照下图的方式,同时需要提醒的是,需要把本机的路由转发打开。

  • ubuntu的话:
    修改 /etc/sysctl.conf,把ip_forward = 1 的注释去掉即可
  • centos的话:
    修改 /etc/sysctl.d/99-sysctl.conf
    添加net.ipv4.ip_forward = 1,然后试试sysctl -p
    很简单的方式,其实很像flannel网络的Host-Gateway的原理

2. 基于OVS+GRE的大二层通信

示意图如下:
在这里插入图片描述

  • 修改Docker0的网络地址

    1. 编辑主机1上的 /etc/docker/daemon.json 文件,添加内容:
      { "bip": "172.17.43.1/24" }
    2. 编辑主机2上的 /etc/docker/daemon.json 文件,添加内容:
      { "bip":"172.17.42.1/24" }
  • 重启docker服务

    主机1和主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效
    systemctl restart docker

  • 创建ovs bridge

    ovs-vsctl add-br br0 
    ifconfig 
    

    通过ifconfig命令,我们发现多了一个br0网桥。

  • 设置gre端口 (主机2上面也一样,只是remote_ip为172.31.15.168)

    ovs-vsctl add-port br0 gre0 – set Interface gre0 type=gre option:remote_ip=172.31.4.143
    brctl addif docker0 br0 
    ip link set dev br0 up 
    ip link set dev docker0 up 
    ip route add 172.17.0.0/16 dev docker0
    
  • 启动容器测试下
    docker run -it nginx /bin/bash
    在这里插入图片描述

显示两个跨主机容器能互相ping通。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐