Docker容器发现(按主机名)';行不通

Docker容器发现(按主机名)';行不通,docker,docker-swarm,docker-networking,docker-stack,docker-network,Docker,Docker Swarm,Docker Networking,Docker Stack,Docker Network,我使用位于/tmp/compose.yml的以下docker compose文件进行docker堆栈部署: version: "3.6" services: service-A: image: service-A networks: - net hostname: "service-A-{{.Task.Slot}}" deploy: replicas: 2 service-B: image: service-B

我使用位于
/tmp/compose.yml
的以下docker compose文件进行docker堆栈部署:

version: "3.6"

services:
  service-A:
    image: service-A
    networks:
      - net
    hostname: "service-A-{{.Task.Slot}}"
    deploy:
      replicas: 2

  service-B:
    image: service-B
    networks:
      - net
    hostname: "service-B-{{.Task.Slot}}"
    deploy:
      replicas: 2

networks:

  net:
运行命令:

docker network create -d overlay net
docker stack deploy -c /tmp/compose.yml my
我的期望是,
service-A
单个容器将能够通过容器预定义的主机名发现
service-B
容器:
service-B-1、service-B-2
。 但是,从任何
service-A
容器内ping service-B-1失败

声明:

hostname设置容器识别自身的主机名。这是写的 输入/etc/hostname,输入/etc/hosts作为容器的 面向主机的IP地址,并且是/bin/bash在 容器将显示在其提示符内。但是主机名并不容易 从容器外面看。它不会出现在docker ps或 在任何其他容器的/etc/hosts文件中

如何通过容器预定义的主机名实现docker swarm服务容器到服务容器的通信

唯一有效的方法是添加以下条目:

[service_B_container_1_virtual_ip] service-B-1
[service_B_container_2_virtual_ip] service-B-2
/etc/hosts
服务-A
容器

同样有趣的是,如果
hostname
不是在
docker composes
文件中设置的,而是由docker生成的,
ping[container\u id]
即使在多主机docker swarm中也能成功


对于预定义的主机名,我期望有相同的行为

我认为没有任何直接的方法可以做到这一点。我想得越多,就越有理由认为,不应该有一种方式,通过设计来实现你的要求

堆栈服务的一个基本属性是,它的部署方式应使Docker能够互换地处理该服务中的所有副本。如果您需要连接到单个实例,它建议首先不要将这些容器创建为服务副本,因为它们之间存在一些区别。一个合适的堆栈服务应该能够将每个副本视为一个可以随时销毁和重建的短暂实体,并且操作应该从外部看不到

您可以在Docker网络内部使用服务名称引用服务实体。因此,在您的示例中,
pingservice-A
应该可以从堆栈中的任何容器中工作,而
pingservice-B
也可以

服务中单个容器的名称如下

my_stack_redis.1.y1pwzeg8239yb6n6ynefs78br
my_stack_webserver.1.d6cxx8nlg7db9m2poy9wfjdyd
如果您必须从容器中访问这些名称,那么我能想到的唯一方法就是在启动时通过绑定挂载在容器中公开
/var/run/docker.sock
。然后,
chmod 750
作为
CMD/ENTRYPOINT
脚本的一部分放在套接字上,以便非root用户可以读取它。现在,您应该能够安装Docker CLI并使用
Docker network inspect
查找实际服务成员的名称,并使用
jq
解析它们(您可能需要将这两个包都添加到映像中)。但在这一点上,更好的选择可能是将这些不可替代的容器划分为各自的服务组