node.js - 无法访问 Docker 容器
问题描述
我在 Ubuntu 16.04 VM 上安装了 docker,我正在使用 nodejs 开发一个个人项目,而 Docker 映像来自 DockerFile。容器运行,但是当我尝试使用 VP'm 公共 IP 访问它时,它无法访问。我试图卷曲,我得到 curl: (52) 来自服务器的空回复。在花了很长时间之后。端口映射正确,也没有防火墙问题。这是我的码头文件
FROM node:10.13-alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN apk update && apk upgrade \
&& apk add --no-cache git \
&& apk --no-cache add --virtual builds-deps build-base python \
&& npm install -g nodemon cross-env eslint npm-run-all node-gyp
node-pre-gyp && npm install\
&& npm rebuild bcrypt --build-from-source
RUN npm install --production --silent && mv node_modules ../
COPY . .
RUN pwd
EXPOSE 3001
CMD npm start
码头工人ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
8588419b40c4 xxx:v1 "/bin/sh -c 'npm sta…" 2 days ago
Up 2 days 0.0.0.0:3000->3001/tcp youthful_roentgen
解决方案
让xxx:v1
成为Dockerfile
您提供的图像名称。
如果您想通过主机 ( curl localhost:3001
) 访问您的应用程序,那么您应该运行:
docker run -p 3001:3000 xxx:v1
3000
此命令将容器中的端口绑定到3001
主机上的端口(IIRC,3000
是 使用的默认端口npm start
)。
localhost:3001
然后,您应该能够使用curl
.
请注意,运行时 中EXPOSE
的指令Dockerfile
不会自动公开端口docker run
。这只是一个指示,表明您的容器正在侦听您的端口EXPOSE
。在这里,你的EXPOSE
指令是错误的,你应该写:
EXPOSE 3000
因为容器中只公开了 3000 端口(3000
是使用的默认端口npm
)。您选择在主机上绑定(或不绑定)的端口仅在运行时指定。
如果您不想通过 访问您的应用程序localhost
,而只想通过容器的 IP,则无需绑定端口(否-p
)。你只需curl <container_ip>:3000
要从你的主机做。
推荐阅读
- r - 从 ReporteRs 包中删除 bsdoc 功能,现在如何为邮件创建 html?
- functional-programming - 如何创建没有样板代码的只读结构?
- ios - 任务完成但出现错误 - 代码:-999 ios 使用 avplayer 播放视频
- python - 生成集合的分区
- cumulocity - 通过 Cumulocity 上的 MQTT 在设备信息中设置“备注”
- git - 通过 ssh(从 RHEL 到 Windows Server 2012)启动 Git 拉取请求会导致错误
- python - 不能用 pythonw 调用 qwinsta
- java - 无法在 STS 中为 Spring Boot 项目执行 Maven 更新
- python - python中的Interceptor如何应用
- python-3.x - 如何在 python 中对 14 列数据框中的 8 列进行 KMeans 聚类?