设置-我有一个在Docker容器内部运行的简单服务器。 Dockerfile:
web:
image: my_web
build:
context: ./
dockerfile: web.docker
container_name: my_web
networks:
- front
ports:
- "4200:4200"
- "4300:4300"
volumes:
- www:/var/www
- wwwlogs:/var/www/storage/logs
env_file:
- ${SERVICE_ENVIRONMENT}.env
web.docker:
# start build from node:latest
FROM node:latest
MAINTAINER me <info@example.com>
# Install system-wide dependencies
RUN apt-get -yqq update
... some unimportant setup stuff ...
USER me
# expose port
EXPOSE 4200
WORKDIR /me
## Run server
CMD ["/bin/bash", "-c", "ng serve --proxy-config projects/my-ui/src/environments/proxy.conf-local.json --hmr"]
一切正常。服务器启动
...
** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
...
从容器内部,我可以很好地完成服务:
> docker exec -u 0 -it my_web /bin/bash
root@621da3c6697f:/me# curl localhost:4200
<!doctype html>
<html>
<head>
...
但是,从容器外部(OSX主机),我得到一个空响应:
> curl localhost:4200
curl: (52) Empty reply from server
我认为这与Docker网络没有直接关系。我还有其他响应良好的API服务。我还登录了Web容器,并使用python启动了一个简单的Web服务器:
me@621da3c6697f:/me# python -m SimpleHTTPServer 4300
Serving HTTP on 0.0.0.0 port 4300 ...
我可以从主持人那里得到罚款:
> curl localhost:4300
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
...
服务器吐出访问日志行:
172.22.0.1 - - [18/Oct/2018 19:56:59] "GET / HTTP/1.1" 200 -
我也进行了更改,以便简单的HTTP服务器在端口4200上运行,但这没什么区别。
我在想这与npm如何绑定到主机有关(仅侦听对127.0.0.1的请求或类似的请求),但是对于我而言,我无法弄清楚。任何人有任何进一步调试的建议或关于更改npm如何绑定地址的想法?
---编辑---
在不运行任何端口的情况下访问端口也有区别。从主持人:
> curl localhost:4000
curl: (7) Failed to connect to localhost port 4000: Connection refused
> curl localhost:4200
curl: (52) Empty reply from server
因此,它肯定达到了4200的极限,只是服务器拒绝提供任何内容...
答案 0 :(得分:0)
好,知道了-它是如何绑定到主机的。经过一段时间的搜索,终于发现了这篇帖子nodejs app doesn't connect to localhost when running within a docker container
长话短说,在ng服务行上指定要绑定的主机IP地址:
--host 0.0.0.0
即
CMD ["/bin/bash", "-c", "ng serve --host 0.0.0.0 --proxy-config projects/my-ui/src/environments/proxy.conf-local.json --hmr"]
我认为您也可以在角度配置文件中进行设置,但这已经足以暂时阻止我了。
现在它响应来自主机的请求:
> curl localhost:4200
<!doctype html>
<html>
<head>
...