为了账号安全,请及时绑定邮箱和手机立即绑定

无法从一个容器连接到另一个容器

无法从一个容器连接到另一个容器

Go
梵蒂冈之花 2022-06-21 15:51:55
我设置了 Dockerfile 和 docker-compose.yml 文件,但不确定它们是否正确,我无法在没有错误的情况下运行它。我的 Dockerfile 是:FROM golang:1.14-alpineRUN mkdir /appADD . /appWORKDIR /appRUN go getRUN go run server.go我的 compose.yml 是:version: "3.5"services:  elasticsearch:    container_name: "elasticsearch"    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0    ports:      - 9200:9200  gqlgen:    container_name: "gqlgen"    build: ./    restart: "on-failure"    ports:      - "8080:8080"    depends_on:      - elasticsearch这是我文件夹的根目录的样子:我试图docker-compose up从根目录运行:这是我得到的:panic: Get "http://127.0.0.1:9200/": dial tcp 127.0.0.1:9200: connect: connection refused我想我的设置错误。更新:根据我在网上阅读的建议和更多内容,我将 DOCKERFILE 更改为:FROM golang:1.14-alpineRUN mkdir /appADD . /appWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN go build -o server .CMD ["./server"]并撰写文件:version: "3.5"services:  elasticsearch:    container_name: "elasticsearch"    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0    environment:      - node.name=elasticsearch      - cluster.name=es-docker-cluster      - bootstrap.memory_lock=true      - cluster.initial_master_nodes=elasticsearch      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"    ulimits:      memlock:        soft: -1        hard: -1    ports:      - 9200:9200  golang:    container_name: "golang"    build:      context: .      dockerfile: Dockerfile    ports:      - "8080:8080"    restart: unless-stopped    depends_on:      - elasticsearch它现在可以正确构建。但与运行相同的问题docker-compose up。panic: Get "http://elasticsearch:9200/": dial tcp 172.18.0.2:9200: connect: connection refused
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您遇到了问题,因为您错误地处理了 Elasticsearch。


内部 docker 容器127.0.0.1指的是容器本身,因此您的应用程序试图在没有容器的地方找到 Elasticsearch。


从另一个引用一个 docker 容器的正确方法是使用 docker 容器名称。因此,在您的情况下,它将使用 name: elasticsearch。


编辑:您的配置还有另一个问题。您错过了 Elasticsearch 配置的一些重要元素。


在这里,您有一个单节点 Elasticsearch 集群的最低配置片段。


services:

  elasticsearch:

    container_name: "elasticsearch"

    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0

    environment:

      - node.name=elasticsearch

      - cluster.name=es-docker-cluster

      - bootstrap.memory_lock=true

      - cluster.initial_master_nodes=elasticsearch

      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

    ulimits:

      memlock:

        soft: -1

        hard: -1

    ports:

      - 9200:9200

我之前写的一切仍然有效。修改 docker-compose 后,您通过引用 Elasticsearch 的最后一个版本http://elasticsearch:9200应该可以正常工作。


编辑:


正如@David Maze 指出的那样,您的示例中存在第三个问题。而不是RUN go run server.go你应该有CMD go run server.go. 当您想在容器中运行您的应用程序时,您正在做的是在构建期间运行您的应用程序。


更传统的方法是构建应用程序,而不是复制源代码,将二进制文件复制到容器并在容器内运行二进制文件。在这里你有一些信息:https ://medium.com/travis-on-docker/multi-stage-docker-builds-for-creating-tiny-go-images-e0e1867efe5a


查看完整回答
反对 回复 2022-06-21
?
莫回无

TA贡献1865条经验 获得超7个赞

所以上面用elasticsearch替换localhost的动作是正确的。但这只有在您使用 docker-compose 启动时才会发生。不要尝试使用 elasticsearch 而不是主机从 IDE 调用 elasticsearch。我建议让 elasticsearch 的主机可配置,本地配置保持 localhost,但您可以在 docker-compose 文件中覆盖它。


version: "3.5"


services:

  elasticsearch:

    container_name: "elasticsearch"

    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0

    environment:

      - node.name=elasticsearch

      - cluster.name=es-docker-cluster

      - bootstrap.memory_lock=true

      - cluster.initial_master_nodes=elasticsearch

      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

    ulimits:

      memlock:

        soft: -1

        hard: -1

    ports:

      - 9200:9200

  golang:

    container_name: "golang"

    build:

      context: .

      dockerfile: Dockerfile

    ports:

      - "8080:8080"

    restart: unless-stopped

    depends_on:

      - elasticsearch

    environment:

      - ELASTICSEARCH_HOST: elasticsearch

其中 ELASTICSEARCH_HOST 是您在项目中使用的变量


查看完整回答
反对 回复 2022-06-21
  • 2 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信