学习 Docker:不再让你的利益相关者安装 Node.js
Source: Dev.to
我曾经让一位重要的利益相关者在他的笔记本电脑上安装 Postgres,只是为了向他展示我的进展。那是 2024 年 9 月,我职业生涯的早期阶段,而那一刻的尴尬至今仍驱动着我对 Docker 和开发者体验的执着。
当这位利益相关者想要自己尝试项目时,我给了他一份待办清单:
- 安装 Node.js 和 PNPM。
- 搭建本地 Postgres 实例。
- 切换到 Linux 环境。
- 手动配置凭证并运行迁移。
我并没有分享一个项目——而是把风险转嫁给了他。那次经历是我的警钟:开发者的工作不仅是写代码,更是要 快速 交付价值。如果利益相关者或新同事在几分钟内无法运行项目,我就算失败了。
为什么在开发中使用 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 将我的工作流程从“让利益相关者安装所有东西”转变为“交付一个可以在任何地方运行的环境”。通过容器化开发堆栈,我节省了时间,提升了团队的开发体验,并确保再也没有人需要在笔记本电脑上安装数据库。
如果你想扩展项目——或是你的职业生涯——请从今天开始进行容器化。未来的你和你的团队会感谢你的。