Loading articles...
Docker 解决了"在我机器上能跑"这个经典问题。通过容器化,你可以将应用及其依赖打包成一个可移植的镜像,在任何支持 Docker 的环境中运行。
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
# 运行阶段
FROM node:20-alpine AS runner
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
# ✅ 好的做法:先复制依赖文件(变化频率低)
COPY package.json pnpm-lock.yaml ./
RUN pnpm install
COPY . .
# ❌ 不好的做法:先复制所有文件
COPY . .
RUN pnpm install
| 命令 | 用途 |
|---|---|
docker build -t name . |
构建镜像 |
docker run -p 3000:3000 name |
运行容器 |
docker compose up -d |
启动多容器应用 |
docker logs -f container |
查看日志 |
docker exec -it container sh |
进入容器 |
docker system prune -a |
清理未使用资源 |
Next.js 应用的开发环境 compose 文件:
version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
volumes:
- .:/app
- /app/node_modules
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myblog
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
# 查看镜像各层大小
docker history my-image:latest
# 使用 dive 工具分析镜像
dive my-image:latest
几点优化建议:
alpine 变体的基础镜像RUN 指令减少层数.dockerignore 排除不需要的文件docker system prune加载评论…