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

延伸閱讀