Docker容器无法从主机访问(localhost:8081)

7

使用Ubuntu。

基于这个指南:

https://www.freecodecamp.org/news/how-to-use-routing-in-vue-js-to-create-a-better-user-experience-98d225bbcdd9/

我创建了一个最小化的vuejs项目,其项目结构如下:

https://github.com/dev-samples/samples/tree/master/vuejs-001

frontend-router/
  build/
  config/
  src/
  static/
  test/
  build.sh
  Dockerfile.dev
  package-lock.json
  package.json

Where:

Dockerfile.dev

FROM node:10
RUN apt install curl
RUN mkdir /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /app/package.json

# make the 'app' folder the current working directory before running npm install
WORKDIR /app

RUN npm install
CMD [ "npm", "run", "dev" ]

我正在构建镜像,并使用以下命令从该镜像运行容器:

docker build -t frontend-router-image -f Dockerfile.dev .
docker rm -f frontend-router-container

docker run -it -p 8081:8080 -v ${PWD}:/app/ -v /app/node_modules --name frontend-router-container frontend-router-image

这将会产生:

DONE  Compiled successfully in 1738ms                                                                                                                                                    3:49:45 PM

 I  Your application is running here: http://localhost:8080

自从我在Docker运行命令中添加了-p 8081:8080后,我期望可以从我的主机浏览器上访问应用程序的地址是:http://localhost:8081/。但是它只显示以下错误:enter image description here。当我从主机上的vanilla npm运行时它工作正常。但为什么在Docker容器内部运行时无法访问该应用程序呢?源代码在此:https://github.com/dev-samples/samples/tree/master/vuejs-001。根据下面的建议,我尝试过:
$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
e011fb9e39e8        frontend-router-image   "docker-entrypoint.s…"   12 seconds ago      Up 9 seconds        0.0.0.0:8081->8080/tcp   frontend-router-container

$ docker run -it --rm --net container:frontend-router-container nicolaka/netshoot ss -lnt
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    
LISTEN    0         128              127.0.0.1:8080             0.0.0.0:*       

相比之下,这个项目工作得很好:

https://github.com/dev-samples/samples/tree/master/vuejs-002

这意味着,当我运行一个容器时,可以在我的主机浏览器上通过 localhost:8081 访问 Web 应用程序。


1
如果您能够将示例项目共享为存储库,并显示Docker构建和Docker运行步骤的完整日志,那将非常好。 - Nicolas
你使用的是macOS吗? - Thanh Nguyen Van
不,它是Ubuntu Linux,并且我已经在原帖中提供了源链接。 - u123
容器内运行的用户是谁?该用户是否具有读写您挂载的应用程序目录的权限? - Manuel
你能具体一点吗? - u123
显示剩余3条评论
2个回答

8

1
当你遇到“连接重置”时,通常意味着没有人在监听该端口。
看起来你正在监听本地主机,当你在docker中时,你必须监听0.0.0.0。
在你的文件config/index.js中,host是localhost,你必须删除host指令。
如果你在监听127.0.0.1或localhost,你在监听本地网络,因此在容器内,Web服务器只能被本地进程访问。
另一个可能导致问题的来源是你连接了错误的端口。
如果你使用“docker run -it -p 8081:8080”运行,请访问http://localhost:8081/
请参见。
发布或者暴露端口(-p,--expose) 来自https://docs.docker.com/engine/reference/commandline/run/

@u123 我修改了我的回答。 - EchoMike444
从config/index.js中删除主机指令并没有帮助。 正如我在我的帖子中写的那样,我正在连接到正确的端口。 - u123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接