精讲docker跨主机通信

Posted Friends of the wind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精讲docker跨主机通信相关的知识,希望对你有一定的参考价值。


概述

跨主机网络意味着将不同主机上的容器用同一个虚拟网络连接起来。这个虚拟网络的拓扑结构和实现技术叫网络模型。


提示:本节介绍最常用两种,Docker overlay、Macvlan

一、Docker overlay

是 overlay 网络,建立主机间 VxLAN 隧道,原始数据包在发送端被封装成 VxLAN 数据包,到达目的后在接收端解包。

案例

1.环境

暂时不考虑防火墙和selinux安全问题。将3台dockerhost防火墙和selinux全部关闭,并且分别更改主机名称。

主机名IP
docker01172.16.0.128
docker02172.16.0.144
docker023172.16.0.145

2.配置

docker01操作

1)下载,运行consul服务
提示:Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。下载省略。

docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap

2)浏览器访问,以验证consul是否正常
Serf Health Status状态是 serfHealth,表示正常


docker02、docker03操作

3)修改docker02和docker03的docker配置文件
vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://172.16.0.128:8500 --cluster-advertise=ens33:2376
重载内核,重启docker服务
systemctl daemon-reload
systemctl restart docker

4)浏览器验证:可以查看到刚添加的两个节点

5)docker02操作
自定义网络(docker03不用创建也能看到此网络)
docker network create -d overlay ov_net1

6)创建测试容器

docker02创建容器(提前下载并载入镜像busybox)
docker run -itd --name bbox1 --net ov_net1 busybox

docker03创建容器(提前下载并载入镜像busybox)
docker run -itd --name bbox2 --net ov_net1 busybox

7)验证:
注意:有的容器不能用容器名ping通,但却可以用ip地址ping通

Linux宿主机测试:docker exec -it bbox2 ping bbox1

二、Macvlan

网络在二层上通过 VLAN 连接容器,在三层上依赖外部网关连接不同 macvlan。数据包直接发送,不需要封装,属于 underlay 网络。

案例

1.环境同上

但用两台虚拟机即可

2.docker01和docker02操作

1)打开网卡的混杂模式
//需要在docker01和docker02上都进行操作。
ip link set ens33 promisc on
验证:
ip link show ens33

2)在docker01上创建macvlan网络

docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1

提示: -o parent=绑定在哪张网卡之上

基于创建的macvlan网络运行一个容器

docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox

3)docker02操作

在docker02上创建macvlan网络,注意与docker01上的macvlan网络一模一样。

docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1

基于创建的macvlan网络运行一个容器

docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox

4)验证:
在docker02上,登录bbox2测试ping bbox1

docker exec -it bbox2 /bin/sh


以上是关于精讲docker跨主机通信的主要内容,如果未能解决你的问题,请参考以下文章

Docker跨主机通信网络

Docker容器跨主机通信之:直接路由方式

Docker容器跨主机多网段通信解决方案

Docker 跨主机网络(十六)

利用etcd实现docker跨主机通信

部署Flannel,实现跨主机Docker容器通信