【问题标题】:"Connection Refused" on Docker node containerDocker节点容器上的“连接被拒绝”
【发布时间】:2016-12-09 06:18:13
【问题描述】:

我正在尝试在我的 Mac 上运行一个简单的 Angular 1.5 应用程序,该应用程序是在从官方节点映像 here 构建的自定义映像中运行的,但在尝试访问在容器内运行的站点时出现“连接被拒绝”错误。我可以在我的 Mac 上本地运行 Angular 应用程序而没有错误。

这是我的 Dockerfile:

FROM        node
COPY        . /var/www
WORKDIR     /var/www
RUN         npm install
EXPOSE      8888
ENTRYPOINT ["npm", "start"]

在 package.json 中,“npm start”设置为在端口 8888 上启动站点:

"start": "http-server -a localhost -p 8888 -c-1 ./app",

我这样构建自定义图像:

$docker build -t beerdb-web .

镜像构建成功:

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
beerdb-web          latest              cf406b4dacc7        13 minutes ago      760.6 MB

然后我从图像中启动一个容器,如下所示:

$docker run -p 8888:8888 -d cf

容器似乎运行良好,并且正确地将容器端口 8888 映射到 docker 机器端口 8888:

$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
828aeb67bc73        cf                  "npm start"         2 seconds ago       Up 2 seconds        0.0.0.0:8888->8888/tcp   condescending_almeida

我可以检查容器,发现它有一个 IP 地址和 8888 端口暴露:

"NetworkSettings": {
   "Bridge": "",
   "SandboxID": "0d7180998a7c0bceb0c911069538f29297422fdf98bb859eba78e6584ce65919",
   "HairpinMode": false,
   "LinkLocalIPv6Address": "",
   "LinkLocalIPv6PrefixLen": 0,
   "Ports": {
       "8888/tcp": [
           {
               "HostIp": "0.0.0.0",
               "HostPort": "8888"
           }
       ]
   },
   "SandboxKey": "/var/run/docker/netns/0d7180998a7c",
   "SecondaryIPAddresses": null,
   "SecondaryIPv6Addresses": null,
   "EndpointID": "99bc9f9fad5a2445687327d45fb4fe29fb8267b08f119d3912720ced48b7d074",
   "Gateway": "172.17.0.1",
   "GlobalIPv6Address": "",
   "GlobalIPv6PrefixLen": 0,
   "IPAddress": "172.17.0.2",
   "IPPrefixLen": 16,
   "IPv6Gateway": "",
   "MacAddress": "02:42:ac:11:00:02",
   "Networks": {
       "bridge": {
           "IPAMConfig": null,
           "Links": null,
           "Aliases": null,
           "NetworkID": "41b55572b74543f33c99b3f86339ad4c81e9abaacbe0e92077f36cacae29a9c0",
           "EndpointID": "99bc9f9fad5a2445687327d45fb4fe29fb8267b08f119d3912720ced48b7d074",
           "Gateway": "172.17.0.1",
           "IPAddress": "172.17.0.2",
           "IPPrefixLen": 16,
           "IPv6Gateway": "",
           "GlobalIPv6Address": "",
           "GlobalIPv6PrefixLen": 0,
           "MacAddress": "02:42:ac:11:00:02"
       }
   }
}

我的机器看起来也很好:

$docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.3   

但是当我从我的 Mac 导航到 http://192.168.99.100:8888/ 时,我得到“连接被拒绝”。

在下面的 sn-p 中,我已经 ssh 进入了 docker 机器。您会看到我可以 ping 容器的 IP 地址,但是当我使用 curl 尝试访问端口 8888 时,我得到连接被拒绝:

$docker-machine ssh
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.12.3, build HEAD : 7fc7575 - Thu Oct 27 17:23:17 UTC 2016
Docker version 1.12.3, build 6b644ec
docker@default:~$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.092 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.092 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.092/0.092/0.092 ms
docker@default:~$ 
docker@default:~$ curl 172.17.0.2:8888
curl: (7) Failed to connect to 172.17.0.2 port 8888: Connection refused
docker@default:~$ 

为了确保站点在容器中正常运行,我在容器中启动了一个命令提示符并使用 curl 访问 localhost:8888 并返回了我的网站主页。

我相信从节点基础映像正确构建的自定义映像并且它按预期运行。我相信端口映射或机器本身存在问题。我在我的 Mac 上安装了 Docker 工具包的基本安装,并且没有对在 VirtualBox 中运行的默认机器进行任何更改,但我仍然无法访问在我的容器中运行的网站。

非常沮丧,感谢任何帮助。

【问题讨论】:

    标签: docker


    【解决方案1】:

    http-server 命令行中的 -a localhost 开关会导致 HTTP 服务器将自身绑定到容器的环回设备 (127.0.0.1)。由于容器使用的network namespace 与主机(您的Docker 机器)不同,因此容器中的127.0.0.1 不等于主机上的127.0.0.1

    为了可以从其他网络接口访问,请通过指定0.0.0.0 作为绑定地址来绑定到所有可用的接口(@98​​7654328@,巧合的是,这也是此选项的默认值,您可以完全省略它) :

    "start": "http-server -p 8888 -c-1 ./app",
    

    【讨论】:

    • 修复它 - 删除 -a localhost 因为 0.0.0.0 是你提到的默认值。
    【解决方案2】:

    在此处查看文档https://docs.docker.com/engine/userguide/networking/default_network/container-communication/

    基本上你需要在 docker 主机(你的 virtualbox)上启用 IP 转发

    sysctl net.ipv4.conf.all.forwarding=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多