以网易云音乐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如果看到一个类似 “NeteaseCloudMusicApi service” 的欢迎页,就成功了!
🛠 二、(可选)自定义配置
可以修改 config.js 文件来自定义:
示例:
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 即可。
✅ 五、小结
六、制作成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]完整格式示例:
docker.io/library/nginx:latest
ghcr.io/xiro/sora-api:1.0Docker Hub 默认
library命名空间如果省略
REGISTRY_HOST,Docker 默认去docker.io如果省略
NAMESPACE,Docker 会使用 Docker Hub 用户名(登录后)或library(未登录)
🔹 总结
简单理解:斜杠是 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=