Byte Ebi's Logo

Byte Ebi 🍤

每天一小口,蝦米變鯨魚

PostgreSQL 資料庫建置 - 使用 Docker

介紹如何使用 Docker 建置 PostgreSQL 資料庫

Ray

使用 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:

  1. docker-compose up 啟動容器
  2. docker volume ls 確認有建立 volume
  3. docker-compose stop 停止容器
  4. docker-compose up,使用 GUI 連線容器確認資料有被重新掛載
  5. docker-compose down,移除容器
  6. docker ps -a 確認容器確實被移除
  7. 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
  1. 調整 yml 檔 service 內 volumes,改為指定路徑
  2. docker-compose up 啟動容器
  3. 使用路徑管理 volume 後 docker volume ls 不會有反應
  4. 查看指定路徑 ./database_data,volume 檔案成功寫入
  5. docker-compose up,使用 GUI 連線容器確認資料有被重新掛載
  6. docker-compose down,用 docker ps -a 確認 container 確實被移除
  7. 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

最新文章

Category

Tag