Dockerfile容器如何连接docker-compose部署的Elasticsearch容器?
报错原因及修复方案
报错原因
- 容器内的
localhost指向容器自身的回环地址,而非宿主机地址。你的Ruby脚本在容器里访问http://localhost:9200,实际是尝试连接自身容器的9200端口,而该端口未运行Elasticsearch服务,因此连接失败。 - 你添加的
EXPOSE 9200仅用于声明容器使用的端口,docker run -p 9200:9200是将Ruby容器的端口映射到宿主机,这两个操作都无法解决容器连接外部Elasticsearch的问题。
最佳修复方案
由于Elasticsearch已加入ek-net自定义桥接网络,最优方案是让Ruby容器也加入该网络,通过Docker内置的服务发现机制访问Elasticsearch:
方式一:手动启动Ruby容器时加入同一网络
执行以下命令启动Ruby容器,将其加入Elasticsearch所在的ek-net网络:
docker run --network ek-net [你的Ruby镜像名称]
修改Ruby脚本中的连接地址为http://elasticsearch:9200(elasticsearch是docker-compose中Elasticsearch的服务名,同一网络内可直接通过服务名解析到容器IP),也可以使用容器名http://elastic-container:9200。
方式二:用docker-compose统一管理Ruby容器
将Ruby服务加入现有的docker-compose.yml,确保和Elasticsearch使用同一网络:
version: "3.0" services: elasticsearch: container_name: elastic-container image: docker.elastic.co/elasticsearch/elasticsearch:7.13.4 environment: - xpack.security.enabled=false - "discovery.type=single-node" networks: - ek-net ports: - 9200:9200 # 添加Ruby服务 ruby-app: build: ./你的Dockerfile所在目录路径 networks: - ek-net networks: ek-net: driver: bridge
同样修改Ruby脚本的连接地址为http://elasticsearch:9200即可。
备选方案(不推荐)
如果无法使用同一网络,可将Ruby脚本中的连接地址替换为宿主机的实际IP(如http://192.168.1.100:9200):
- Docker for Mac/Windows可使用特殊域名
host.docker.internal代替宿主机IP - Linux环境可使用默认桥接网关IP
172.17.0.1
此方案依赖宿主机网络配置,IP变化会导致连接失败,稳定性不如同一网络方案。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

