您的位置:首页 >Ubuntu Nodejs与Docker如何结合
发布于2026-05-02 阅读(0)
扫一扫,手机访问
将 Node.js 应用打包进 Docker 容器,听起来技术感十足,但核心流程其实非常清晰:准备环境、编写配置文件、构建并运行。整个过程需要兼顾开发时的便捷与生产环境的高效安全。下面,我们就来一步步拆解。
万事开头先搭环境。在 Ubuntu 上,你需要准备好 Node.js 运行时和 Docker 引擎。
sudo apt update && sudo apt install -y nodejs npm。nvm install 16 && nvm use 16 即可。curl -fsSL https://get.docker.com | sudo sh。sudo apt update && sudo apt install -y docker.io。sudo systemctl start docker && sudo systemctl enable docker。node -v、npm -v。docker run hello-world。理论说再多,不如动手跑一遍。我们用一个简单的 Express 应用来演示完整流程。
mkdir my-node-app && cd my-node-app && npm init -y。npm install express。const express = require('express');
const app = express();
app.get('/', (_, res) => res.send('Hello, Docker'));
app.listen(3000, () => console.log('Server on 3000'));
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
USER node
CMD ["node", "app.js"]
node:18-alpine;使用 npm ci 替代 npm install,能确保依赖安装更快且完全可复现;通过 USER node 指令让应用以非 root 用户运行,提升安全性;EXPOSE 3000 声明了容器监听的端口;最后用 CMD 指定启动命令。docker build -t my-node-app .docker run -d --name my-running-app -p 3000:3000 my-node-apphttp://<服务器IP>:3000 或本地的 http://localhost:3000,就能看到 “Hello, Docker” 的问候了。开发阶段,我们追求的是修改代码后能立刻看到效果。Docker Compose 和热重载工具是这里的黄金搭档。
如果你的应用需要数据库(比如 MongoDB),Compose 能一键启动所有服务。创建一个 docker-compose.yml 文件:
version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- MONGO_URI=mongodb://mongo:27017/mydb
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
depends_on:
- mongo
mongo:
image: mongo:6
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
volumes:
- mongo-data:/data/db
volumes:
mongo-data:
执行 docker-compose up -d 即可启动。这里有两个技巧:一是通过卷(volumes)将本地代码目录挂载到容器中,实现代码实时同步;二是单独挂载一个 node_modules 卷,防止容器内的依赖被本地空目录覆盖。
npm i -D nodemon。package.json 中添加脚本:"dev": "nodemon app.js"。command: ["npm", "run", "dev"]
将配置信息如数据库连接字符串写入 .env 文件,在代码中通过 process.env 读取。这样做既能避免硬编码,也便于区分不同环境的配置。
当应用要上线时,镜像体积、安全性和稳定性就成了首要考虑因素。
这是生产构建的标配,它能将构建依赖和运行时依赖分离,最终只保留运行所需的最小内容。
FROM node:18-alpine AS builder
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production
USER node
CMD ["node", "dist/index.js"]
在项目根目录创建 .dockerignore,排除 node_modules、.git、.env 等不必要的文件和目录。这能显著减少构建上下文大小,加速构建过程。
正如前面 Dockerfile 所示,使用 USER node 指令。同时,在挂载卷时要注意策略,避免覆盖容器内已安装的 node_modules。
在 Compose 文件中为服务添加健康检查配置,让编排工具能感知应用状态。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 5s
retries: 3
http://localhost:3000。/usr/src/app/node_modules 进行隔离。npm ci 命令,并确保 package-lock.json 或 yarn.lock 文件被提交到版本控制,以锁定依赖版本。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9