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ネットワークを使用してアクセスを容易にするのが最適です。