Docker部署Node应用监听3000端口正常但浏览器无法访问问题咨询
问题原因
1. 服务启动指令位置错误
RUN是镜像构建阶段执行的指令,你将npm run dev写在RUN中,相当于在docker build时就启动了开发服务,要么构建过程会卡死,要么构建完成后容器启动时没有运行任何服务,自然无法访问。
2. 容器启动命令参数错误
docker run的语法为docker run [OPTIONS] 镜像名 [启动命令] [参数],你当前的命令存在两处问题:
docker build .未给镜像打标签,后续用.作为镜像名是无效的-it等可选参数放在了镜像名之后,会被识别为容器启动命令的参数,无法生效
3. 服务监听地址配置错误
如果Node服务默认监听127.0.0.1:3000,只有容器内部可以访问该服务,宿主机的外部请求无法送达,必须修改为监听0.0.0.0:3000。
解决方法
1. 修正Dockerfile
将RUN npm run dev替换为CMD ["npm", "run", "dev"],CMD是容器启动时执行的指令,可保证服务在容器运行阶段正常启动。修改后完整Dockerfile如下:
FROM docker.artifacts.smit.sise/node:12.19.1 COPY . . RUN mkdir certs \ && cd /certs \ && wget https://artifacts.smit.sise/artifactory/smit-certs-public/smit_ca.pem --no-check-certificate \ && npm config set cafile /certs/smit_ca.pem \ && npm config set registry https://artifacts.smit.sise/api/npm/npm RUN mkdir /common_front/build/static \ && ln -sf /front/build/assets/* /valisveeb_common_front/build/assets \ && ln -sf /front/build/static/* /valisveeb_common_front/build/static \ && ln -sf /front/build/generate.options.js/ \ && ln -sf /front/build/settings.json /valisveeb_common_front/build/settings.json WORKDIR /front/build RUN ls -la \ && npm install CMD ["npm", "run", "dev"] EXPOSE 3000
2. 修改服务监听地址
根据你使用的开发框架调整监听地址为0.0.0.0:
- vite项目:在vite.config.js中添加配置
server: { host: '0.0.0.0' } - webpack-dev-server项目:在启动命令后添加参数
--host 0.0.0.0 - 原生Node服务:在listen方法中传入
0.0.0.0作为第二个参数
3. 执行正确的构建启动命令
# 构建镜像并打自定义标签 docker build . -t node-web-app # 启动容器,所有可选参数放在镜像名之前 docker run -d --restart=always -p 3000:3000 --ignore-certificate-errors node-web-app
重新构建启动后即可正常通过宿主机3000端口访问服务。
内容的提问来源于stack exchange,提问作者Triin86
相关产品推荐
相关产品推荐

