学习 Docker:不再让你的利益相关者安装 Node.js

发布: (2026年1月10日 GMT+8 21:36)
5 分钟阅读
原文: Dev.to

Source: Dev.to

我曾经让一位重要的利益相关者在他的笔记本电脑上安装 Postgres,只是为了向他展示我的进展。那是 2024 年 9 月,我职业生涯的早期阶段,而那一刻的尴尬至今仍驱动着我对 Docker 和开发者体验的执着。

当这位利益相关者想要自己尝试项目时,我给了他一份待办清单:

  1. 安装 Node.js 和 PNPM。
  2. 搭建本地 Postgres 实例。
  3. 切换到 Linux 环境。
  4. 手动配置凭证并运行迁移。

我并没有分享一个项目——而是把风险转嫁给了他。那次经历是我的警钟:开发者的工作不仅是写代码,更是要 快速 交付价值。如果利益相关者或新同事在几分钟内无法运行项目,我就算失败了。

为什么在开发中使用 Docker?

Docker 常被宣传为 DevOps 工具,但它在 专业开发环境 中同样表现出色。与其:

  • 手动安装 Postgres
  • 设置 WSL
  • 确保每个服务都在运行且版本匹配

不如只安装一次 Docker Desktop,然后运行一个命令即可启动整个技术栈。在我公司,这将入职时间从 5 天缩短到几小时

容器共享宿主操作系统的内核,因此相较于完整的虚拟机更轻量。它们只打包你需要的库和依赖,使得启动速度快,并且可以在任何机器上轻松复现。

核心 Docker 概念

概念描述
Dockerfile定义如何构建镜像的蓝图(基础操作系统、Node.js 版本、依赖等)。
Image从 Dockerfile 生成的只读快照。它包含你的应用程序及其运行环境。
Container镜像的运行实例。你可以启动、停止和删除容器,而不会影响主机系统。

通过 Docker Compose 解决 “Postgres 头疼” 问题

项目结构

/project-root
│   docker-compose.yaml
│   Dockerfile
│   .dockerignore
│   ... (source code)

Dockerfile(构建 Next.js 应用)

# Dockerfile
FROM node:20-alpine

# Install PNPM globally
RUN npm install -g pnpm

# Set working directory
WORKDIR /app

# Install dependencies
COPY package.json pnpm-lock.yaml* ./
RUN pnpm install

# Copy source code
COPY . .

# Expose the development port
EXPOSE 3000

# Start the dev server
CMD ["pnpm", "dev"]

.dockerignore(防止不需要的文件进入镜像)

node_modules
.pnpm-debug.log

.next
out
build

.env
.env.local
.env*.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

.git
.gitignore

.DS_Store
Thumbs.db

docker-compose.yaml(编排服务)

# docker-compose.yaml
services:
  db:
    image: postgres:15-alpine
    container_name: nextjs-db
    restart: always
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: supersecretpassword
      POSTGRES_DB: db
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  app:
    build: .
    container_name: nextjs-app
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://admin:supersecretpassword@db:5432/db
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      - db
    command: pnpm dev

volumes:
  postgres_data:

关键点

  • depends_on 确保应用仅在数据库容器启动后才启动。
  • 在生产环境中,你可以添加 healthcheck 来验证数据库真正就绪后再让应用连接。
  • 使用 命名卷 (postgres_data) 可以在容器重启之间持久化数据库数据。

运行 docker compose up 会构建 Next.js 镜像、拉取 Postgres 镜像、创建网络并启动两个服务——把原本需要一小时的手动配置压缩成 10 秒 的命令。

结论

Docker 将我的工作流程从“让利益相关者安装所有东西”转变为“交付一个可以在任何地方运行的环境”。通过容器化开发堆栈,我节省了时间,提升了团队的开发体验,并确保再也没有人需要在笔记本电脑上安装数据库。

如果你想扩展项目——或是你的职业生涯——请从今天开始进行容器化。未来的你和你的团队会感谢你的。

Back to Blog

相关文章

阅读更多 »

你好,我是新人。

嗨!我又回到 STEM 的领域了。我也喜欢学习能源系统、科学、技术、工程和数学。其中一个项目是…