在Ubuntu上把Node.js应用装进容器,听起来像是什么高大上的操作,其实说白了就是借助Docker这把“瑞士军刀”。容器化部署的核心思路很简单:把应用和它的依赖环境打包成一个标准化的单元,走到哪跑到哪,不再被“在我机器上能跑”这种问题困扰。下面就是一套经过多次验证的实操流程,直接照着来就行。

1. 安装Docker
这一步没什么悬念。确认你的Ubuntu系统已经装好Docker,如果没有,两行命令搞定:
sudo apt update
sudo apt install docker.io
装完后记得把当前用户加入docker组(sudo usermod -aG docker $USER),不然每次都要sudo,挺烦的。
2. 创建Node.js应用
假设你已经有一个Node.js应用,或者像下面这样随手写一个简单的Express服务作为演示。创建一个app.js:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
再配一个package.json,里面依赖写上express,然后npm install一下,这些基础工作就不展开了。
3. 创建Dockerfile
在应用目录下新建一个Dockerfile,内容如下——这是整个容器化的核心蓝图:
# 使用官方的Node.js基础镜像
FROM node:14
# 设置工作目录
WORKDIR /usr/src/app
# 将package.json和package-lock.json复制到工作目录
COPY package*.json ./
# 安装应用依赖
RUN npm install
# 将应用代码复制到工作目录
COPY . .
# 暴露应用的端口
EXPOSE 3000
# 启动应用
CMD ["node", "app.js"]
这里有几个细节值得注意:先复制package*.json再运行npm install,是为了利用Docker的缓存机制——只要package.json没变,依赖安装这一步就不会重复执行,能省下不少构建时间。
4. 构建Docker镜像
在包含Dockerfile的目录下执行:
docker build -t my-node-app .
注意最后的那个点,代表当前目录。构建过程会逐行执行Dockerfile里的指令,如果一切顺利,终端会输出一堆提示,最后显示镜像构建成功。
5. 运行Docker容器
镜像有了,启动容器就是一句话的事:
docker run -p 3000:3000 my-node-app
这条命令把容器内的3000端口映射到宿主机的3000端口,这样你就能在宿主机上通过localhost:3000访问应用了。
6. 验证部署
打开浏览器,输入http://localhost:3000,如果看到“Hello World!”的响应,恭喜,容器化部署成功。这一步其实也是检验整个流程是否跑通的终点。
7. 其他优化
基础玩法讲完了,但实际生产环境肯定不会这么简单。以下几个方向值得关注:
- Docker Compose:如果应用依赖数据库、缓存等中间件,用Compose可以把多个容器编排在一起,一键启动,省心很多。
- CI/CD集成:把构建和部署流程接入Jenkins、GitLab CI之类的工具,每次代码提交自动打包镜像、推送仓库、更新容器,这才是真正的自动化。
- 监控与日志:容器跑起来之后,怎么知道它是否健康?用Prometheus+Grafana做监控,用ELK Stack收集日志,这些都是标配。
总的来说,容器化部署的本质就是“一次构建,到处运行”。这套流程虽然简单,但它是后续所有复杂容器化方案(Kubernetes、服务网格等)的基础,值得反复练习直到形成肌肉记忆。