Postgresは、現在利用可能な トップリレーショナルマルチモデルデータベースの1つです 。 これは、重要なデータをエンドユーザーに直接提供するか、APIを介して別のアプリケーションを介して提供するデータベースアプリケーションを強化するように設計されています。 一般的な Web サイトはその最初の例によく適合しますが、財務アプリ (PayPal など) は通常、API を使用して要求を処理 GET
または POST
データベース化します。
Postgres のオブジェクトリレーショナル構造と並行性 は、MySQL のような代替手段よりも優れています。 客観的に最適なデータベーステクノロジーはありませんが、拡張性、データの整合性、オープンソースソフトウェアを重視する場合、Postgresは優れています。 拡張性が高く、複雑な標準ベースの SQL クエリをサポートします。
Postgres Docker Official Image (DOI) を使用すると、アプリケーションに合わせて特別に調整された Postgres コンテナを作成できます。このイメージは、多くのコア セットアップ タスクも処理します。 コンテナ化とPostgres DOIについて説明し、開始方法を示します。
このチュートリアルの内容:
- なぜPostgresをコンテナ化する必要があるのですか?
- Postgresドッカーの公式イメージは何ですか?
- ドッカーでポストグレスを実行する方法
- Postgresイメージを拡張する
- 重要な注意事項とデータストレージのヒント
- 今すぐ次のPostgresプロジェクトをスタート
なぜPostgresをコンテナ化する必要があるのですか?
Postgresデータベースアプリケーションはメインアプリケーションと一緒に実行できるため、コンテナ化は多くの場合有益です。 これにより、必要な場所にPostgresをスピンアップしてデプロイするのがはるかに速くなります。 また、コンテナー化によって、データがデータベース アプリケーションから分離されます。 アプリケーションに障害が発生した場合、データを危害から保護しながら別のコンテナーを簡単に起動できます。
これは、Postgresをローカルにインストールし、追加の構成を実行し、独自のバックグラウンドプロセスを開始するよりも簡単です。 このようなワークフローは余分な時間がかかり、より深い技術的知識を必要とし、変化するアプリケーション要件にうまく適応しません。 そのため、Dockerコンテナは親しみやすく、迅速な開発に合わせて調整されています。
Postgresドッカーの公式イメージは何ですか?
他の Docker イメージと同様に、Postgres Docker 公式イメージには、アプリケーションに必要なすべてのソース コード、コア依存関係、ツール、およびライブラリが含まれています。 Postgres DOIは、データベースアプリケーションにデータの動作と操作方法を指示します。 一方、Postgres コンテナーは、この標準イメージの実行中のインスタンスです。
具体的には、Postgresは次のユースケースに最適です。
- アプリケーションへの Docker 共有ボリュームの接続
- 開発中のストレージソリューションのテスト
- 新しいバージョンのメインアプリケーションまたはPostgres自体に対してデータベースアプリケーションをテストする
PostgreSQL Docker Community はこのイメージを維持しており、その広範な魅力のために Docker Hub に追加しました。
Postgresコンテナを本番環境にデプロイできますか?
はい!この答えにはいくつかの注意点があり、同時に実行するコンテナの数によって異なります。
本番環境でPostgres公式イメージを使用することは可能ですが、Docker Postgresコンテナはローカル開発に最適です。 これにより、Docker Compose などのツールを使用して、サービスをまとめて管理できます。 複数のデータベースコンテナを大規模にやりくりする必要はなく、これは困難な場合があります。
本番環境の Postgres コンテナーを起動するということは、Kubernetes のようなオーケストレーション システムを使用して稼働状態を維持することを意味します。 また、Dockerの製品を補完するためにサードパーティのコンポーネントが必要になる場合もあります。 ただし、Kubernetesに慣れている場合は、絶対にこれを試してみることができます。ArctypeのShanika Wickramasingheは 、そのための1つの方法を共有しています。
これらの理由から、少数のコンテナで本番テストを実行できます。 ただし、それ以上の展開オプションについては、再検討することをお勧めします。
ドッカーでポストグレスを実行する方法
まず、 最新のDockerデスクトップリリースをダウンロードしてインストール します。 Docker Desktop には、Docker CLI、Docker Compose、および補足開発ツールが含まれています。 一方、Docker ダッシュボード (Docker Desktop の UI コンポーネント) は、イメージとコンテナーの管理に役立ちます。
その後、Postgresをドッカライズする時が来ました!
クイックプルコマンドを入力する
Postgresドッカーの公式イメージをプルすることは、始めるための最速の方法です。 ターミナルで、Docker Hub から最新の Postgres バージョンを取得するために入力します docker pull postgres
。
または、特定のタグで好みのバージョンを固定することもできます。 通常、ピン留めは Dockerfiles に関連付けられますが、概念は基本的なプル要求に似ています。
たとえば、必要に応じて postgres v14.5
コマンド docker pull postgres:14.5
を入力します。一般に、特定のバージョンの Postgres を使用することをお勧めします。 バージョンは :latest
新しいPostgresリリースごとに自動的に変更され、それらの新しいバージョンが重大な変更や脆弱性を導入するかどうかを知るのは困難です。
どちらの方法でも、DockerはPostgresイメージをローカルにマシンにダウンロードします。 CLI を使用したプロセスは次のようになります。
プルが完了すると、端末から通知されます。 これは、Dockerデスクトップ内で確認することもできます。 左側のサイドバーから、[ 画像] タブをクリックし、メインウィンドウに表示されるリストをスキャンします。 Docker デスクトップには、355.45 MB の画像が表示されます postgres
。
Postgresは、Docker Hubで最もスリムな主要なデータベースイメージの1つです。 ただし alpine
、画像サイズをさらに縮小し、基本パッケージ(より単純なプロジェクトに最適)を含めるためのバリアントも利用できます。 アルパインのメリットの詳細については、 最近のDocker公式イメージの記事をご覧ください。
次に、新しいイメージをコンテナーとして実行する場合はどうでしょうか。 他の多くの画像では、リスト内の画像にカーソルを合わせて表示される青い[実行]ボタンをクリックすることができますが、Postgresには少し注意が必要です。 データベースであるため、接続を成功させる前に環境変数を設定する必要があります。 それでは、詳しく見ていきましょう。
Postgres インスタンスを起動する
次のコマンド docker run
を入力して、新しい Postgres インスタンスまたはコンテナーを起動します。
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
これにより、名前 some-postgres
の付いたコンテナーが作成され、すべてをバックグラウンドで実行する前に重要な環境変数が割り当てられます。 Postgresが正しく機能するにはパスワードが必要なため、パスワードが含まれています。
このパスワードを既にお持ちの場合は、Docker デスクトップ内で Postgres コンテナーを起動できます。 画像の横にある前述の[実行]ボタンをクリックし、続行する前に[オプション設定]ペイン内にこのパスワードを手動で入力するだけです。
ただし、Postgres インタラクティブターミナル psql
または を使用して、Postgres に直接クエリを実行することもできます。
docker run -it --rm --network some-network postgres psql -h some-postgres -U postgres
psql (14.3)
Type "help" for help.
postgres=# SELECT 1;
?column?
----------
1
(1 row)
ドッカー作成の使用
複数のサービスやデータベース管理ツールを使用している可能性が高いため、Docker Composeを使用すると、インスタンスをより効率的に実行できます。 1 つの YAML ファイルで、サービスの動作を定義できます。 Postgres の例を次に示します。
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
adminer:
image: adminer
restart: always
ports:
- 8080:8080
volumes:
pgdata:
両方のサービスが restart: always
に設定されていることがわかります。 これにより、アプリケーションが実行されているときはいつでもデータにアクセスでき、Adminer管理サービスを同時にアクティブに保ちます。 これにより、コンテナーに障害が発生すると、新しいコンテナーがすぐに起動します。
たとえば、起動時にすぐにデータを必要とする Web アプリを実行しているとします。 あなたのDocker作成ファイルはこれを反映するでしょう。 サービスと depends_on
パラメーターを追加して web
、サービス間のスタートアップとシャットダウンの依存関係を指定します。起動とシャットダウンの順序の制御に関するドキュメントから借用すると、展開されたComposeファイルは次のようになります。
services:
web:
build: .
ports:
- "80:8000"
depends_on:
db:
condition: service_healthy
command: ["python", "app.py"]
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: example
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 1s
timeout: 5s
retries: 10
adminer:
image: adminer
restart: always
ports:
- 8080:8080
Postgres データベースとサポート サービスを起動するには、コマンドを入力します docker compose -f [FILE NAME] up
。
、 psql
、またはDocker Composeのいずれかdocker run
を使用すると、公式イメージを使用してPostgresを正常に起動できます。これらは、「デフォルト」Postgresを操作するための信頼できる方法です。 ただし、データベース アプリケーションはさらに詳しく構成できます。
Postgresイメージを拡張する
Postgres イメージをカスタマイズまたは構成する方法はたくさんあります。 あなたを助けることができる4つの重要なメカニズムに取り組みましょう。
1. 環境変数
Postgresの重要性について POSTGRES_PASSWORD
簡単に触れました。 これを指定しないと、Postgresは効果的に実行できません。 ただし、コンテナーの動作に影響を与える他の変数もあります。
POSTGRES_USER
– スーパーユーザー権限を持つユーザーと、同じ名前のデータベースを指定します。 Postgres は、これが空のときに既定のユーザーを使用します。POSTGRES_DB
– データベースの名前を指定するか、空白のままにすると既定値POSTGRES_USER
になります。POSTGRES_INITDB_ARGS
–引数を送信postgres_initdb
し、機能を追加しますPOSTGRES_INITDB_WALDIR
– Postgres トランザクション ログ用の特定のディレクトリを定義します。 トランザクションは操作であり、通常はデータベースへの変更を記述します。POSTGRES_HOST_AUTH_METHOD
–データベース、ユーザー、およびアドレスへの接続all
を制御しますauth-method
host
PGDATA
–データベースファイル用の別のデフォルトの場所またはサブディレクトリを定義します
これらの変数はプレーンテキスト .env
内にあります ファイル。 最終的に、Postgresがデータベースを作成して接続する方法を決定します。 環境変数の詳細については、 GitHub Postgres 公式イメージのドキュメント を参照してください。
2.ドッカーの秘密
環境変数は便利ですが、ホストとコンテナの間で環境変数を渡すことにはリスクが伴います。 Docker シークレットを使用すると、コンテナーに既に存在するファイルからこれらの値にアクセスして読み込むことができます。 これにより、ポート接続を介した転送中に環境変数がインターセプトされるのを防ぎます。 次のコマンド (およびその反復) を使用して、Postgres で Docker シークレットを活用できます。
docker run --name some-postgres -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-passwd -d postgres
手記: Docker シークレットは、特定の環境変数とのみ互換性があります。 詳細については、ドキュメントを参照してください 。
3. 初期化スクリプト
スクリプトとも呼ばれ init
、実行可能なシェルスクリプトまたはコマンドベース .sql
を実行します Postgresが postgres-data
フォルダを作成するとファイル。 これにより、サービスが完全に稼働する前に重要な操作を実行できます。 逆に、Postgres は、フォルダーが初期化された場合、 postgres-data
これらのスクリプトを無視します。
4. データベース構成
Postgresデータベースアプリケーションはサーバーとして機能し、実行方法を制御することは有益です。 データベースを構成すると、Postgresコンテナが他のサービスとどのように通信するかが決まるだけでなく、Postgresの実行方法とデータへのアクセス方法も最適化されます。
Postgres でデータベース構成を処理する方法は 2 つあります。これらの構成は、専用ファイル内でローカルに適用するか、コマンド ラインを使用できます。 CLI は、エントリポイント スクリプトを使用して、Docker コマンドを Postgres サーバー デーモンに渡して処理します。
手記: 使用可能な構成は、Postgres のバージョンによって異なります。 構成ファイルのディレクトリも、PostgresDocker公式イメージのバリアントを使用している alpine
ときにわずかに変更されます。
重要な注意事項とデータストレージのヒント
Postgresはかなりユーザーフレンドリーですが、いくつかの癖があります。 Postgres コンテナー イメージを操作するときは、次の点に注意してください。
- Postgresがコンテナ内でスピンアップしたときにデータベースが存在しない場合は、デフォルトのデータベースが作成されます。 このプロセスが展開されている間、そのデータベースは着信接続を受け入れません。
- Docker Compose を使用して複数のサービスを起動する場合は、既存のデータベースを操作するのが最適です。 そうしないと、Postgresがデフォルトを作成している間に自動化ツールが失敗する可能性があります。
- Postgres コンテナーが 64 MB のメモリ割り当てを超えると、Docker はエラーをスローします。
- コマンドまたは Docker 作成を使用して、Postgres コンテナーにより多くのメモリを割り当てることができます
docker run
。
データを適切な場所に保存
データのアクセシビリティはPostgresが正しく機能するのに役立つため、データを適切な場所に保存していることを確認する必要もあります。 この場所は、厄介な問題を防ぐために、PostgresとDockerの両方に表示される必要があります。 完璧なストレージソリューションはありませんが、 次の点に注意してください。
- ホストディスク(Docker管理)へのファイルの書き込みと内部ボリューム管理の使用は透過的でユーザーフレンドリーです。 ただし、これらのファイルは、コンテナーの外部のツールやアプリからはアクセスできない場合があります。
- バインド マウントを使用して外部データを Postgres コンテナーに接続すると、データのアクセシビリティの問題を解決できます。 ただし、ディレクトリを作成し、アクセス許可またはセキュリティを設定する責任があります。
最後に、コマンドを使用してコンテナ docker run
を起動する場合は、ホストから適切なディレクトリをマウントすることを忘れないでください。 フラグは -v
これを可能にします。 詳細については 、Docker の実行に関するドキュメント を参照してください。
今すぐ次のPostgresプロジェクトをスタート
私たちが発見したように、PostgresDocker公式イメージを利用することは、ほとんどの場合非常に簡単です。 多くのカスタマイズを使用できるため、使い慣れた拡張性オプションを調べるだけで済みます。 Postgresは拡張機能( PostGISなど)もサポートしており、さらに深い機能を追加することができます。
全体として、Postgresをローカルでドッキングすることには多くの利点があります。 Docker Hubでスイングし、最初の PostgresDocker公式イメージを プルして実験を開始します。 データベースのセットアップを強化するためのさらに詳細な手順については、 Postgres GitHub ページを参照してください。
踏み台が必要ですか? Postgres を活用するこれらの Docker の素晴らしい作成アプリケーションをチェックしてください。
- NGINXプロキシとPostgresデータベースを使用してGoサーバーを構築します。
- サンプルの Postgres と pgAdmin 管理セットアップを作成します。
- RustバックエンドとPostgresデータベースを使用してReactアプリケーションを構築します。
- Spring Framework と Postgres データベースを使用して Java アプリケーションを作成します。