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 的想法,但當處理大量的服務成為日常,容器化技術就變得十分重要 。
- 環境一致性:每個人的開發環境可能不一樣,例如套件版本或其他相依軟體的設定。使用 Docker 可以把「環境變因」通通封裝起來,確保不論在哪台機器上跑,環境都是一致的,減少「在我機器上沒問題」的情況。
- 安裝與移除方便:傳統安裝 Postgres 可能會改動系統設定、占用系統資源或與其他服務衝突。使用 Docker 只要一個指令就能啟動或移除 Postgres,乾淨俐落,不會污染系統。
- 支援多版本並存:某些專案需要使用不同版本的資料庫,手動切換版本不僅麻煩也容易出錯。使用 Docker 可以在同一台機器上同時跑多個版本的 Postgres。
- 快速初始化資料與設定:透過 Docker 的 Volume 機制或是初始化腳本,我們可以快速建立資料表結構、塞入測試資料,甚至搭配 docker-compose 一次建立一整套服務環境(資料庫、後端、前端)。
- 團隊協作更容易:當你用 Docker 定義好環境,其他開發者只須執行一條指令就能啟動資料庫。不需要每個人都手動設定環境,大幅減少溝通成本與錯誤空間。
怎麼執行 Postgres Docker
一、從 Docker Hub 下載 postgres 的 docker image。
docker pull postgres:latest
二、查看現有 docker image:docker images
REPOSITORY TAG IMAGE ID CREATED SIZEpostgres latest 7fb32a7ac3a9 4 days ago 438MB
三、啟動新的 postgres container
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 會自動讀取專案根目錄下的 `.env` 檔案。services: db: image: postgres:latest environment: - POSTGRES_PASSWORD=${DB_PASSWORD} ports: - ${DB_PORT}:5432 volumes: - ./db-data:/var/lib/postgresql/data