【问题标题】:Access docker ports from a container inside another container at localhost从 localhost 的另一个容器内的容器访问 docker 端口
【发布时间】:2020-05-02 10:08:27
【问题描述】:

我有一个使用 docker-compose 构建 2 个 docker 的设置。

1 容器是一个 Web 应用程序。我可以使用端口8080 访问它。另一个容器是 ElasticSearch;可通过端口9200 访问。

这是我的docker-compose.yml 文件的内容:

version: '3'
services:
  serverapplication:
    build: "serverapplication"
    entrypoint:
      - bash
      - -x
      - init.sh
    command: ["jdbcUrl=${jdbcUrl} dbUser=${dbUser} dbUserPassword=${dbUserPassword}"]
    ports:
      - "8080:8080"
      - "8443:8443"
      - "8787:8787"
  elasticsearch:
    build: "elasticsearch"
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
      - "9300:9300"

当我浏览到http://localhost:8080/serverapplication 时,我可以看到我的服务器应用程序。 当我浏览到http://localhost:9200/ 时,我可以看到 ElasticSearch 的默认页面。

但是当我尝试从服务器应用程序内部访问 ElasticSearch 时,我收到“连接被拒绝”。似乎服务器应用程序在本地主机上无法访问 9200 端口。

我该如何解决这个问题?

【问题讨论】:

    标签: docker elasticsearch docker-compose


    【解决方案1】:

    您的服务器应用程序必须使用主机名elasticsearch 才能访问elasticsearch 服务,即http://elasticsearch:9200

    您的 serverapplication 和 elasticsearch 在不同的容器中运行。 serverapplicationlocalhostelasticsearchlocalhost 不同。

    docker-compose 在容器之间建立一个网络,以便可以使用它们的服务名称访问它们。因此,从您的serverapplication,您必须使用名称“elasticsearch”来连接它。

    【讨论】:

      【解决方案2】:

      使用 localhost 从来都不是安全的,因为 localhost 对于您的主机系统、elasticsearch 和您的服务器应用程序意味着其他东西。您只能从主机的 localhost 访问容器,因为您将容器端口映射到主机的端口。

      1. 将它们放在同一个网络中
      2. 为容器命名
      3. 通过其容器名称访问 elasticsearch,Docker 会自动将其解析为您的 elasticsearch 容器的当前 IP。

      代码:

      version: '3'
      services:
        serverapplication:
          container_name: serverapplication
          build: "serverapplication"
          entrypoint:
            - bash
            - -x
            - init.sh
          command: ["jdbcUrl=${jdbcUrl} dbUser=${dbUser} dbUserPassword=${dbUserPassword}"]
          ports:
            - "8080:8080"
            - "8443:8443"
            - "8787:8787"
          networks:
            - my-network
      
        elasticsearch:
          container_name: elasticsearch
          build: "elasticsearch"
          environment:
            - discovery.type=single-node
          ports:
            - "9200:9200"
            - "9300:9300"
          networks:
            - my-network
      
      networks:
        my-network:
          driver: bridge
      

      【讨论】:

      • 我需要配置名为“elasticsearch”的elasticsearch网络主机的备注3是什么意思?
      • container_name: 和任何手动 networks: 配置都不是必需的,为了简单起见,我建议删除这些。
      • 我不同意,当你还在学习的时候,明确的更重要。即使你不是,仍然有争论。至少他现在更容易理解为什么 elasticsearch:9200 有效。我知道创建了一个默认的桥接网络,这就是为什么没有必要把它放在那里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 2019-04-28
      • 2019-06-13
      • 2021-03-04
      相关资源
      最近更新 更多