我试图在Mac上的一个简单的Angular 1.5应用程序中运行,该应用程序是从此处的官方Node映像构建的自定义映像,但是尝试访问容器中运行的站点时出现“拒绝连接”错误。我可以在Mac上本地运行Angular应用程序而不会出现错误。
这是我的Dockerfile:
FROM node
COPY . /var/www
WORKDIR /var/www
RUN npm install
EXPOSE 8888
ENTRYPOINT ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)
在package.json中,将“ npm start”设置为启动端口8888上的站点:
"start": "http-server -a localhost -p 8888 -c-1 ./app",
Run Code Online (Sandbox Code Playgroud)
我建立了这样的自定义图像:
$docker build -t beerdb-web .
Run Code Online (Sandbox Code Playgroud)
映像成功构建:
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
beerdb-web latest cf406b4dacc7 13 minutes ago 760.6 MB
Run Code Online (Sandbox Code Playgroud)
然后,我从图像启动一个容器,如下所示:
$docker run -p 8888:8888 -d cf
Run Code Online (Sandbox Code Playgroud)
contaier似乎运行良好,并且正在将容器端口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
Run Code Online (Sandbox Code Playgroud)
我可以检查该容器,并查看其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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的机器也很好:
$docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v1.12.3
Run Code Online (Sandbox Code Playgroud)
但是,当我从Mac 导航到http://192.168.99.100:8888/时,会出现“ Connection Refused”。
在下面的代码段中,我将ssh's进入了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:~$
Run Code Online (Sandbox Code Playgroud)
为了确保站点在容器中正常运行,我在容器中启动了命令提示符,并使用curl命中了localhost:8888并返回了我网站的主页。
我认为自定义映像已从节点基本映像中正确构建,并且运行正常。我相信端口映射或机器本身都有问题。我在Mac上已经基本安装了Docker工具包,并且没有对VirtualBox内运行的Default机器进行任何更改,但是我仍然无法访问容器内运行的网站。
非常沮丧,我们将不胜感激。
命令行中的-a localhost开关http-server使HTTP服务器将自身绑定到容器的环回设备(127.0.0.1)。由于容器使用与主机(您的Docker计算机)不同的网络名称空间,127.0.0.1因此容器中127.0.0.1的主机与主机上的主机不相等。
为了从其他网络接口可访问,请通过指定0.0.0.0作为绑定地址来绑定到所有可用接口(-a 0.0.0.0,巧合的是,此选项也是默认值,允许您完全省略它):
"start": "http-server -p 8888 -c-1 ./app",
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7238 次 |
| 最近记录: |