纯小白在docker容器内部署node项目遇到的问题

我在GitHub上发现一个开源的制作封面项目,觉得很有意思,想部署在自己的网站上,但是对于小白来说,确实蒙蒙的,还好借助AI辅助,省了我不少的麻烦。也让自己学到了一点东西~

本人环境说明

  • 宿主机:centos
  • 镜像:node:latest
  • 宝塔面板

1.宝塔面板安装Docker

在宝塔面板左侧docker上点两下就能安装,可能会因为网络问题无法安装,多尝试两下。

2.拉取镜像&创建容器

我是直接拉的最后一个版本node:latest

拉取完成后,开始创建容器

注意:端口最好写3000端口,权限一定要给读写,不然容器内出现依赖问题是无法重新安装依赖的!

image-20250329155418557

image-20250329155723638

-t和-i也要加上。

3.进入容器

image-20250329155854475

使用root权限进入

image-20250329155953757

进入容器后,查看一下自己的项目是否在正确的目录内。

image-20250329160140031

没有问题就可以执行启动命令了

1
npm run dev

启动后提示:

1
2
3
4
5
6
root@02beba08e54e:/www/wwwroot/cover# npm run dev

> Mini-Cover@1.0.0 dev
> vite

sh: 1: vite: Permission denied

原因是文件权限不足,我们查看一下文件权限ls -l node_modules/.bin/vite

1
2
root@692f517ccfe0:/www/wwwroot/cover# ls -l node_modules/.bin/vite
-rw-r--r-- 1 root root 300 Mar 29 05:38 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
2
root@692f517ccfe0:/www/wwwroot/cover# chmod +x node_modules/.bin/vite
chmod: changing permissions of 'node_modules/.bin/vite': Read-only file system

2. 确保 node_modules/.bin 目录可执行

1
chmod +x node_modules/.bin

3. 再次尝试运行

1
npm run dev

运行成功

报错看这里,点击展开

报错分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
root@02beba08e54e:/www/wwwroot/cover# npm run dev

> Mini-Cover@1.0.0 dev
> vite

/www/wwwroot/cover/node_modules/rollup/dist/native.js:64
throw new Error(
^

Error: Cannot find module @rollup/rollup-linux-x64-gnu. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.
at requireWithFriendlyError (/www/wwwroot/cover/node_modules/rollup/dist/native.js:64:9)
at Object.<anonymous> (/www/wwwroot/cover/node_modules/rollup/dist/native.js:73:76)
at Module._compile (node:internal/modules/cjs/loader:1734:14)
at Object..js (node:internal/modules/cjs/loader:1899:10)
at Module.load (node:internal/modules/cjs/loader:1469:32)
at Function._load (node:internal/modules/cjs/loader:1286:12)
at TracingChannel.traceSync (node:diagnostics_channel:322:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)
at cjsLoader (node:internal/modules/esm/translators:315:5)
at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:207:7) {
[cause]: Error: Cannot find module '@rollup/rollup-linux-x64-gnu'
Require stack:
- /www/wwwroot/cover/node_modules/rollup/dist/native.js
at Function._resolveFilename (node:internal/modules/cjs/loader:1405:15)
at defaultResolveImpl (node:internal/modules/cjs/loader:1061:19)
at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1066:22)
at Function._load (node:internal/modules/cjs/loader:1215:37)
at TracingChannel.traceSync (node:diagnostics_channel:322:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)
at Module.require (node:internal/modules/cjs/loader:1491:12)
at require (node:internal/modules/helpers:135:16)
at requireWithFriendlyError (/www/wwwroot/cover/node_modules/rollup/dist/native.js:46:10)
at Object.<anonymous> (/www/wwwroot/cover/node_modules/rollup/dist/native.js:73:76) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/www/wwwroot/cover/node_modules/rollup/dist/native.js' ]
}
}

Node.js v23.10.0

原因是Rollup的本地模块@rollup/rollup-linux-x64-gnu未找到有关。需要使用npm i重新安装依赖,并删除package-lock.jsonnode_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
    2
    npm install -g n  # 安装版本管理工具
    n 18.17.1 # 切换到指定版本
  • Docker 容器架构问题

    :确保容器架构(如linux/amd64)与本地模块兼容。在构建镜像时指定平台:

    1
    2
    3
    dockerfile复制代码

    FROM --platform=linux/amd64 node:lts

如果问题依旧

  • 检查 npm install 的完整日志,确认是否有其他依赖安装失败。

  • 在项目根目录运行 npm ls @rollup/rollup-linux-x64-gnu,确认模块是否存在。

  • 尝试使用yarn替代npm(某些情况下能绕过依赖问题):

    1
    2
    3
    npm 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
    2
    sudo 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
2
3
4
5
外部请求宿主机:81
↓ 端口映射
容器:3000(Vite 需监听 0.0.0.0)
↓ 防火墙放行
成功响应

完成上述排查后,服务应可通过 http://宿主机IP:81 访问。

5.反向代理

最后虽然完成了,但是访问ip加端口号很不安全,而且也无法进行ssl加密。这时候需要用反向代理进行一个域名绑定

宝塔面板-网站-添加站点

PHP版本选择纯静态,起一个二级域名

image-20250329163045507

然后设置ssl证书

image-20250329163438134

设置反向代理

image-20250329163606894

最后还是有一点没有补足,就是IP加端口号的访问不知道如何禁止