精讲docker跨主机通信
Posted Friends of the wind
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精讲docker跨主机通信相关的知识,希望对你有一定的参考价值。
概述
跨主机网络意味着将不同主机上的容器用同一个虚拟网络连接起来。这个虚拟网络的拓扑结构和实现技术叫网络模型。
提示:本节介绍最常用两种,Docker overlay、Macvlan
一、Docker overlay
是 overlay 网络,建立主机间 VxLAN 隧道,原始数据包在发送端被封装成 VxLAN 数据包,到达目的后在接收端解包。
案例
1.环境
暂时不考虑防火墙和selinux安全问题。将3台dockerhost防火墙和selinux全部关闭,并且分别更改主机名称。
主机名 | IP |
---|---|
docker01 | 172.16.0.128 |
docker02 | 172.16.0.144 |
docker023 | 172.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跨主机通信的主要内容,如果未能解决你的问题,请参考以下文章