你写完代码,测试通过,提交到仓库。同事拉下来,报错。运维部署到服务器,又报错。这种"环境不一致"的破事,每个开发者都遇到过。Docker要解决的就是这个——它把你的应用装进一个"通用盒子",代码、依赖、配置全打包进去,一次构建,到处运行。
这篇指南带你把一个最简Node.js服务Docker化,全程实操,没有废话。最终镜像体积能从300MB压到50MB,构建速度快3倍。
![]()
前置准备
只需要两样东西:电脑上装好Docker,以及Node.js用于本地验证。准备好了吗?开始。
第一步:造一个能跑的Node.js应用
先有个东西可打包。我们用Express框架搭一个最简Web服务,新建项目文件夹,里面放两个文件。
package.json是项目配置和依赖清单,内容如下:
{
"name": "simple-node-app",
"version": "1.0.0",
"description": "A simple Node.js app for Docker",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.2"
}
}
index.js是服务器代码:
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Hello from my Node.js app!');
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
终端进入项目文件夹,执行npm install和npm start。浏览器打开http://localhost:3000,看到"Hello from my Node.js app!"就算成功。本地能跑只是第一步,接下来把它装进Docker。
第二步:搞懂Docker的三个核心概念
动手写配置前,必须分清这三个东西:Dockerfile是写满构建步骤的指令集,Image是按Dockerfile执行后生成的只读模板,Container则是镜像的运行实例、真正干活的进程。流程很简单:写Dockerfile → 构建成Image → 跑起来成为Container。记住这个顺序,后面不会晕。
第三步:写Dockerfile,定义你的"盒子"
项目根目录新建文件,文件名就叫Dockerfile,没后缀。逐行解释如下:
# 基于官方Node.js镜像,alpine版本体积极小
FROM node:18-alpine
# 在容器内创建并进入/app目录
WORKDIR /app
# 先复制package.json和package-lock.json
# 这一步有讲究:Docker会缓存这层,依赖没变就不重复安装
COPY package*.json ./
# 在容器内执行npm install
RUN npm install
# 再复制其余源代码
COPY . .
# 暴露3000端口
EXPOSE 3000
# 容器启动时执行的命令
CMD ["node", "index.js"]
两个COPY分开写是Docker构建缓存的关键技巧。只要package.json不变,npm install就不会重复执行,构建速度提升数倍。alpine版本相比默认镜像,体积从300MB压缩到50MB,生产环境必用。
第四步:构建并运行你的容器
执行构建命令,-t是给镜像打标签:docker build -t my-node-app . 看到Successfully built就是成了。然后运行:docker run -p 3000:3000 my-node-app。-p是把容器内的3000端口映射到宿主机的3000端口。浏览器再访问http://localhost:3000,同样的Hello消息,这次是从容器里跑出来的。
关掉终端,容器也跟着停了。想要后台常驻运行,加-d参数:docker run -d -p 3000:3000 my-node-app。执行docker ps能看到正在跑的容器,docker stop加容器ID可以停止。
常见坑与解决方案
端口冲突最常见,宿主机3000被占用就换映射,比如-p 3001:3000。node_modules别进镜像,新建.dockerignore文件,里面写node_modules和npm-debug.log,构建时自动排除。生产环境别用root跑,Dockerfile里加USER node切换用户,安全合规。
总结
你现在掌握了一套完整的Node.js Docker化流程:准备应用、理解核心概念、编写Dockerfile、构建运行。这套"通用盒子"方案,彻底终结"我电脑能跑"的尴尬。下一步可以研究docker-compose编排多容器,或者CI/CD流水线自动构建推送。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.