UU Blog

Docker Swarm Mode中容器多网络多IP registrator注册服务IP的问题

问题描述

在这篇文章《Docker Swarm Mode中部署SpringCloud微服务》之后

遇到了点新问题。

在运行时指定自己网络的时候,容器里面多个网络,多个IP,但是注册的不是固定注册某个网卡的IP作为服务IP。

这就导致有时候注册的IP不是属于overlay网络的IP。服务访问就会出现问题。

如果是用rencher部署的话,它有一个label记录了容器IP。可以用registrator-useIpFromLabel读取它label。而docker swarm并没有记录相关IP到label 也就不能用这个参数。

所以我fork了registrator的最新源码,做了点修改。让它支持可以传入在运行docker时,attach的network名字,根据这个网络名字在它container信息中取得它IP。

如我前面运行docker的服务的时候指定--network=micro-service

那么我运行registrator的时候,用我修改过的镜像doubleshit/registrator:v7指定-useIpFromNetworkName=micro-service参数即可。

如:

1
2
3
4
5
6
7
8
9
10
11
docker run -d \
--restart=always \
--name=registrator \
--net=host \
--volume=/var/run/docker.sock:/tmp/docker.sock \
doubleshit/registrator:v7 \
-cleanup \
-internal \
-ip <NODE_IP> \
-useIpFromNetworkName=micro-service \
consul://<NODE_IP>:8500

修改后的源码:https://github.com/onecer/registrator

commit的时候信息network写成了netword无视就好 哈哈

给作者打一针鸡血