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確認有建立 volume
- docker-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

 
   
   
   
  