首页 > 解决方案 > 无法从在 Docker 中运行的 Go 服务器连接到 Elasticsearch

问题描述

我今天设置了一个运行golang:1.13-alpine图像的环境,以及 Elasticsearch 和 Kibana 的最新图像。

从我的本地计算机访问时,Elasticsearch 和 Kibana 运行良好,但我无法通过 Go 服务器连接到 Elasticsearch。我根据我找到并遵循的指南将这些放在一起。

我对使用 Docker 还是有点陌生​​。我有一个想法,我指向容器中的错误 IP 地址,但我不确定如何修复它。希望有人可以指导我正确的方向。

码头工人-compose.yml:

version: "3.7"

services:
  web:
    image: go-docker-webserver
    build: .
    ports:
      - "8080:8080"

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
    environment:
      node.name: elasticsearch
      cluster.initial_master_nodes: elasticsearch
      cluster.name: docker-cluster
      bootstrap.memory_lock: "true"
      ES_JAVA_OPTS: -Xms256m -Xmx256m
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"

  kibana:
    image: docker.elastic.co/kibana/kibana:7.4.2
    ports:
      - "5601:5601"
    links:
      - elasticsearch

码头文件:

FROM golang:1.13-alpine as builder

RUN apk add --no-cache --virtual .build-deps \
    bash \
    gcc \
    git \
    musl-dev

RUN mkdir build
COPY . /build
WORKDIR /build

RUN go get
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o webserver .
RUN adduser -S -D -H -h /build webserver
USER webserver

FROM scratch
COPY --from=builder /build/webserver /app/
WORKDIR /app
EXPOSE 8080
EXPOSE 9200
CMD ["./webserver"]

main.go

func webserver(logger *log.Logger) *http.Server {
    router := http.NewServeMux()
    router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

        es, err := elasticsearch.NewDefaultClient()
        if err != nil {
            log.Fatalf("Error creating the client: %s", err)
        }

        res, err := es.Info()
        if err != nil {
            log.Fatalf("Error getting response: %s", err)
        }

        log.Println(res)
    })

    return &http.Server{
        Addr:         listenAddr,
        Handler:      router,
        ErrorLog:     logger,
        ReadTimeout:  5 * time.Second,
        WriteTimeout: 10 * time.Second,
        IdleTimeout:  15 * time.Second,
    }
}

当我启动服务器时,一切都运行良好,我可以访问 Kibana 并查询我索引的数据,但是一旦我localhost:8080进入 Postman,服务器就会死掉并输出:

web_1            | 2019/11/26 16:40:40 Error getting response: dial tcp 127.0.0.1:9200: connect: connection refused
go-api_web_1 exited with code 1

标签: dockergoelasticsearchkibana

解决方案


您可以在 docker-compose 文件中将网络作为网桥提及并验证一次,它是如何工作的。

version: "3.7"

services:
  web:
    image: go-docker-webserver
    build: .
    ports:
      - "8080:8080"
    networks:
      - elastic

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
    environment:
      node.name: elasticsearch
      cluster.initial_master_nodes: elasticsearch
      cluster.name: docker-cluster
      bootstrap.memory_lock: "true"
      ES_JAVA_OPTS: -Xms256m -Xmx256m
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
    networks:
      - elastic

  kibana:
    image: docker.elastic.co/kibana/kibana:7.4.2
    ports:
      - "5601:5601"
    links:
      - elasticsearch
    networks:
      - elastic

networks:
  elastic:
    driver: bridge

将内核设置设置为 262144 :

sysctl -w vm.max_map_count=262144

推荐阅读