【问题标题】:Is it possible to use both network default and outside external in docker-compose?是否可以在 docker-compose 中同时使用网络默认值和外部外部?
【发布时间】:2020-04-24 02:07:03
【问题描述】:

我有两个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

【问题讨论】:

    标签: docker docker-compose docker-networking


    【解决方案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、局域网上的其他系统,等等。

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

    【讨论】:

    • 感谢您的回复,但是在serviceB,我无法到达外面,没有network_mode:"bridge"
    • 这是默认设置(如果您不在 Swarm 模式下),您不需要明确指定它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2017-10-22
    相关资源
    最近更新 更多