Docker 入门:别再让你的利益相关者去安装 Postgres!🚀
Source: Dev.to
我曾经让一位重要的利益相关者在他的笔记本电脑上安装 Postgres,只是为了展示我的进展。
那是 2024 年 9 月——我职业生涯的早期阶段——而那一刻的尴尬至今仍驱动着我对 Docker 和开发者体验(DX)的执着。
项目还处于起步阶段。当利益相关者想要自己尝试时,我给了他一份待办清单:
- 安装 Node.js 和 PNPM。
- 搭建本地 Postgres 实例。
- 切换到 Linux 环境。
- 手动配置凭据并运行迁移。
我并没有分享一个项目;我分享的是一种负担。
今天,我不再交付代码;我交付的是环境。
这段经历是我的警醒。作为开发者,我的工作不仅仅是写代码——更是交付价值。如果利益相关者或新同事无法在几分钟内运行项目,那我就失败了。
为什么在开发中使用 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 将会:
- 从
Dockerfile构建 Next.js 镜像。 - 拉取 Postgres 镜像。
- 创建一个将两个容器链接起来的网络。
- 启动启用了热重载的开发服务器。
你也可以根据需要添加启动或数据填充脚本。
要点
我曾以为 Docker 只是一个复杂的 DevOps 工具——直到 2024 年的那个下午,我才意识到资深并不只是写出花哨的代码,而是把代码 作为业务的工具。
通过交付环境而不仅仅是代码,我重新赢回了时间,提升了新人入职速度,并带来了真正的价值。
准备好把你的 “Postgres 头疼” 变成一键工作流了吗? 🚀
容器化您的开发环境
团队的 DX,并确保没有任何 stakeholder 需要在他们的 laptop 上安装 database。
如果您想让项目或职业发展壮大,请从今天开始 containerizing。未来的自己和团队会感谢您的。
您最糟糕的环境搭建经历是什么? 在评论中分享吧!
我帮助 startups engineer scalable applications 和 internal tools,使其在增长过程中保持 fast。了解我如何构建 scalable systems,请访问这里:👉 www.itsfranciscoluna.com