文章目录
前言
一、使用docker原生网络驱动macvlan
二、使用docker原生网驱动Overlay+consul
总结
目前大家使用docker容器来部署服务越来越普遍,当我们需要在多个docker容器里实现跨宿主机通信时就会遇到网络问题,本文就此问题提供解决方案
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运行在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配置文件,如图
#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节点,如图
STEP4:在consul所在宿主机创建overlay网络
192.168.2.7创建命令:docker network create -d overlay qsdi-net
另一台宿主机将同步192.168.2.7创建的overlay网络
STEP5:启动容器(docker-compose)
该方式不需要指定IP,容器启动成功后,通过docker network inspect a34bf8d96d3e查看对应的IP,同时进入容器,通过ping 网络命名或IP均通
第一种方式就ok了
以上就是今天要讲的内容,本文说明了docker容器在跨宿主机的情况下如何通信的问题