Docker部署node项目
纯小白在docker容器内部署node项目遇到的问题
我在GitHub上发现一个开源的制作封面项目,觉得很有意思,想部署在自己的网站上,但是对于小白来说,确实蒙蒙的,还好借助AI辅助,省了我不少的麻烦。也让自己学到了一点东西~
本人环境说明
- 宿主机:centos
- 镜像:node:latest
- 宝塔面板
1.宝塔面板安装Docker
在宝塔面板左侧docker上点两下就能安装,可能会因为网络问题无法安装,多尝试两下。
2.拉取镜像&创建容器
我是直接拉的最后一个版本node:latest
拉取完成后,开始创建容器
注意:端口最好写3000端口,权限一定要给读写,不然容器内出现依赖问题是无法重新安装依赖的!
-t和-i也要加上。
3.进入容器
使用root权限进入
进入容器后,查看一下自己的项目是否在正确的目录内。
没有问题就可以执行启动命令了
1 | npm run dev |
启动后提示:
1 | root@02beba08e54e:/www/wwwroot/cover# npm run dev |
原因是文件权限不足,我们查看一下文件权限ls -l node_modules/.bin/vite
。
1 | root@692f517ccfe0:/www/wwwroot/cover# ls -l node_modules/.bin/vite |
发现权限问题与 vite
可执行文件的权限配置有关。
文件权限为 -rw-r--r--
,即:
- 所有者:有读写权限(
rw-
) - 所属组:仅有读权限(
r--
) - 其他用户:仅有读权限(
r--
)
缺少执行权限(x
)是导致 Permission denied
的直接原因。
解决方案
1. 为 vite
添加执行权限
1 | chmod +x node_modules/.bin/vite |
如果遇到报错,则是docker没给读写权限导致的。需要重新创建容器,是最简单便捷的方法。
1 | root@692f517ccfe0:/www/wwwroot/cover# chmod +x node_modules/.bin/vite |
2. 确保 node_modules/.bin
目录可执行
1 | chmod +x node_modules/.bin |
3. 再次尝试运行
1 | npm run dev |
运行成功
报错看这里,点击展开
报错分析:
1 | root@02beba08e54e:/www/wwwroot/cover# npm run dev |
原因是Rollup的本地模块@rollup/rollup-linux-x64-gnu
未找到有关。需要使用npm i
重新安装依赖,并删除package-lock.json
和node_modules
目录。这表明可能存在依赖安装不完整或损坏的问题。
分步解决方案
1.清理依赖和锁定文件
1 | rm -rf node_modules package-lock.json |
2.重新安装依赖(强制重建)
1 | npm install --force |
3.再次尝试运行
1 | npm run dev |
其他注意事项
Node.js 版本兼容性
:你使用的 Node.js v23.10.0 较新,某些依赖可能未完全适配。可尝试降级到 LTS 版本(如 v18.x):
1
2npm install -g n # 安装版本管理工具
n 18.17.1 # 切换到指定版本Docker 容器架构问题
:确保容器架构(如
linux/amd64
)与本地模块兼容。在构建镜像时指定平台:1
2
3dockerfile复制代码
FROM --platform=linux/amd64 node:lts
如果问题依旧
检查
npm install
的完整日志,确认是否有其他依赖安装失败。在项目根目录运行
npm ls @rollup/rollup-linux-x64-gnu
,确认模块是否存在。尝试使用
yarn
替代npm
(某些情况下能绕过依赖问题):1
2
3npm install -g yarn
yarn install
yarn dev
4.外部访问容器
正常情况下外部访问容器需要http://localhost:端口号
进行访问,虽然我们容器设置了外部端口对应内部node的3000端口,还是无法访问如何解决?
我们只需要把启动命令可改为:
1 | npm run dev -- --host 0.0.0.0 |
这将允许通过容器 IP 或宿主机映射端口访问项目。
如果还是外部无法访问可能有以下原因。
1️⃣ 检查 Docker 端口映射
确保启动容器时正确映射了端口:
1 | docker run -d -p 81:3000 --name my-cover your-image |
-p 81:3000
:将容器内的 3000 端口映射到宿主机的 81 端口。- 如果容器内服务运行在 3000 端口(Vite 默认端口),但外部访问宿主机的 81 端口,此配置正确。
2️⃣ 确认 Vite 监听所有接口
默认情况下,Vite 可能只监听 localhost
。修改启动命令强制监听所有接口:
1 | npm run dev -- --host 0.0.0.0 |
--host 0.0.0.0
:允许外部通过容器 IP 或映射端口访问。
3️⃣ 检查防火墙规则
确保宿主机防火墙放行了 81 端口:
- Ubuntu/Debian:
1
sudo ufw allow 81/tcp
- CentOS/RHEL:
1
2sudo firewall-cmd --permanent --add-port=81/tcp
sudo firewall-cmd --reload
4️⃣ 验证容器网络和 IP
- 进入容器查看 IP:
1
docker inspect my-cover | grep IPAddress
- 从宿主机尝试访问容器 IP 的 3000 端口:
1
curl http://<容器IP>:3000
- 如果成功,说明问题出在端口映射或宿主机防火墙。
- 如果失败,检查容器内服务是否运行。
5️⃣ 检查容器日志
查看容器实时日志,确认服务是否启动且无错误:
1 | docker logs -f my-cover |
6️⃣ 测试外部访问
从另一台机器或使用 curl
测试宿主机 81 端口:
1 | curl http://<宿主机IP>:81 |
📌 总结流程图
1 | 外部请求宿主机:81 |
完成上述排查后,服务应可通过 http://宿主机IP:81
访问。
5.反向代理
最后虽然完成了,但是访问ip加端口号很不安全,而且也无法进行ssl加密。这时候需要用反向代理进行一个域名绑定
宝塔面板-网站-添加站点
PHP版本选择纯静态,起一个二级域名
然后设置ssl证书
设置反向代理
最后还是有一点没有补足,就是IP加端口号的访问不知道如何禁止