猿问

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

我设置了 Dockerfile 和 docker-compose.yml 文件,但不确定它们是否正确,我无法在没有错误的情况下运行它。


我的 Dockerfile 是:


FROM golang:1.14-alpine

RUN mkdir /app

ADD . /app

WORKDIR /app

RUN go get

RUN 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-alpine

RUN mkdir /app

ADD . /app

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download

COPY . .

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



梵蒂冈之花
浏览 212回答 2
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

莫回无

所以上面用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 是您在项目中使用的变量
随时随地看视频慕课网APP

相关分类

Go
我要回答