docker - 无法从在 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
解决方案
您可以在 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
推荐阅读
- html - Add element span without changing the position of existing centered elements
- reactjs - How to get response after a function call in React JS?
- python - 调用类方法时出现意外结果
- c# - 读取 System.Net.Sockets 时响应中断
- java - 用Java中的用户输入关闭未填充的数组
- heroku - 是否可以在同一个 Heroku dyno 上部署多个 Strapi.io 应用程序?
- python - Python 3d 条形图
- python - 计算路径跟随的横向和角度误差
- scala - 元组内的 Scala 映射元素
- javascript - 在强肥皂的内部函数中返回一个值