Docker容器实现跨宿主机通信

文章目录

前言

一、使用docker原生网络驱动macvlan

二、使用docker原生网驱动Overlay+consul

总结


前言

  目前大家使用docker容器来部署服务越来越普遍,当我们需要在多个docker容器里实现跨宿主机通信时就会遇到网络问题,本文就此问题提供解决方案

一、使用docker原生网络驱动macvlan

  Docker 官方在1.12版本之后引入macvlan网络驱动,可以简单的为容器配置桥接网络,原理:在宿主机物理网卡上虚拟出多个子网卡,通过不同的MAC地址在数据链路层进行网络数据转发,但需要linux内核支持(Linux kernel v3.9–3.19 and 4.0+),macvlan模式不依赖网桥,所以brctl show查看并没有创建新的bridge。

  

实现方案步骤:

1.将物理网卡设置混杂模式

ip link set eno1 promisc on

2.创建macvlan,每台宿主机均执行

docker network create -d macvlan --subnet 172.19.0.0/24 --gateway 172.19.0.1 -o parent=网卡名 网络别名

3.docker-compose修改networks指定容器ip(根据创建macvlan网段)

Docker容器实现跨宿主机通信_第1张图片

 

二、使用docker原生网驱动Overlay+consul

  使用前提条件:

  docker运行在Swarm模式(Swarm是Docker的一个编排工具)或 使用键值存储docker主机集群。

使用键值实现需要满足以下条件:

1.集群中主机连接到键值存储,Docker支持Consul、Etcd和Zookeeper;

2.集群中主机运行一个Docker守护进程;

3.集群中主机必须具有唯一的主机名,因为键值存储使用主机名来标识集群成员;

4.集群中Linux主机内核版本3.12+,支持VXLAN数据包处理,否则可能无法通信

使用键值实现具体步骤:

准备两台宿主机:192.168.2.7和192.168.2.63

STEP1:

选择一台宿主机拉取consul镜像或直接运行命令(部分consul版本的KV访问异常)

docker run -di  -h consul -p 8500:8500 --name=consul consul:1.5.2

STEP2:

修改宿主机docker配置文件,如图

Docker容器实现跨宿主机通信_第2张图片

#192.168.2.7 /etc/docker/daemon.json

"cluster-store": "consul://192.168.2.7:8500",

"cluster-advertise": "192.168.2.7:2376",

"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],

"live-restore":true

修改保存2.7执行:

systemctl daemon-reload

systemctl restart docker

#192.168.2.63 /etc/docker/daemon.json

"cluster-store": "consul://192.168.2.7:8500",

"cluster-advertise": "192.168.2.63:2376",

"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],

"live-restore":true

修改保存2.63执行:

systemctl daemon-reload

systemctl restart docker

STEP3:consul查看docker节点,如图

Docker容器实现跨宿主机通信_第3张图片

 

STEP4:在consul所在宿主机创建overlay网络

192.168.2.7创建命令:docker network create -d overlay qsdi-net

Docker容器实现跨宿主机通信_第4张图片

 另一台宿主机将同步192.168.2.7创建的overlay网络

 STEP5:启动容器(docker-compose)

 Docker容器实现跨宿主机通信_第5张图片

 该方式不需要指定IP,容器启动成功后,通过docker network inspect a34bf8d96d3e查看对应的IP,同时进入容器,通过ping 网络命名或IP均通

Docker容器实现跨宿主机通信_第6张图片

 第一种方式就ok了


总结

以上就是今天要讲的内容,本文说明了docker容器在跨宿主机的情况下如何通信的问题

你可能感兴趣的:(docker,linux,docker,linux)