docker容器的跨主机通信有好多种方案,此处用的是桥接物理网卡的方式实现的;
.

一、新建网卡,并桥接物理网卡;

在宿主机上新建一个网卡,并桥接物理网卡,可以使用 nm-connection-editor 命令进入图形化界面进行配置,也可以用 nmcli connection 命令的方式配置,还可以使用 在/etc/sysconfig/network-scripts/下编辑配置文件的方式进行配置;
为了快速方便,此处使用 nmcli connection 命令的方式进行配置:
1、

nmcli connection add type bridge con-name bridge1 ifname br_1

#bridge1 和 br_1 是网卡名字,可以随便写;

2、

nmcli connection modify bridge1 ipv4.addresses 192.168.139.200/24 ipv4.gateway 192.168.139.2 ipv4.method manual

#ipv4.addresses是宿主机网段中的一个ip,可以和宿主机ip相同,为了抢占宿主机的网卡使用权;
#ipv4.gateway是宿主机的网关,不知道的可以 route -n 看下;
#ipv4.method 是设置该网卡为手动,即:不需要自动获取ip;

3、

nmcli connection add type bridge-slave ifname ens33 con-name br-slave master br_1

#ifname 是宿主机的物理网卡;
#br-slave 是桥接的网卡,可以随便写;
#br_1 是上面创建的网卡;

4、执行结果:
docker容器利用pipework桥接网络跨主机通信_第1张图片

5、需要 systemctl restart network 重启网卡;
重启后 ssh 192.168.139.200 进行连接;
通过 ip a 命令可以看到:
docker容器利用pipework桥接网络跨主机通信_第2张图片
原有的物理网卡 ens33 没有了ip,创建的 br_1 是我们设定的ip;再通过 brctl show 查看:
docker容器利用pipework桥接网络跨主机通信_第3张图片
br_1桥接到了原有的物理网卡ens33上;但此时如果你ping百度的话应该是不通的,根据错误进行排查是路由问题还是dns问题:
docker容器利用pipework桥接网络跨主机通信_第4张图片

6、配置好桥接网络再进行以下步骤;

.

二、下载pipework工具,并配置环境变量;

1、pipework工具github链接: https://github.com/jpetazzo ;你会发现大神总有与众不同的地方,膜拜......
2、执行git命令拉取,并配置环境变量:

git clone https://github.com/jpetazzo/pipework
cp ./pipework/pipework /usr/local/bin/

ok,现在可以使用 pipework 这个命令工具了;
.

三、运行一个容器并使用none网络模式;

1、大家都知道docker容器有三种网络模式: bridge、host、none,具体作用此处不再多述;
2、创建一个none网络的容器:

docker run -it --network none --name pipework_test centos:full /bin/bash

docker容器利用pipework桥接网络跨主机通信_第5张图片
none网络是只有lo网卡的;
.

四、使用pipework进行配置容器 pipework_test 的ip地址;

1、 执行命令给容器配置ip:

pipework bridge0 pipework_test 192.168.139.210/[email protected]

#192.168.139.210是给容器配置的ip,应考虑避免网段中是否已有该ip;
#192.168.139.2是网关,也就是宿主机网关;
.

五、测试通信;

到容器中查看:
docker容器利用pipework桥接网络跨主机通信_第6张图片
多出来一个eth1的网卡;
ok;再来看一下路由和dns:
docker容器利用pipework桥接网络跨主机通信_第7张图片
正常;
最后ping一下百度:
docker容器利用pipework桥接网络跨主机通信_第8张图片
ok;到此完毕;

.

  • 注: 容器重启后会导致pipework配置的ip消失;
    *可以通过shell脚本进行自动化ip的配置,具体看个人应用情况了;