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、执行结果;
5、需要 systemctl restart network 重启网卡;
重启后 ssh 192.168.139.200 进行连接;通过 ip a 命令可以看到:
原有的物理网卡 ens33 没有了ip,创建的 br_1 是我们设定的ip;再通过 brctl show 查看:
br_1桥接到了原有的物理网卡ens33上;但此时如果你ping百度的话应该是不通的,根据错误进行排查是路由问题还是dns问题:
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
none网络是只有lo网卡的;
四、使用pipework进行配置容器 pipework_test 的ip地址;
1、 执行命令给容器配置ip:
pipework bridge0 pipework_test 192.168.139.210/24@192.168.139.2
#192.168.139.210是给容器配置的ip,应考虑避免网段中是否已有该ip;
#192.168.139.2是网关,也就是宿主机网关;
五、测试通信;
到容器中查看:
多出来一个eth1的网卡;
ok;再来看一下路由和dns:
正常;
最后ping一下百度:
ok;到此完毕;
- 注: 容器重启后会导致pipework配置的ip消失;
- 可以通过shell脚本进行自动化ip的配置,具体看个人应用情况了;