如何配置docker-compose实现Docker容器连接外部服务端口
Docker 容器访问宿主机 Elasticsearch 配置方案
前置检查(必做)
- 修改宿主机上部署的旧版Elasticsearch配置文件
elasticsearch.yml,将网络监听配置改为network.host: 0.0.0.0,不要保留默认的127.0.0.1绑定——默认配置只允许宿主机本机访问,Docker容器属于独立网络命名空间,会被直接拦截。修改完成后重启ES服务,在宿主机本地执行curl http://127.0.0.1:9200确认服务正常返回版本信息。 - 临时关闭Mac系统防火墙测试,或者在防火墙设置里给Elasticsearch进程添加入站连接放行规则,避免本地虚拟网卡请求被拦截。
docker-compose.yml 调整方法
找到Rails应用对应的服务配置段,按以下规则修改:
- 移除原有配置中无法在M1芯片上运行的Elasticsearch容器相关配置,包括独立的ES服务定义、
depends_on里的ES依赖项,不需要再启动该兼容异常的容器。 - 在Rails服务的
environment配置块中,将Elasticsearch连接地址指向Docker Desktop for Mac提供的专用宿主机域名host.docker.internal,该域名在所有Mac版Docker环境(Intel/Apple芯片通用)中会自动解析为宿主机的可达IP,不需要手动查询网卡地址。 - 配置示例参考:
version: '3.8' # 保留你原有compose文件的版本声明即可 services: web: # 这里是你自己定义的Rails服务名,无需修改 build: . ports: - "3000:3000" environment: # 新增/修改ES连接地址配置,端口和你宿主机ES启动的端口保持一致,默认是9200 ELASTICSEARCH_HOST: host.docker.internal ELASTICSEARCH_PORT: 9200 # 如果你用的是单URL连接配置就写下面这行,和上面的拆分配置二选一即可 # ELASTICSEARCH_URL: http://host.docker.internal:9200 # 其他原有环境变量(数据库、Redis等配置)全部保留不需要改动 volumes: - .:/app # 其他原有配置(command、tty、依赖项等)全部保留
连通性验证
- 保存配置后执行
docker-compose up -d重建启动Rails容器 - 进入容器终端执行
curl http://host.docker.internal:9200,如果正常返回Elasticsearch的版本、集群名等JSON信息,说明网络连通正常,Rails应用就可以正常访问ES服务了。
注意:不要在容器内用
127.0.0.1/localhost访问宿主机服务,这两个地址指向的是Rails容器自身的内部回环网卡,永远访问不到宿主机上部署的服务。
内容的提问来源于stack exchange,提问作者Darrell Brogdon
相关产品推荐
相关产品推荐

