如何使用 Docker 安裝 PostgreSQL ?
若要在 Mac 使用 PostgreSQL,最簡單的方式就是使用 Docker 。本文分別使用 docker run
與 docker-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
: d
etach,建立 container 後,就脫離目前 process
-v
: v
olume,PostgresSQL 新增的資料會寫在 container 內的 /var/lib/postgresql/data
目錄,會改 mapping 到 host 的 ~/Postgres
,如此 container 刪除後,資料仍然會留在 host
-p
: p
ort mapping,host 與 container post 的對應,格式為 host port : container port-e
: e
nvironment,設定 PostgreSQL 所需要的環境變數
POSTGRES_DB
: database 名稱POSTGRES_USER
: 帳號POSTGRES_PASSWORD
: 密碼
postgress:latest
: image 名稱,其中 latest
為最新版的 image
使用 Docker-Compose
docker run
方式雖然直接,但需要搭配一堆參數才能執行,若能將這些參數先寫在文字檔內,只要下 docker-compose up -d
就可執行 container。
-d
: d
etach,建立 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_DB
、POSTGRES_USER
與 POSTGRES_PASSWORD
將在 .env
中設定。
.env
1 | HOST_DIR=~/Postgres |
此為 Docker-compose.yml
所設定的環境變數,被獨立在 .env
中,可單獨設定,不用修改 Docker-compose.yml
。
Docker-compose up
1 | $ docker-compose up -d |
使用 docker-compose up
啟動 PostgreSQL。
-d
: d
etach,建立 container 後,就脫離目前 process
Docker-compose down
1 | $ docker-compose down |
使用 docker-compose down
結束 PostgreSQL,並且刪除 container。
Conclusion
- 要在 Mac 使用 PostgreSQL,最簡單的方式就是使用 Docker
docker-run
與Docker-Compose
都可以啟動 PostgreSQL,實務上建議使用Docker-Compose
,將變數寫在.env
中,這樣可使用docker-compose up -d
就可啟動 PostgreSQL,docker-compose down
就可結束 PostgreSQL,不用再擔心參數問題
Sample Code
完整的範例可以在我的 GitHub 上找到