使用Docker Compose隔离服务网络

88次阅读
没有评论

问题描述

在使用Docker Compose时遇到一个问题,他希望能够隔离两个容器化的服务A和B的网络通信。另外,还有一个共享服务C,该服务不与A或B隔离,并且可以与它们中的任何一个进行通信。

使用Docker Compose隔离服务网络

他尝试通过以下的docker-compose.yaml文件来实现这个目标:

version: "3.3"
services:
  C:
    build: C
    depends_on:
      - A
      - B
    expose:
      - 8080
    networks:
      - A
      - B
  A:
    build: A
    expose:
      - 8080
    networks:
      - A
  B:
    build: B
    expose:
      - 8080
    networks:
      - B
networks:
  A:
    internal: true
  B:
    internal: true

通过这个配置,C可以通过A:8080和B:8080连接到A和B,并且A和B被隔离,符合需求。然而,A和B无法通过C:8080连接到C。当从配置中移除网络选项后,所有服务都可以互相通信。用户想知道他做错了什么。

解决方案

在你的配置中,服务C的问题可能出现在服务C的网络设置上。以下是可能的解决方案:

确保服务C的监听地址正确

在你的配置中,服务C的容器似乎在localhost:8080上进行监听。然而,容器内的localhost并不是指向容器本身,而是指向容器的局部环境。你应该将服务C绑定到C:8080,以便在容器内部的网络中让其它容器能够访问。

理解服务监听配置

服务A和B的配置中绑定到localhost:8080是有效的,因为Docker会自动将这些绑定映射到容器的IP地址。但对于服务C,Docker可能不会自动执行相同的映射,因为C可能位于不同的网络子网(由于internal: true)。

更新服务C的监听配置

在服务C的配置中,确保将监听地址绑定到C:8080,以便能够在容器内部的网络中访问。这样,A和B将能够通过C:8080连接到C。

version: "3.3"
services:
  C:
    build: C
    depends_on:
      - A
      - B
    expose:
      - 8080
    networks:
      - A
      - B
  A:
    build: A
    expose:
      - 8080
    networks:
      - A
  B:
    build: B
    expose:
      - 8080
    networks:
      - B
networks:
  A:
    internal: true
  B:
    internal: true

通过将服务C的监听地址配置为C:8080,你应该能够让A和B通过C:8080连接到C。确保在更新配置后重新构建和部署你的容器化服务。

如果你遇到进一步的问题,可以检查服务C是否正确监听容器内部的网络地址,以及容器之间的网络通信是否受到正确的网络配置影响。

正文完