如何找到 Docker Compose v2 格式的链接服务的公开端口?

How to find exposed port of linked service with Docker Compose v2 format?

在 docker-compose legacy yml 如果你 link 一个服务它用来创建一个环境变量 servicename_PORT 你可以用它来发现 linked 容器。在新的 v2 格式中,我们有用户定义的网络,它将服务名称添加到内部 DNS,因此我们可以连接到 linked 服务,但是我们如何找到 linked 服务公开的端口?我能想到的唯一方法是为每个 linked 服务创建一个环境变量,我可以在其中放置端口,但随后我将在 docker-compose: 中两次使用相同的端口服务本身的公开部分,并且曾经作为连接到它的服务中的环境变量。有没有更干的方法来发现暴露的端口?

它是容器中服务 运行 的任何端口。端口映射不适用于容器<->容器通信,仅适用于主机<->容器通信。

例如:

version: '2'

services:
  a:
    ...
    networks:
    - my-net
  b:
    ...
    networks:
    - my-net
networks:
  my-net:

假设 a 是 运行 端口 8080 的网络服务器,b 可以通过向 a:8080 发送请求来攻击它。

为此,您通常使用注册器 + 服务发现,这意味着像 https://www.consul.io / 注册器

这样的服务

基本上,这为您添加了一个 API 来为您的服务定义(端口/ ip)观看 kv 存储,然后可以是随机的,或者甚至使用 consul 中包含的 DNS。后者对端口没有帮助,这就是您使用注册表的目的。

如果你想避开这个最佳实践方式。安装 docker 套接字并使用 docker inspect <servicename> 查找端口。

services:
  other:
    container_name: foo
    image: YYYY
  theonedoingthelookup:   
    image: ZZZZ
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

您需要在容器中安装 docker cli 工具,然后 运行 在 ZZZZ 容器中安装

docker inspect YYYY

使用一些 grep / awk / 过滤器来提取你需要的信息