是否可以在docker-compose中同时使用网络默认设置和外部外部设置?

时间:2020-04-24 02:07:03

标签: docker docker-compose docker-networking

我有两个services

  • 服务A:就像数据库服务

  • 服务B:就像后端服务

我希望服务B可以向外界请求(例如curl google.com),还可以使用别名(或其他方式)连接到服务A。 因为,我不想将服务A的IP公开给外部。 容易吗?

docker-compose.yml看起来像这样:

version: "3"

services:
  serviceB:
    build: ./serviceB
    networks:
      - outside
      - default
  serviceA:
    build: ./serviceA
    networks:
      - default

networks:
  outside:
    external: true

1 个答案:

答案 0 :(得分:1)

绝对不做任何事;删除所有networks:声明。它将按照您的描述工作。

容器没有“公共IP”;除非您发布了ports:,否则您将无法从Docker空间外部访问容器。 (一个容器完全具有一个IP地址只是实现细节,它们只能从本机Linux主机上的Docker外部访问,然后只能从同一主机访问;您几乎不需要直接查找或使用它们地址。)

使用现成的Docker设置,容器可以建立出站连接。您无需为此进行任何配置。

只要两个Compose服务位于同一网络(包括自动隐式default网络)上,它们就可以使用其Compose服务名称作为主机名相互访问。

因此,如果我们将您的docker-compose.yml文件重写为:

version: "3"
services:
  serviceB:
    build: ./serviceB
    ports: ['3333:3000']
  serviceA:
    build: ./serviceA

然后:

  • 无法从Docker空间外部访问服务A;可以通过主机IP地址上的3333端口访问服务B。
  • 服务B可以使用serviceA作为主机名来访问服务A(反之亦然)
  • 服务A和B都可以呼叫公共Internet,LAN上的其他系统,等。

Networking in Compose拥有一些有关工作原理的官方文档。