Postgresとも呼ばれるPostgreSQLは、主要なオブジェクトリレーショナルデータベースシステムです。 SQL標準への高いレベルの準拠と、複雑なデータセットの大規模な操作を簡素化する追加機能が含まれているため、人気があります。
PostgreSQLは従来のクライアントサーバーアーキテクチャを使用しているため、アプリケーションのコードとは別に実行する必要があります。このガイドでは、PostgreSQLサーバーインスタンスをDockerコンテナとしてデプロイします。これにより、ホストマシンにパッケージを追加する必要がなくなり、データベースをスタックの他の部分から分離するのに役立ちます。続行する前に、Dockerがインストールされていることを確認してください。
PostgreSQLにはDockerHubの公式イメージがあり、いくつかの異なるバリエーションで利用できます。タグを使用すると、v9からv14までの主要なPostgreSQLバージョンから選択し、ベースイメージとして使用するオペレーティングシステムを選択できます。 Alpine、Debian Stretch、DebianBullseyeが提供されています。
このチュートリアルでは、postgres:14
を使用します Bullseyeの上にPostgreSQL14を提供するタグ。要件に合わせて別のバージョンを自由に選択できます。
docker run
を使用してPostgreSQLコンテナを起動します コマンド:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
あなたはしなければならない POSTGRES_PASSWORD
の値を指定します 環境変数。これは、Postgresのデフォルトのスーパーユーザーアカウントに割り当てられるパスワードを定義します。ユーザー名のデフォルトはpostgres
ただし、POSTGRES_USER
を設定することで変更できます 環境変数。
-v
フラグは、DockerボリュームをPostgreSQLコンテナのデータディレクトリにマウントするために使用されます。 postgres
という名前のボリューム 参照されます。 Dockerはそれを作成するか、ボリュームがすでに存在する場合はボリュームを再接続します。データベースをコンテナの外部に保存するには、ボリュームを使用する必要があります。これがないと、コンテナが停止したときにデータを使用します。
PostgreSQLはデフォルトでポート5432でリッスンします。コンテナポートは、-p
によってDockerホストのポート5432にバインドされます。 国旗。 -d
フラグは、コンテナをデタッチモードで開始するために使用され、docker stop
で停止するまで実行を継続するバックグラウンドサービスになります。 。
スーパーユーザーのパスワードをプレーンテキストのCLIフラグとして指定することに不安がある場合は、代わりにボリュームを介してファイルとして挿入できます。次に、POSTGRES_PASSWORD_FILE
を設定する必要があります Postgresにそのファイルへのパスを与える環境変数:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password -v ./postgres-password.txt:/run/secrets/postgres-password -v postgres:/var/lib/postgresql/data postgres:14
この手法は、POSTGRES_USER
でも機能します およびその他のサポートされている環境変数。
PostgreSQLは上記のポート5432にバインドされているため、localhost:5432
でデータベースに接続できます。 互換性のあるクライアントから。コンテナを起動するときに、環境変数として割り当てたクレデンシャルを使用します。
Dockerイメージには、psql
も含まれています docker exec
で呼び出すことができるバイナリ 。これを使用して、コンテナ内のPostgreSQLシェルからデータベースをすばやく操作します。
docker exec -it postgres psql -U postgres
Dockerネットワークを作成することは、同じホスト上の他のコンテナーからPostgreSQLにアクセスするための推奨される方法です。これにより、Postgresサーバーのポートがバインドされ、サービスがホストのより広いネットワークに公開される可能性がなくなります。
Dockerネットワークを作成します:
docker network create my-app
--network
を使用して、ネットワークへの接続でPostgresコンテナを起動します docker run
のフラグ :
docker run -d --name postgres --network my-app -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
次に、アプリケーションコンテナを同じネットワークに参加させます:
docker run -d --name api --network my-app my-api:latest
ネットワーク内のコンテナは、postgres
を使用してPostgresに到達できます ホスト名。これはname
です。 Postgresコンテナに割り当てられます。ポート5432を使用して接続を完了します。
PostgreSQLの構成
-c
を使用してPostgreSQLサーバーオプションを渡すことができます docker run
のイメージ名の後のフラグ コマンド:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14 -c max_connections=100
イメージ名がコンテナで開始されたコマンドに渡された後のすべて。 Postgresイメージの場合、このコマンドはPostgreSQLサーバーのバイナリになります。
複数のオプションの値を設定する場合は、カスタム構成ファイルを使用できます。別のDockerボリュームを使用してファイルをコンテナにマウントしてから、1つの-c
を指定する必要があります。 Postgresにどこを見ればよいかを指示するフラグ:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./postgres.conf:/etc/postgresql/postgresql.conf -v postgres:/var/lib/postgresql/data postgres:14 -c config_file=/etc/postgresql/postgresql.conf
この例では、Dockerバインドマウントを使用してpostgres.conf
を取得します コンテナの/etc/postgresql
にマウントされた作業ディレクトリ内のファイル ディレクトリ。バイナリフラグまたは設定ファイルディレクティブで設定できるオプションのリファレンスについては、PostgreSQLのドキュメントを参照してください。
Dockerイメージは、/docker-entrypoint-initdb.d
に配置されたシードファイルをサポートします ディレクトリ。任意の.sql
または.sql.gz
データベースを初期化するためにファイルが実行されます。これは、デフォルトのユーザーアカウントとpostgres
の後に発生します データベースが作成されました。 .sh
を追加することもできます 任意のシェルスクリプトを実行するファイル。すべてのスクリプトはアルファベット順に実行されます。
このメカニズムは、データベースにシードするために必要なのは、正しい順序で名前が付けられたSQLまたはシェルスクリプトのセットだけであることを意味します。 -v
を使用して、これらを新しいコンテナにマウントします docker run
のフラグ :
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./db-seed-files/:/etc/docker-entrypoint-initdb.d -v postgres:/var/lib/postgresql/data postgres:14
初期化スクリプトは、Postgresデータディレクトリが空の場合にのみ使用されます。実用的な目的では、これは、新しい空のボリュームがアタッチされた状態でコンテナが最初に起動したときに実行されることを意味します。
構成ファイルと初期化スクリプトを独自のDockerイメージにカプセル化することを選択できます。これにより、イメージにアクセスできるすべてのユーザーが、アプリケーション用に事前構成された新しいPostgreSQLインスタンスを起動できるようになります。使用できる簡単なDockerfileは次のとおりです。
FROM postgres:14 COPY postgres.conf /etc/postgresql/postgresql.conf COPY db-seed-files/ /etc/docker-entrypoint-initdb.d/ CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]
カスタムイメージを作成する:
docker build -t custom-postgres:latest .
Dockerfileのビルド手順では、PostgreSQL構成ファイルと初期化スクリプトを作業ディレクトリからコピーして、コンテナーイメージに埋め込みます。これで、リソースを手動で提供しなくてもデータベースコンテナを起動できます。
docker run -d --name custom-postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data custom-postgres:latest
本番データベースをコンテナ化する必要がありますか?
Dockerでデータベースを実行するかどうかを決定するのは難しい場合があります。 PostgreSQLをコンテナ化すると、セットアップが簡単になりますが、保守が難しい場合があります。将来のデータ損失を避けるために、コンテナを管理するときは注意する必要があります。 Dockerはまた、ツアーデータベースが非常に大量のデータで動作すると予想される場合に検討する価値のある適度なパフォーマンスオーバーヘッドを追加します。
Dockerの利点は、移植性の向上、スケーリングの容易さ、および開発者の効率です。データベースをコンテナ化すると、最初にPostgreSQLを手動でインストールして構成しなくても、Dockerを使用して誰でも新しいインスタンスを起動できます。したがって、構成ファイルとSQLシードスクリプトを追加するPostgreSQLデータベース用のDockerfileを作成することは、開発者が新しい環境を迅速に開始するのに役立つ良い方法です。
PostgreSQLは、オブジェクトリレーショナル機能を追加する高度なSQLベースのデータベースエンジンです。従来のデプロイメントを本番環境で実行することを選択することもできますが、コンテナー化されたインスタンスを使用すると、セットアップが簡素化され、開発者が独自のインフラストラクチャをすばやく起動できるようになります。
Dockerizedデプロイメントの最も重要な側面は、データを格納するためにボリュームを使用していることを確認することです。これにより、データベースを失うことなく、コンテナを停止、置換、および新しいイメージバージョンに更新できます。ストレージ以外にも、Postgresに接続する方法を評価し、必要な場合を除いて、ポートをホストにバインドしないようにする必要があります。別のコンテナから接続する場合は、共有Dockerネットワークを使用してアクセスを容易にするのが最適です。