我有一个Docker Swarm集群设置,如下所示:

在节点1上设置

docker swarm init --advertise-addr ${NODE_1_IP} --data-path-port=7789

在节点2上设置
docker swarm join --advertise-addr ${NODE_2_IP} --token XXX ${NODE_1_IP}:2377

然后,我在两个节点上安装了weave,如下所示。
sudo curl -L git.io/weave -o /usr/local/bin/weave
sudo chmod a+x /usr/local/bin/weave

docker plugin install weaveworks/net-plugin:latest_release
docker plugin disable weaveworks/net-plugin:latest_release

docker plugin set weaveworks/net-plugin:latest_release WEAVE_PASSWORD=XXX
docker plugin enable weaveworks/net-plugin:latest_release

我想设置一个密码,因为我需要对网络进行加密。
然后,我建立了网络和服务。该约束使服务由在节点2上运行的一个容器组成。
docker network create --driver=weaveworks/net-plugin:latest_release --attachable testnet_weave_encrypted

docker service create --network=testnet_weave_encrypted --name web_encrypted --publish 80 --replicas=1  --constraint 'node.labels.datastore001 == true' nginx:latest

最后,我在节点1上运行的另一个容器中对其进行测试:
docker run --rm --name alpine --net=testnet_weave_encrypted -ti alpine:latest sh
apk add --no-cache curl
curl web_encrypted

这将失败,并显示以下消息:
curl: (7) Failed to connect to web_encrypted port 80: Host is unreachable

我知道web_encrypted没错,因为当我尝试不同的值时会遇到不同的错误。

将头撞在墙上几小时后,我发现可以在节点1上执行以下操作:
curl web_encrypted.1.lsrdyz8n66jdotaqgdzk9u1uo

而且有效!

但这当然对我没有用,因为每次服务重新创建时,确切的容器名称都会更改。

这是weave插件中的错误,还是我错过了设置此步骤的步骤?

最佳答案

如果将endpoint_mode指定为DNSRR,则应该能够使用服务名称以及您指定的任何别名。下面的代码段中的weavenet网络是使用Weave网络插件创建的。

host#docker service create --network name=weavenet,alias=ngx --endpoint-mode=dnsrr --name nginx nginx
host#docker run -it -d --name alpine --network=weavenet alpine:curl
host#docker exec -it alpine sh
/ # curl nginx
<!DOCTYPE html>
<html>
....
/ # curl ngx
<!DOCTYPE html>
<html>

关于docker - 使用Weave Net Docker Swarm Adapter允许服务进行通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60005936/

10-16 16:44