PostgreSQL 資料庫建置 - 使用 Docker
介紹如何使用 Docker 建置 PostgreSQL 資料庫
使用 Docker 來建置一個 PostgreSQL 資料庫
包含 資料庫建置
、資料持久化
、使用 GUI 操作資料庫
PostgreSQL 基礎教學:後端前進PostgreSQL 系列
環境建置 - 使用 Docker-compose
使用的映像檔:postgres: alpine
參考文章:Getting Started with PostgreSQL using Docker-Compose
docker-compose.yml
version: '3'
services:
postgres:
container_name: postgres
ports:
- "5432:5432"
image: "postgres:alpine"
volumes:
- database-data:/var/lib/postgresql/data # persist data even if container shuts down
restart: always
environment:
POSTGRES_USER: superuser
POSTGRES_PASSWORD: superpassword
POSTGRES_DB: demo_db
volumes:
database-data: # named volumes can be managed easier using docker-compose
啟動容器:
docker-compose up
GUI
安裝
因為 sequel ace 不支援 PostgreSQL 所以另外裝一個 GUI 來用
安裝 DBeaver
會需要安裝 JAVA 包
brew install --cask dbeaver-community
存取在遠端的 PostgreSQL container
取得該遠端的對外 ip 作為 host 之後連線到指定的 port (5432)
就可以在其他機器上存取 PostgreSQL container
資料持久化 (persist data)
官方文件說明
使用docker-compose啟動服務時,初始化資料庫和資料(以Mysql為例)
Different Types of Volumes
named volume:
docker-compose up
啟動容器docker volume ls
確認有建立 volumedocker-compose stop
停止容器docker-compose up
,使用 GUI 連線容器確認資料有被重新掛載docker-compose down
,移除容器docker ps -a
確認容器確實被移除docker-compose up
,volume 成功掛載回去
host volume
調整容器內 volume 目標資料夾位置到本機特定資料夾下
如果有多台容器需要一起掛載同一份資料:官方文件
這個做法使用 docker volume ls
就不會有結果,要自己去看指定的路徑。因為管理 volume 已經不是透過 docker
version: '3'
services:
postgres:
container_name: postgres
ports:
- "5432:5432"
image: "postgres:alpine"
volumes:
- ./database_data:/var/lib/postgresql/data # persist data even if container shuts down
restart: always
environment:
POSTGRES_USER: superuser
POSTGRES_PASSWORD: superpassword
POSTGRES_DB: database_name
- 調整 yml 檔 service 內 volumes,改為指定路徑
docker-compose up
啟動容器- 使用路徑管理 volume 後
docker volume ls
不會有反應 - 查看指定路徑
./database_data
,volume 檔案成功寫入 docker-compose up
,使用 GUI 連線容器確認資料有被重新掛載docker-compose down
,用docker ps -a
確認 container 確實被移除docker-compose up
,volume 成功掛載回去
補充
如果在同一台機器上想要啟用多個 PostgreSQL 容器
則 5432 port 會被佔用,當然可以將外部 port 改為不衝突的 port
但是內部 port 使用的依然是 5432
如果在容器網路內直接溝通,例如 Laravel 的 .env 設定的 port
當透過容器外部網路線連線時使用調整後錯開的 port 連線正常
但是當執行 php artisan migrate
之類指令,執行者是容器時
要使用的卻是內部的 5432 port,如此在管理上會十分麻煩
此情境下可以透啟動容器時指定內部運行的 port 來解決
postgre:
container_name: stage_postgre
ports:
- "5430:5430"
image: "postgres:12.6"
volumes:
- /project/database/stage/database_data:/var/lib/postgresql/data # persist data even if container shuts down
command: -p 5430
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
restart: always
如上面的設定中 command: -p 5430
指定了內部 postgres 使用的 port
所以在 ports:
設定中就直接將外部 port 5430 指定給內部的 port 5430
這樣不管在容器內或外部都可以使用一樣的 port 來進行連線
使用 GUI 存取在遠端的 PostgreSQL container
取得該遠端的對外 ip 作為 host 之後連線到指定的 port (5432)
就可以在其他機器上存取 PostgreSQL container