Getting started with Docker and building Postgres

初学 Docker 并轻松构建 Postgres

前言

刚接触后端时我还不清楚如何有效重现服务供其他开发者使用,直到遇见 Docker 才大幅简化各种设施的维护与重现的工作,是一项非常高回报的实用技能,本篇从实做角度透过 Docker 构建 Postgres 服务,了解它的便捷快速。

什么是 Docker?

Docker 是一套容器化技术工具,可以想像成是更轻量的虚拟机。

名称解释
Image(映像文件)就像应用程序的蓝图,定义了要安装什么、如何设置,是静态不可变的。
Container(容器)是根据映像文件的执行个体,可以有很多个彼此独立的容器。
Dockerfile描述如何一步步建立 Image,例如要安装什么软件、开哪些 port 等。
docker-compose.yml描述如何同时启动多个容器服务(如 web、数据库等),以及它们之间如何互相连接与设置环境参数。
Volume将数据储存在主机上的文件夹,用来实现数据持久化(不会因容器删除而遗失)。
Port Mapping将容器内的服务(例如 Postgres 的 5432 port)对应到本机可访问的 port,例如 localhost:5432

为什么需要 Docker?

如果可以直接在电脑上安装 Postgres,何必还要透过 Docker 构建?一开始会有懒得再额外使用 Docker 的想法,但当处理大量的服务成为日常,容器化技术就变得十分重要

  1. 环境一致性:每个人的开发环境可能不一样,例如套件版本或其他相依软件的设置。使用 Docker 可以把「环境变因」通通封装起来,确保不论在哪台机器上跑,环境都是一致的,减少「在我机器上没问题」的情况。
  2. 安装与移除方便:传统安装 Postgres 可能会改动系统设置、占用系统资源或与其他服务冲突。使用 Docker 只要一个指令就能启动或移除 Postgres,干净利落,不会污染系统。
  3. 支援多版本并存:某些项目需要使用不同版本的数据库,手动切换版本不仅麻烦也容易出错。使用 Docker 可以在同一台机器上同时跑多个版本的 Postgres。
  4. 快速初始化数据与设置:透过 Docker 的 Volume 机制或是初始化脚本,我们可以快速建立数据表结构、塞入测试数据,甚至搭配 docker-compose 一次建立一整套服务环境(数据库、后端、前端)。
  5. 团队协作更容易:当你用 Docker 定义好环境,其他开发者只须执行一条指令就能启动数据库。不需要每个人都手动设置环境,大幅减少沟通成本与错误空间。

怎么执行 Postgres Docker

一、从 Docker Hub 下载 postgres 的 docker image。

Terminal window
docker pull postgres:latest

二、查看现有 docker image:docker images

Terminal window
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres latest 7fb32a7ac3a9 4 days ago 438MB

三、启动新的 postgres container

Terminal window
docker run --name drizzle-postgres -e POSTGRES_PASSWORD=mypassword -d -p 5432:5432 postgres
  • --name :将容器命名为 drizzle-postgres。
  • -e: 设置 POSTGRES_PASSWORD 环境变量为指定的值。
  • -d:以「后台运行模式🔗」(detached mode)运行。
  • -p:将容器内的 5432 埠对应到主机上的 5432 埠,让你可以透过这个埠从主机存取 Postgres。

四、访问 Postgres

(没有特别注明的话,user / database 默认都是 postgres

postgres://<user>:<password>@<host>:<port>/<database>
postgres://postgres:mypassword@localhost:5432/postgres

Docker Compose 整合 docker

既然在 Docker Hub 已有现成的 Postgres Image🔗 可以使用,使用 docker-compose.yml 整合上述行为并透过 docker compose up 即可快速启动本地 Postgres 于特定 port。

docker-compose.yml
# docker-compose 会自动读取项目根目录下的 `.env` 文件。
services:
db:
image: postgres:latest
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD}
ports:
- ${DB_PORT}:5432
volumes:
- ./db-data:/var/lib/postgresql/data

延伸阅读