以网易云音乐api项目为例

一、直接获取并启动

npm pack NeteaseCloudMusicApi@4.28.0
tar -xvzf NeteaseCloudMusicApi-4.28.0.tgz
cd package
npm install
node app.js

默认会提示:

server running @ http://localhost:3000

访问:
👉 http://localhost:3000

如果看到一个类似 “NeteaseCloudMusicApi service” 的欢迎页,就成功了!

🛠 二、(可选)自定义配置

可以修改 config.js 文件来自定义:

配置项

默认值

说明

port

3000

服务监听端口

host

localhost

监听地址

proxy

''

如果你要通过代理访问网易接口

cookie

''

如果你有自己的网易云登录 cookie

示例:

module.exports = {
  port: 3000,          // 容器内部端口
  host: '0.0.0.0',     // 监听所有 IP
  proxy: '',            // 可选代理
  cookie: ''            // 可选网易云 cookie
};

🧰 三、(可选)使用 PM2 守护进程部署

如果你希望让服务在后台长期运行,可以使用 PM2:

npm install -g pm2
pm2 start app.js --name "netease-api"
pm2 save
pm2 startup

🧱 四、(可选)Nginx 反向代理部署(生产环境)

如果你想让别人也能访问,可以用 Nginx:

server {
    listen 80;
    server_name musicapi.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

然后重启 Nginx 即可。

✅ 五、小结

步骤

命令

1️⃣ 解压

npm pack NeteaseCloudMusicApi@4.28.0 && tar -xvzf NeteaseCloudMusicApi-4.28.0.tgz && cd package

2️⃣ 安装依赖

npm install

3️⃣ 启动服务

node app.js

4️⃣ 测试访问

浏览器打开 http://localhost:3000

六、制作成docker镜像(优化体积后的)

Dockerfile

根目录新建文件Dockerfile

# ====== 基础镜像 ======
FROM node:18-alpine AS builder

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY package*.json ./

# 安装所有依赖(包含 devDependencies 避免 husky install 报错)
RUN npm install --registry=https://registry.npmmirror.com

# 复制源码
COPY . .

# 删除 devDependencies,保留生产依赖
RUN npm prune --production

# ====== 运行镜像 ======
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 从 builder 镜像复制精简后的生产依赖和源码
COPY --from=builder /app /app

# 暴露端口(与 config.js 中端口一致)
EXPOSE 3000

# 启动服务
CMD ["node", "app.js"]

精简版 Dockerfile 的原理和精简思路

1️⃣ 分层构建(multi-stage build)

FROM node:18-alpine AS builder
…
FROM node:18-alpine
  • 原理
    使用 构建阶段(builder) 安装全部依赖(包括 devDependencies),再把最终需要的东西复制到 最终运行阶段

  • 优势

    • devDependencies(如 husky、测试工具)不会进入最终镜像

    • 镜像体积明显减小

    • 避免生命周期脚本(prepare、postinstall)在最终镜像执行

这是官方推荐的 Docker 镜像优化方法。

.dockerignore

根目录新建文件.dockerignore

node_modules
npm-debug.log
Dockerfile
docker-compose.yml
.git
.gitignore

开始构建镜像

docker build -t neteasecloudmusicapi:4.28.0 .

# 如果想要带斜杠的完整名字
docker build -t kuuhaku/neteasecloudmusicapi:4.28.0 .

1️⃣ 镜像名字的结构

Docker 镜像名通常有三个部分:

[REGISTRY_HOST/]NAMESPACE/IMAGE_NAME[:TAG]

部分

说明

示例

REGISTRY_HOST

可选,仓库地址(默认 Docker Hub)

docker.ioghcr.io

NAMESPACE

用户名 / 组织名

libraryxiromyorg

IMAGE_NAME

镜像名

nginxneteasecloudmusicapi

TAG

版本标签

latest4.28.0

完整格式示例:

docker.io/library/nginx:latest
ghcr.io/xiro/sora-api:1.0
  • Docker Hub 默认 library 命名空间

  • 如果省略 REGISTRY_HOST,Docker 默认去 docker.io

  • 如果省略 NAMESPACE,Docker 会使用 Docker Hub 用户名(登录后)或 library(未登录)

🔹 总结

情况

显示效果

说明

本地构建不加 namespace

neteasecloudmusicapi:4.28.0

只有镜像名 + 标签

加 namespace

xiro/neteasecloudmusicapi:4.28.0

显示为 <namespace>/<镜像名>

指定 registry

registry.com/xiro/neteasecloudmusicapi:4.28.0

完整镜像地址,适合 push 到远程仓库

简单理解:斜杠是 namespace/组织名,不写就是本地默认,没有就显示单名字

查看镜像列表

# 查看所有镜像列表
docker images

# 查看悬空镜像列表
docker images -f dangling=true

删除悬空镜像

# 删除单个指定id的镜像
docker rmi <IMAGE_ID>

# 删除所有悬空镜像
docker image prune -f
  • -f 表示 force,不再提示确认

  • 只会删除 悬空镜像,不会删除有标签的镜像

docker-compose.yml

version: '3.9'

services:
  neteaseapi:
    image: neteasecloudmusicapi:4.28.0   # 使用你构建的本地镜像
    container_name: netease-api
    restart: always                       # 容器挂掉自动重启
    ports:
      - "3000:3000"                       # 外部 3000 端口映射到容器 3000
    volumes:
      - ./config.js:/app/config.js        # 本地 config.js 挂载到容器,可自定义端口、cookie 等
    environment:
      # 清空 request 相关代理变量,避免错误
      - http_proxy=
      - https_proxy=
      - HTTP_PROXY=
      - HTTPS_PROXY=
      - no_proxy=
      - NO_PROXY=