Postgres 與 Docker 和 Docker 為初學者撰寫分步指南


Docker 迅速崛起 多年來的人氣. Postgres(又名 PostgreSQL)是一個開源的、符合標準的、對象關係數據庫,已經開發了 30 多年。 這位官員 特徵矩陣 展示了 Postgres 的豐富功能。

使用 Docker 和 docker-compose 運行 Postgres 使得運行和維護非常容易,尤其是在開發環境中。 在這篇文章中,我們將研究如何在 Docker 和 Docker 組合中運行和使用 Postgres,讓事情變得簡單易行。 讓我們開始吧!


目錄 #

  • 為什麼使用 Postgres 和 docker 進行本地開發
  • 先決條件
  • 帶有 Docker 的 Postgres
  • PostgreSQL 與 docker-compose
  • 將帶有 Docker 的 Postgres 添加到現有的 Node.js 項目
  • 結論

為什麼要使用帶有 docker 的 Postgres 進行本地開發 #

使用任何數據庫(如 Postgres 和 Docker)進行本地開發有很多很好的理由,以下是一些很好的理由:

  1. 根據項目或任何其他需要使用多個版本的 PostgreSQL 非常容易。
  2. 通常使用 docker,如果它在您的機器上運行,它將為您的朋友在暫存環境和生產環境中運行,前提是保持版本兼容性。
  3. 當一個新的團隊成員加入時,新成員可以在幾個小時內開始工作,而不需要幾天的時間來提高工作效率。

你可以閱讀更多關於為什麼要使用 docker 的信息。 在接下來的部分中,我們將在深入研究使用 Docker 運行 Postgres 的命令之前研究一些有用的東西。

先決條件 #

在我們深入研究一些 CLI 命令和下面的一些代碼之前,最好有一些先決條件:

  1. Docker 的基本知識將有助於執行 docker run、execute 等命令。對於本教程,將在 Mac 中使用 docker 版本 20.10.10。
  2. 任何事先掌握 Docker compose 都會很有用,但不是必需的。 對於本指南,我們將在 Mac 上使用 docker-compose 版本 1.29.1。
  3. 對關係數據庫(尤其是 PostgreSQL)如何工作的中間理解將是非常有益的。
  4. 我們將使用帶有 Node.js 和 Postgres 的現有應用程序/API 將遠程 Postgres 替換為運行 Docker 和 Docker compose 的本地 Postgres,因此建議閱讀上一篇關於它的文章。

鑑於已經提到了先決條件,我們可以前進到下一部分,我們將在其中運行一些 docker 命令。 現在準備好那些發癢的手指。

Postgres 與 Docker #

對於這篇文章,我們將使用來自的官方 Postgres docker alpine 圖像 碼頭工人中心. 我們將使用 PostgreSQL 的最新版本 14.1。

Postgres docker 鏡像的默認靶心版本是 130 MB,而同一版本的 alpine 版本是 78 MB,要小得多。

要使用 Postgres 14.1 alpine 映像簡單地運行容器,我們可以執行以下命令:

docker run --name basic-postgres --rm -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=4y7sV96vA9wv46VR -e PGDATA=/var/lib/postgresql/data/pgdata -v /tmp:/var/lib/postgresql/data -p 5432:5432 -it postgres:14.1-alpine

讓我們評估一下上述命令的作用。 它嘗試從 posgres:14.1-alpine 鏡像運行一個容器,如果它不存在,默認情況下將從 Dockerhub 拉入該鏡像。

一、名稱 basic-posgres 被提供給正在運行的容器,並且 --rm 容器退出時將清理容器並刪除文件系統。 添加了一些環境變量以使事情變得更容易。

最後三個參數很有趣, -v 添加一個卷來存儲數據,對於這個例子,它已經被映射到 /tmp 所以當機器重新啟動時所有數據都會丟失。 接下來,我們使用 -p 參數將主機端口 5432 映射到容器端口 5432。

該命令的最後一個參數是 -it 使 tty 可用。 當我們運行命令時,我們將看到如下輸出:

只用 docker run 運行 PostgreSQL

容器正在運行並準備好接受連接,如果我們運行以下命令,我們可以進入容器內部並運行 psql 命令查看 postgres 與事件變量中提供的用戶名相同的數據庫。

docker exec -it basic-postgres /bin/sh

進入容器後,我們可以運行 psql --username postgres 訪問 Postgres CLI。 列出我們可以運行的數據庫 \l 在 psql CLI 中列出數據庫並查看 Postgres 數據庫,如下所示:

在 Postgres 中執行 Docker 並列出數據庫

如上圖所示 \q 將退出 psql CLI 並退出我們運行的容器的 shell exit.

如果我們回到正在運行的容器並點擊 Ctrl+C 它將停止容器並清理它,因為我們已經使用了 --rm 我們運行它時的參數。

這是一種使用 docker 運行 Postgres 的方法,但正如我們所見,記住 10 班輪命令和所有需要的參數並不容易。

此外,我們還沒有指定數據庫和我們的應用程序之間的任何鏈接。 這是 docker-compose 文件和 碼頭工人撰寫 命令非常方便,如下一節所示。

PostgreSQL 與 docker-compose #

