【问题标题】:Docker-compose external_links not able to connectDocker-compose external_links 无法连接
【发布时间】:2016-12-07 08:39:50
【问题描述】:

我有几个要连接到 mongodb 容器的应用程序容器。我尝试使用 external_links 但无法连接到 mongodb。

我明白了

MongoError: 首先连接到服务器 [mongodb:27017] 失败 连接

我是否必须将容器添加到同一网络才能使 external_links 正常工作?

MongoDB:

version: '2'
services:
  mongodb:
    image: mongo:3.4
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - data:/data/db
volumes:
  data:

应用:

version: '2'
services:
  app-dev:
    restart: Always
    build: repository/
    ports:
      - "3000:80"
    env_file:
      - ./environment.env
    external_links:
      - mongodb_mongodb_1:mongodb

网络:

# sudo docker network ls
NETWORK ID          NAME                      DRIVER              SCOPE
29f8bae3e136        bridge                    bridge              local
67d5519cb2e6        dev_default               bridge              local
9e7097c844cf        host                      host                local
481ee4301f7c        mongodb_default           bridge              local
4275508449f6        none                      null                local
873a46298cd9        prod_default              bridge              local

【问题讨论】:

标签: docker docker-compose


【解决方案1】:

https://docs.docker.com/compose/compose-file/#/externallinks 的文档说

If you’re using the version 2 file format, the externally-created containers must be connected to at least one of the same networks as the service which is linking to them.

例如:

创建一个新的 docker 网络

docker network create -d bridge custom

docker-compose-1.yml

    version: '2'

    services:
      postgres:
        image: postgres:latest
        ports:
          - 5432:5432
        networks:
          - custom

    networks:
      custom:
        external: true

docker-compose-2.yml

    version: '2'

    services:
      app:
        image: training/webapp
        networks:
          - custom
        external_links:
          - postgres:postgres

    networks:
      custom:
        external: true

【讨论】:

  • 嗨。你能举个例子说明如何将它们连接到同一个网络吗?
  • 解决了我的问题。很棒的答案@yuva。也适用于版本 3。
  • 完全不知道external_links 需要什么?如果您将两个 composes 都加入同一个网络,例如docker-compose-1docker-compose-2 都有 networks: {custom: {external: true}},然后在彼此中定义的服务已经可以通过它们的名称访问,而没有 external_links。只是为了明确说明依赖关系吗?
  • @tosh 也许另一个好处是您可以为外部网络定义别名:这意味着您可以在命名网络/项目时有意义的配置和容器看到的配置之间分开:external_links: ... -shared_network_service:what_the_container_sees
【解决方案2】:

Yuva 上面对第 2 版的回答也适用于第 3 版。

external_links 的文档不够清晰。

为了更清楚,我粘贴了带有注释的版本 3 变体

version: '3'

services:
  app:
    image: training/webapp
    networks:
      - <<network created by other compose file>>
    external_links:
      - postgres:postgres

networks:
  <<network created by other compose file>>:
    external: true

【讨论】:

    【解决方案3】:

    最近我遇到 Name resolution failure 试图链接由 docker-compose v3 处理的 2 个容器,在我的情况下代表 gRPC 服务器和客户端,但失败并使用 external_links

    我可能会复制这里发布的一些信息,但会尝试总结 因为所有这些都帮助我解决了问题。

    来自external_links docs(如之前的回答中所述):

    如果您使用的是第 2 版或更高版本文件格式,则外部创建的 容器必须连接到至少一个与链接到它们的服务相同的网络


    以下配置解决了这个问题。

    project-grpc-server/docker-compose.yml

    version: '3'
    services:
        app:
            networks:
                - some-network
    networks:
        some-network:
    

    按预期配置服务器容器。


    project-grpc-client/docker-compose.yml

    services:
        app:
            external_links:
                # Assigning easy alias to the target container
                - project-grpc-server_app_1:server
            networks:
                # Mentioning current container as a part of target network
                - project-grpc-server_some-network
    networks:
        # Announcing target network (where server resides)
        project-grpc-server_some-network:
            # Telling that announced network already exists (shouldn't be created but used)
            external: true
    

    使用默认值未配置container_name)时,配置客户端容器的技巧在前缀中 .在我的情况下,网络名称在使用docker-compose 时具有前缀project-grpc-server_,而不是名称本身some-network (project-grpc-server_some-network)。因此,在处理单独的构建时应该传递完全限定的网络名称。

    虽然容器名称很明显,因为它不时出现在屏幕上,但在第一次面对 Docker 的这一部分时,完整的网络名称并不是容易猜测的候选者,除非docker network ls

    我不是 Docker 专家,所以如果这一切在 Docker 世界中是显而易见且必不可少的,请不要判断得太严格。

    【讨论】:

    • 我仍然收到未定义网络的错误,在你的情况下是“project-grpc-server_some-network”
    • @etotientz 很奇怪。您确定您的“服务器”网络名称与您在“客户端”docker-compose.yml 中提到的相同(尝试docker network ls 找出答案)吗?此外,为了避免以项目所在文件夹名称命名的自动前缀,您可以设置 COMPOSE_PROJECT_NAME=my-server 例如在您的.env 文件中,您的容器将具有固定前缀,因此网络名称也可以更可预测。
    • 使用 services.app.container_name=app 固定容器的名称。
    猜你喜欢
    • 2016-05-11
    • 2021-06-16
    • 1970-01-01
    • 2015-05-19
    • 2018-09-02
    • 2017-07-05
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多