Docker 入门:别再让你的利益相关者去安装 Postgres!🚀

发布: (2026年1月12日 GMT+8 04:32)
7 分钟阅读
原文: Dev.to

Source: Dev.to

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

项目还处于起步阶段。当利益相关者想要自己尝试时,我给了他一份待办清单:

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

我并没有分享一个项目;我分享的是一种负担。

今天,我不再交付代码;我交付的是环境。

这段经历是我的警醒。作为开发者,我的工作不仅仅是写代码——更是交付价值。如果利益相关者或新同事无法在几分钟内运行项目,那我就失败了。

为什么在开发中使用 Docker?

Docker 常被宣传为 DevOps 工具,但它同样强大,适用于 专业开发环境

手动方式

  • 在机器上安装 Postgres
  • 设置 WSL(或其他 Linux 层)
  • 确保每个服务都在运行
  • 单独配置每个服务
  • 验证版本兼容性
  • …等等

Docker 方式

“安装 Docker Desktop 并运行几条命令即可开始构建。”

快速检查

docker --version          # Verify Docker is installed
docker run hello-world    # Pull an image and spin it up in seconds

Docker 让你把 代码、运行时和库 打包成一个称为 容器 的单元,能够在任何操作系统/机器上运行。

  • 虚拟机 很笨重:它们需要完整的操作系统副本,消耗大量内存/CPU。
  • 容器 共享宿主机的 OS 内核,只安装所需的库。

核心 Docker 概念

概念描述
Dockerfile定义如何构建镜像的蓝图(操作系统、Node 版本、依赖)。
Image从 Dockerfile 生成的只读快照。
Container镜像的运行实例;您可以启动/停止/删除它,而不会影响主机。

解决 “Postgres 头疼” 的 Docker Compose

还记得利益相关者的清单吗?使用 Docker Compose,整个手动过程只需一个命令即可完成:

docker compose up

把每个服务(应用、数据库、消息队列)想象成一种乐器。在 docker‑compose.yaml 文件中,你用 YAML 编排它们,把一组服务变成和谐的整体。

注意: Docker Compose 适用于开发环境和小型 MVP。对于大规模生产环境,最终仍需使用负载均衡器和 Kubernetes。

项目结构

/project-root

├─ docker-compose.yaml
├─ Dockerfile
└─ .dockerignore

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 dev server port
EXPOSE 3000

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

.dockerignore

类似 .gitignore,此文件可防止不必要或敏感的文件被添加到镜像中。

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:

关键点

  • 基础镜像node:20-alpine(轻量;如有需要可选择其他 Node 镜像)。
  • depends_on 确保在数据库容器启动后才启动应用。
  • 命名卷 postgres_data 在容器重启后仍然保留数据库数据。
  • 健康检查(可选)可以添加,以使依赖关系更可靠。

一键设置

将上述三个文件放在项目根目录后,你已经把 1 小时的手动设置 变成了 10 秒的命令

docker compose up

Docker 将会:

  1. Dockerfile 构建 Next.js 镜像。
  2. 拉取 Postgres 镜像。
  3. 创建一个将两个容器链接起来的网络。
  4. 启动启用了热重载的开发服务器。

你也可以根据需要添加启动或数据填充脚本。

要点

我曾以为 Docker 只是一个复杂的 DevOps 工具——直到 2024 年的那个下午,我才意识到资深并不只是写出花哨的代码,而是把代码 作为业务的工具

通过交付环境而不仅仅是代码,我重新赢回了时间,提升了新人入职速度,并带来了真正的价值。

准备好把你的 “Postgres 头疼” 变成一键工作流了吗? 🚀

容器化您的开发环境

团队的 DX,并确保没有任何 stakeholder 需要在他们的 laptop 上安装 database。

如果您想让项目或职业发展壮大,请从今天开始 containerizing。未来的自己和团队会感谢您的。

您最糟糕的环境搭建经历是什么? 在评论中分享吧!

我帮助 startups engineer scalable applications 和 internal tools,使其在增长过程中保持 fast。了解我如何构建 scalable systems,请访问这里:👉 www.itsfranciscoluna.com

Back to Blog

相关文章

阅读更多 »

你好,我是新人。

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