【问题标题】:Why can't I access dockerized npm from host为什么我不能从主机访问 dockerized npm
【发布时间】:2018-10-19 04:43:07
【问题描述】:

设置 - 我有一个在 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 的东西,只是服务器拒绝提供任何内容......

【问题讨论】:

  • 我不确定你的意思是“npm”。
  • 我承认,Angular 堆栈不是我的强项。但是我用“npm run start-local”启动服务器,这就是我指定 npm 的原因。这又扩展为“ng serve --proxy-config projects/xform-ui/src/environments/proxy.conf-local.json --hmr”(这是我现在直接编码到我的 docker 文件中的内容)。这应该在 Node 中结束吗?角度?

标签: angular docker npm docker-compose


【解决方案1】:

好的,想通了 - 它是如何绑定到主机的。找了一阵子,终于看到了这个帖子nodejs app doesn't connect to localhost when running within a docker container

长话短说,在 ng serve 行指定要绑定的主机 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"]

我认为您也可以在 angular 配置文件中设置它,但这足以让我暂时解除阻止。

现在它响应来自主机的请求:

> curl localhost:4200
<!doctype html>
<html>
<head>
...

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2011-12-10
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2018-09-29
    相关资源
    最近更新 更多