docker 和领事 : Pinging services works but curl always returns couldn't connect to host error

标签 docker consul

我正在尝试使用 Docker 部署多个服务并使用 Consul 进行服务发现。我已经阅读了各种指南和教程,并且我有以下 bash 脚本来设置我的 Docker 容器:

export PRIVATE_IP=XXX.XXX.XXX.XXX
export BRIDGE_IP=XXX.XXX.XXX.XXX
docker run -d --name consul -h $HOSTNAME -p $PRIVATE_IP:8300:8300 -p $PRIVATE_IP:8301:8301 -p $PRIVATE_IP:8301:8301/udp -p $PRIVATE_IP:8302:8302 -p $PRIVATE_IP:8302:8302/udp -p $PRIVATE_IP:8400:8400 -p $PRIVATE_IP:8500:8500 -p $BRIDGE_IP:53:53/udp progrium/consul -server -advertise $PRIVATE_IP -bootstrap
docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock -h $HOSTNAME gliderlabs/registrator consul://$PRIVATE_IP:8500
docker run -d --dns=$BRIDGE_IP --dns 8.8.8.8 --dns-search service.consul -p 3579:3579 --name service1 rcarrington/service1
docker run -d --dns=$BRIDGE_IP --dns 8.8.8.8 --dns-search service.consul -p 3580:3580 --name service2 rcarrington/service2

只要我可以导航到 Consul UI 并看到所有节点都存在,我还可以导航到 service1 和 service2 公开的服务,这就有效了。我不确定的一件事是我无法将 PRIVATE_IP 和 BRIDGE_IP 设置为 docker 服务器公开的端口以外的任何内容。例如,如果我尝试将 BRIDGE_IP 设置为 172.17.42.1,这显然是默认值,则脚本只会出错。

问题是我希望我的服务能够相互通信,但它们似乎无法做到。如果我从 service2 ping service1 然后我得到如下响应:

# ping service1
# PING service1.service.consul (YYY.YYY.YYY.YYY): ZZ data bytes

这似乎是正确的,但是当我尝试使用 curl 导航到它的服务时,我收到了一个无法连接到主机错误。我已经尝试了主机名和 IP 地址(包括正确的端口)的所有组合,但没有成功。奇怪的是,ping 返回的 IP 地址可能不是上面脚本中使用的 1。

我在 Windows 10 上运行最新的 Docker-Toolbox。我的服务容器正在运行单声道并执行 NancyFX 自托管应用程序。

我假设我在 bash 脚本中做错了什么,但我不知道是什么。任何帮助将不胜感激。

最佳答案

尝试使用 Docker Compose .它易于使用并具有内置网络,因此容器可以相互通信。

您的用例的一个简单的 docker-compose.yml 文件看起来像(未经测试):

version: '2'
services:
  consul:
    image: progrium/consul
    container_name: consul
    ports:
      - "8300:8300"
      - "8301:8301"
      - "8302:8302"
      - "8400:8400"
      - "8500:8500"
  registrator:
    image: gliderlabs/registrator
    container_name: registrator
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
  service1:
    image: rcarrington/service1
    container_name: service1
    ports:
      - "3579:3579"
  service2:
    image: rcarrington/service2
    container_name: service2
    ports:
      - "3580:3580"

默认情况下,所有容器都添加到网络 docker_default 中,并且能够通过 container_name e 相互 ping 通。 G。 ping 服务 1

如果您想创建自定义网络,您可以:

services:
  consul:
    ...
    networks:
      - consulnet
  registrator:
    ...
    networks:
      - consulnet
networks:
  consulnet

参见 this link有关 Docker Compose 中网络的更多信息。

关于 docker 和领事 : Pinging services works but curl always returns couldn't connect to host error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36536740/

相关文章:

spring-boot - Spring Boot Docker容器立即退出并显示代码1

django - 允许 Docker 访问容器外的 db 文件

docker - Dockerfile客户端和服务器构建

ubuntu - 领事 : Health Check is failed to invoke: fork/exec but running manualy

docker - 运行 consul docker 健康检查的问题

consul - 如何使用 consul 通过 HTTP API 递归获取原始值

mysql - 无法连接到数据库: Access denied for user

node.js - 保存时Docker Nodemon未启动

java - 使用Spring云consul配置可以共享配置吗?

kubernetes - 本地VM上的consul和Kubernetes中的consul之间的通信