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:
- 安装Docker
- 安装OVS(非编译)
apt-get install openvswitch-switch
- 编译安装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
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通。