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

时间:2020-08-01 12:03:57

标签: docker go elasticsearch docker-compose

我已经设置了一个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

这是我文件夹的根目录:

enter image description here

我试图从根目录运行: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

2 个答案:

答案 0 :(得分:1)

您遇到了问题,因为您不正确地处理了Elasticsearch。

内部docker容器127.0.0.1指的是容器本身,因此您的应用正在尝试查找没有容器的Elasticsearch。

从另一个引用一个Docker容器的正确方法是使用docker容器名称。因此,在您的情况下,它将使用名称: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之后,编写您的上一个版本,该版本通过http://elasticsearch:9200引用Elasticsearch应该可以正常工作。

编辑:

正如@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

答案 1 :(得分:0)

因此,用elasticsearch替换localhost的上述操作是正确的。 但这仅在您使用docker-compose启动时才会发生。 不要尝试使用elasticearch而不是host从您的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是您在项目中使用的变量