“连接被拒绝”在Docker节点容器上

我试图在我的Mac上运行一个简单的Angular 1.5应用程序,在这里从官方的Node图像构build的自定义图像,但是当尝试访问容器内运行的网站时,我得到一个“连接拒绝”错误。 我可以在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", 

我build立这样的自定义图像:

 $docker build -t beerdb-web . 

图像成功build立:

 $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/我得到“连接拒绝”。

在下面的代码片段中,我已经进入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,并返回了我的网站的主页。

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

非常沮丧,任何帮助表示赞赏。

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

为了能够从其他networking接口访问,通过指定0.0.0.0作为绑定地址绑定到所有可用接口( -a 0.0.0.0 ,这也是该选项的默认值,允许您完全省略):

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

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

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

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