Docker容器跨主机通讯的几种方式

2021-06-07 10:30:49 浏览数 (1)

Docker容器跨主机通讯的几种方式

  • 前言:Docker的5种网络模式
    • Bridge
    • Host
    • None
    • Container
    • Network
  • 1. 直接路由方式
  • 2. 基于OVS GRE的大二层通信

前言:Docker的5种网络模式

Bridge

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

Host

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

None

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

Containe

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

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上的 /etc/docker/daemon.json 文件,添加内容:

{ "bip": "172.17.43.1/24" }

编辑主机2上的 /etc/docker/daemon.json 文件,添加内容:

{ "bip":"172.17.42.1/24" }

  • 重启docker服务

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

systemctl restart docke

  • 创建ovs bridge
代码语言:javascript复制
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通。

0 人点赞