要使用 docker-compose 運行相同的 Postgres 14.1-alpine,我們將創建一個 docker-compose-pg-only.yml 文件內容如下:

version: '3.8'
services:
db:
image: postgres:14.1-alpine
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
volumes:
- db:/var/lib/postgresql/data
volumes:
db:
driver: local

docker-compose 文件需要考慮以下幾點:

  1. 它使用 docker-compose 文件 3.8版
  2. 接下來,我們定義 db 作為一個 服務,每項服務將等同於一個新的 docker run 命令
  3. 我們要求 docker-compose 該服務是 Postgres 版本 14.1 alpine 的映像,如果容器自動停止,它將始終重新啟動。
  4. 因此,我們定義了兩個環境變量以發送 Postgres 用戶和密碼。 請記住,由於官方圖像默認情況下不發送數據庫,因此它將使用用戶名作為數據庫名稱。
  5. 隨後我們映射主機/機器端口 5432 與集裝箱港口 5432 因為 Postgres 在容器的那個端口中運行。
  6. 之後我們讓 docker-compose 來管理 體積 以一個名為 db 它被進一步添加為本地驅動程序。 因此,當容器重新啟動時,數據將從 docker 管理的捲中可用。 要查看卷的內容,我們可以運行 docker volume ls 並檢查附加到我們的 Postgres 容器的捲。

解釋完之後,要啟動我們將運行的容器 docker-compose -f docker-compose-pg-only.yml up 這將顯示如下輸出:

Postgres 容器的 docker-compose up 輸出

所以 Postgres 數據庫正在運行,這次它是一個單行命令,而不是讓它運行的長命令,因為所有需要的參數都在 docker-compose 文件中。

此時,容器中的 Postgres 的行為將類似於本地 Postgres 實例,因為我們已經映射了端口 5432 到本地港口 5432.

接下來,我們將看到如何修改 docker-compose 文件以適應現有項目。

將帶有 Docker 的 Postgres 添加到現有的 Node.js 項目中#

鑑於我們已經看到 PostgreSQL 使用 docker-compose 運行,現在我們將它與運行中的 Node.js API 項目集成。 有關如何使用 Node.js 和 Postgres 構建此 Quotes API 項目的完整分步教程可供您參考。 對於本指南,我們將添加一個 docker-compose.yml 文件內容如下:

version: '3.8'
services:
db:
image: postgres:14.1-alpine
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
volumes:
- db:/var/lib/postgresql/data
- ./db/init.sql:/docker-entrypoint-initdb.d/create_tables.sql
api:
container_name: quotes-api
build:
context: ./
target: production
image: quotes-api
depends_on:
- db
ports:
- 3000:3000
environment:
NODE_ENV: production
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: postgres
DB_NAME: postgres
links:
- db
volumes:
- './:/src'
volumes:
db:
driver: local

該文件看起來有點類似於上面的 docker-compose 文件,但主要區別如下。

第一個是,這裡我們使用 - ./db/init.sql:/docker-entrypoint-initdb.d/create_tables.sql 在第 13 行。我們這樣做是為了創建 quotes 表並填寫數據,如此處所示 SQL 文件. 這是運行的方式 初始化腳本 對於帶有 docker 的 Postgres。 這是一個冪等操作,如果數據目錄被填滿 init.sql 文件不會再次執行以防止數據覆蓋。 如果我們想強制覆蓋數據,我們需要在 docker volume inspect.

接下來,我們定義一個新的服務,叫做 api 它構建了本地 Dockerfile 有目標 production 並命名它 quotes-api. 之後,它有一個 depends_on 上的定義 db 容器,它是我們的 Postgres 容器。

隨後,它將主機端口 3000 映射到運行 Node.js Express API 服務器的公開容器端口 3000。 在環境變量中,它定義 db 作為映射到上述 Postgres 容器並使用與上述定義中提供的相同憑據的主機。 它 鏈接 到 API 服務之前定義的 Postgres 容器。

最後,它將所有本地文件映射到 /src 使用 Node.js 運行的容器。

該文件可在 GitHub 也供您參考。

當我們在該項目的根目錄上運行 docker-compose up 時,我們可以看到以下輸出:

Postgres 和 Node.js Express 容器的 docker-compose up 輸出

由於 webserver 映射到本地端口 3000,我們可以在點擊時看到如下輸出 在任何瀏覽器上:

引用 API 與 Dockerized Node.js 和 PostgreSQL 一起使用 docker-compose

歡呼! 我們的 Node.js Express API for Quotes 按預期與本地 Postgresql 數據庫正確通信。 如果你想快速嘗試 docker-compose up 體驗克隆這個 Github 倉庫 試試看。

如果 Node.js 與 MySQL 是您的選擇,請閱讀本指南。 如果對您更有效,您也可以使用 SQLite 嘗試 Node.js。

結論 #

在這篇文章中,我們見證瞭如何僅使用 docker 運行 Postgres,然後添加了 docker-compose 的優點以使事情變得更容易。 之後,我們將 Postgres 添加到現有的 Node.js API 中,以使本地開發更加容易。

我希望它能讓你更容易理解如何使用 Docker 快速輕鬆地運行 Postgres。

發佈留言