当前位置: 首页 > 知识库问答 >
问题:

docker-compose elasticsearch和Go语言连接被拒绝

谭修然
2023-03-14

我正在使用docker-compose运行我的Go语言应用程序和本地机器中的单节点弹性搜索,并使用https://github.com/vishnubob/wait-for-it开始排序。在连接我的Go语言应用程序和弹性时,我面临连接被拒绝。我认为我正在将正确的ip从我的Go语言容器指向我的es容器。我认为我没有正确设置我的es容器
错误日志:

web_1      | wait-for-it.sh: waiting 15 seconds for elastic:9200
web_1      | wait-for-it.sh: timeout occurred after waiting 15 seconds for elastic:9200
web_1      | 2020/11/16 04:05:12 Setup ElasticSearch: failed cause, dial tcp 172.28.0.3:9200: connect: connection refused

这是我的配置:

docker-compose.yml

version: "3.8"
services: 
  web:
    build: .
    command: ["./wait-for-it.sh","mongo:27017","redis:6379","elastic:9200","--","./server"]
    ports:
      - "8080:8080"
    networks:
      - s2l_network
    depends_on:
      - mongo
      - redis
      - elastic
      
  mongo:
    container_name: mongo
    image: mongo
    restart: always
    ports:
      - "27017:27017"
    #volumes:
    #  - "s2l_mongo:/data/db"
    networks:
      - s2l_network

  redis:
    container_name: redis
    image: redis
    ports:
      - "6379:6379"
    networks:
      - s2l_network

  elastic:
    container_name: elastic
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.3
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - discovery.type=single-node
      - network.host=0.0.0.0
    networks:
      - s2l_network  

networks:
  s2l_network:

Dockerfile

FROM golang:1.14 

ENV GO111MODULE=on

WORKDIR /app
COPY go.mod .
COPY go.sum .

RUN go mod download
COPY . .

RUN chmod +x ./wait-for-it.sh

RUN go build

conection.go

cfg := elasticsearch.Config{
        MaxRetries: 10,
        Transport: &http.Transport{
            ResponseHeaderTimeout: 10 * time.Second,
        },
        Addresses: []string{
            "http://elastic:9200",
        },
    }

    es, err := elasticsearch.NewClient(cfg)
    if err != nil {
        log.Printf("Setup ElasticSearch: failed cause, %s", err)
        return nil, err
    }

    _, err = es.Info()
    if err != nil {
        log.Printf("Setup ElasticSearch: failed cause, %s", err)
        return nil, err
    }

弹性容器检查:

 ...
 "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "69cd26188f8e9c1b82df2ad6991b25c8e0bd27da965c2cfcd22a83d60127fd62",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "9200/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "9200"
                    }
                ],
                "9300/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "9300"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/69cd26188f8e",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "market-place_s2l_network": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "0060c27403e7",
                        "elastic"
                    ],
                    "NetworkID": "c9181ea9396ed3fedb26852f130b0cec1f567951a433c5261eb9b4d0564a86d4",
                    "EndpointID": "f1adce667b74abf83967ba0115afe39f873b3611c25951b488c6be90b3563ec8",
                    "Gateway": "172.28.0.1",
                    "IPAddress": "172.28.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:1c:00:03",
                    "DriverOpts": null
                }
            }
        }
    }

我在想我的问题:因为我在两个单独的容器中运行我的golang应用程序和elastic,所以我必须将我的golang应用程序与elastic连接,而不是通过本地主机网络。所以我的连接字符串uri应该是“http://elastic:9200".

来自弹性文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html.

Elasticsearch binds to localhost only by default

我对该语句的解释是,如果我们不设置任何其他附加配置,我们只能通过127.0.0.1:9200连接。所以我们需要这个额外的配置设置来允许我们从localhost外部连接。

network.host=0.0.0.0

如果我的基本理解正确或错误,我希望有人能解释我

谢啦

共有1个答案

乐正浩言
2023-03-14

问题在于启动的时间,即使我们订购了启动容器。es容器的准备时间超过15秒,在默认配置下等待它超时15秒。因此,我们需要在golang应用程序容器中出现故障时重新启动配置。

web:
  restart: on-failure
  ...
 类似资料:
  • 问题内容: 我正在尝试通过代码访问Redis服务器,但未连接。但是,如果我猛击redis容器,我可以访问redis-cli。 docker-compose.yml看起来像这样 Dockerfile_redis 当我尝试使用此代码连接到Redis服务器时 它发出此警告 有谁知道如何将Redis容器连接到PHP容器? 问题答案: 你的问题 Docker Compose 为不同的服务创建了单独的dock

  • 我是docker的新手,我正在尝试通过本地主机连接我的pgAdmin容器到postgres容器。 无法连接到服务器:连接被拒绝服务器是否在主机“localhost”(127.0.0.1)上运行并接受端口5432上的TCP/IP连接?无法连接到服务器:地址不可用是否在主机“localhost”(::1)上运行并接受端口5432上的TCP/IP连接的服务器? 我成功地通过容器上的给出的IPAddres

  • 试图在localhost中建立从app容器到mysql容器的连接,出现连接拒绝异常 我们正在采取一种docker的方法来调用rest api服务来采用微服务的方法。我们正在建立应用程序容器和mysql容器之间的连接,同时我们编写了一个docker-compose文件,创建了mysql容器和应用程序容器,为这两个容器公开了端口。下面是运行docker-compose文件docker-compose

  • 问题内容: 我创建了一个小工具,过去它像一个魅力一样可以部署小型WordPress实例。看起来像这样: 但是当我现在启动它时(也许是因为docker更新到Docker 1.9.1版本,build ),它失败了 当我的猫的有项针对MySQL: 而且我能够ping通MariaDB服务器。 当我安装WordPress并多次重启后,MariaDB容器打印出来: 是哪个指示它正在运行,不是吗? 我如何获得W

  • 我正在使用另一个容器中的DockerizeSpring启动应用程序和redis。 我使用docker comush在同一个网络中运行两个容器,这是我的docker-compose.yml: 这是我的application.yml文件: 我也尝试了redis hots=redis,但结果是一样的。 我的问题是,我得到这个java.net.连接异常:拒绝连接(拒绝连接)”,即使容器在同一个网络中。 我