在 Mac 最簡單使用 PostgreSQL 方式就是使用 Docker

若要在 Mac 使用 PostgreSQL,最簡單的方式就是使用 Docker 。本文分別使用 docker rundocker-compose 兩種方式。

Version


macOS High Sierra 10.13.6
Docker for Mac 18.03.1-ce-mac65 (24312)
PostgreSQL 10.3

使用 docker run


1
$ docker run --name MyPostgres -d -p 5432:5432 -v ~/Postgres:/var/lib/postgresql/data -e POSTGRES_DB=eflab -e POSTGRES_USER=admin -e POSTGRES_PASSWORD='12345' postgres:latest

使用 docker run 由 image 建立 container,當 Docker 發現本機沒有 image,會自動從 Docker Hub 下載。

—name:替 container 取一個人能夠識別的名字 MyPostgres (若省略,Docker 會自動以亂數建立 )
-d : detach,建立 container 後,就脫離目前 process

-v : volume,PostgresSQL 新增的資料會寫在 container 內的 /var/lib/postgresql/data 目錄,會改 mapping 到 host 的 ~/Postgres,如此 container 刪除後,資料仍然會留在 host

-p : port mapping,host 與 container post 的對應,格式為 host port : container port
-e : environment,設定 PostgreSQL 所需要的環境變數

  • POSTGRES_DB : database 名稱
  • POSTGRES_USER : 帳號
  • POSTGRES_PASSWORD : 密碼

postgress:latest : image 名稱,其中 latest 為最新版的 image

post000

使用 Docker-Compose


docker run 方式雖然直接,但需要搭配一堆參數才能執行,若能將這些參數先寫在文字檔內,只要下 docker-compose up -d 就可執行 container。

-d : detach,建立 container 後,就脫離目前 process

Docker-compose.yml

1
version: "3"

services:
  postgres:
    image: postgres:latest
    container_name: MyPostgres
    volumes:
      - ${HOST_DIR}:/var/lib/postgresql/data
    expose:
      - 5432
    ports:
      - ${POSTGRES_PORT}:5432
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

第 1 行

1
version: "3"

使用 version 設定 docker-compose.yml 格式的版本。

因為 docker-compose.yml 的格式版本與 Docker 版本息息相關,若你要使用新版的 Docker 所提供的功能,在 docker-compose.yml 的版本就必須下的更細,如 3.3,在此只使用了 docker-compose.yml 基本功能而已,使用 3 即可。

第 3 行

1
services:
  postgres:

使用 services 設定有哪些 service 要一起跑。

Docker-compose.yml 理論上可以同時描述多個 service,也就是多個 container,如 .NET Core + PostgreSQL + Nginx + Redis 同時啟動,但本文只想使用 PostgreSQL 而已,因此僅建立 postgres service。

第 4 行

1
postgres:
  image: postgres:latest

設定 postgres service,此名稱可自行建立。

  • image : 設定使用的 image。

latest 表示最新版的 postgres

第 6 行

1
container_name: MyPostgres

使用 container_name 設定 container 名稱。

相當於 docker run--name

第 7 行

1
volumes:
  - ${POSTGRES_HOST_DIR}:/var/lib/postgresql/data

使用 volumes 設定 host 與 container 所對應的目錄,將來 PostgreSQL 所寫入資料,將寫入 host 目錄。

: 左側為 host 目錄,右側為 container 內目錄。

相當於 docker run-v

POSTGRES_HOST_DIR 將在 .env 中設定。

第 9 行

1
expose:
  - 5432

使用 expose 設定 container 的 port。

第 11 行

1
ports:
  - ${POSTGRES_PORT}:5432

使用 ports 設定 host 與 container 所 mapping 的 port。

: 左側為 host 的 port,右側為 container 的 port。

相當於 docker run-p

POSTGRES_PORT 將在 .env 中設定。

13 行

1
environment:
    - POSTGRES_DB=${POSTGRES_DB}
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

設定 PostgreSQL 的 database、user 與 password,此為 PostgreSQL 所需要的環境變數。

相當於 docker run-e

POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD 將在 .env 中設定。

.env

1
2
3
4
5
HOST_DIR=~/Postgres
POSTGRES_PORT=1234
POSTGRES_DB=eflab
POSTGRES_USER=admin
POSTGRES_PASSWORD=12345

此為 Docker-compose.yml 所設定的環境變數,被獨立在 .env 中,可單獨設定,不用修改 Docker-compose.yml

Docker-compose up

1
$ docker-compose up -d

使用 docker-compose up 啟動 PostgreSQL。

-d : detach,建立 container 後,就脫離目前 process

post001

Docker-compose down

1
$ docker-compose down

使用 docker-compose down 結束 PostgreSQL,並且刪除 container。

post002

Conclusion


  • 要在 Mac 使用 PostgreSQL,最簡單的方式就是使用 Docker
  • docker-runDocker-Compose 都可以啟動 PostgreSQL,實務上建議使用 Docker-Compose,將變數寫在 .env 中,這樣可使用 docker-compose up -d 就可啟動 PostgreSQL,docker-compose down 就可結束 PostgreSQL,不用再擔心參數問題

Sample Code


完整的範例可以在我的 GitHub 上找到

2018-07-25