Docker-compose external_links无法连接

时间:2016-12-07 08:39:51

标签: docker docker-compose

我想要连接到mongodb容器的几个app容器。我尝试使用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

3 个答案:

答案 0 :(得分:11)

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 network create -d bridge custom

搬运工-撰写-1.yml

    version: '2'

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

    networks:
      custom:
        external: true

搬运工-撰写-2.yml

    version: '2'

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

    networks:
      custom:
        external: true

答案 1 :(得分:3)

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

答案 2 :(得分:0)

最近我遇到了 Name resolution failure ,试图链接由docker-compose v3处理的代表我的情况下代表gRPC服务器和客户端的2个容器,但是失败了,并带有external_links。 / p>

  

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

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

  

如果您使用的是版本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 )时,用于配置客户端容器的技巧在前缀中 强>。在我的情况下,与project-grpc-server_一起使用时,网络名称的前缀为 docker-compose ,而名称本身为some-network project-grpc-server_some-network )。因此,在处理单独的版本时应传递完全合格的网络名称。

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

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