sql >> データベース >  >> RDS >> PostgreSQL

Dockerコンテナ内で実行されているPostgreSQLを監視する方法:パート1

    監視とは、監視対象がどのように発展し、実行されるかを確認するために、一定期間にわたって監視およびチェックするアクションです。これを行うのは、物事が正しく機能するように必要な変更を加えることができるようにするためです。効率的なソリューションを計画、整理、実行するには、実行されているアクティビティに関する優れた洞察を生み出すために、プロセスを監視することが不可欠です。

    Dockerは、「ソフトウェアは私のマシンで実行されますか?」という質問に答える準備ができているビルダーとして動作するように作成されたプログラムです。基本的には、さまざまな部品を組み立てて、保管や輸送が簡単なモデルを作成します。このモデルはコンテナとも呼ばれ、Dockerがインストールされているすべてのコンピューターに出荷できます。

    この記事では、Dockerを紹介し、構成のいくつかの方法を説明し、それらを比較します。さらにPostgreSQLが登場し、Dockerコンテナ内にスマートな方法でデプロイします。最後に、ClusterControlが提供できる利点を確認し、PostgreSQLとその外部のOSに関する主要な指標を監視します。

    Dockerの概要

    Dockerが起動すると、新しいネットワーク接続が作成され、ブリッジと呼ばれる2つのエンドポイント間でデータを送信できるようになります。これは、デフォルトで新しいコンテナーが保持される場所です。

    以下では、このブリッジの詳細を確認し、本番環境で使用するのが適切でない理由について説明します。

    $ docker network inspect bridge
    Dockerのデフォルトのブリッジdocker0を検査しています。

    目的のネットワークを指定せずにコンテナを実行すると、それに同意するため、埋め込まれたオプションに注意してください。

    このデフォルトのネットワーク接続では、DNSなどのネットワークのいくつかの優れた利点が失われます。 Googleにアクセスしたいとします。www.google.comと172.217.165.4のどちらのアドレスを使用しますか?

    あなたのことはわかりませんが、私は以前の選択肢を好みます。正直なところ、「www。」とは入力しません。

    ユーザー定義のブリッジネットワーク

    したがって、同じネットワーク内に異なるコンテナを展開するシナリオを想像してみてください。ネットワーク接続にDNSが必要であり、分離のメリットがあります。

    Dockerコンテナーを作成するときに、名前を付けることができます。または、Dockerによって、アンダースコアまたは「_」で接続された2つの単語がランダム化されます。

    ユーザー定義のブリッジネットワークを使用しない場合、私たちは明らかにマシンではないため、将来的にIPアドレスの途中で問題が発生する可能性があり、これらの値は困難でエラーが発生しやすいことを覚えておいてください。

    >

    カスタムブリッジ、またはユーザー定義のブリッジネットワークの作成は非常に簡単です。

    最初のターミナルを作成する前に、プロセスをよりよく理解するために、新しいターミナルを開き、パッケージiproute2のLinuxコマンドを入力して、今では忘れてみましょう。

    $ ip monitor all
    Dockerホストのネットワークトラフィックを監視するためにターミナルを初期化します。

    これで、この端末はネットワークアクティビティをリッスンし、そこに表示されます。

    「ifconfig」や「netstat」などのコマンドを以前に見たことがあるかもしれませんが、2001年以降、これらのコマンドは廃止されています。パッケージnet-toolsはまだ広く使用されていますが、更新されていません。

    次に、最初のカスタムネットワークを作成します。別のターミナルを開いて、次のように入力します。

    $ docker network create --driver bridge br-db
    ユーザー定義のブリッジネットワーク「br-db」を作成します。

    この非常に長い文字と数字の組み合わせは、UUIDまたはUniversallyUniqueIDentifierと呼ばれます。基本的に、ネットワークは正常に作成されたと言っています。

    手動で作成した最初のネットワークの名前は「br-db」であり、コマンドの最後に含める必要がありますが、その前に、引数「-driver」、次に値「bridge」があります。 、なぜ?

    Community Editionでは、Dockerはブリッジ、ホスト、なしの3つの異なるドライバーを提供します。このように、作成時にはデフォルトはブリッジであり、指定する必要はありませんが、学習中です。

    私と一緒にすべてを行った場合は、他の端末を見てください。何が起こっているのかを説明します。

    Dockerは「br-db」と呼ばれるネットワークを作成しましたが、これは彼によってのみこのように呼び出されます。

    作成されたこのカスタムブリッジの反対側には、OSという別のレイヤーがあります。同じブリッジネットワークの名前が変更され、ブリッジの命名法「br」に続いて、上記のUUID値の最初の12文字が赤で表されます。

    DockerIPアドレスの変更を監視しています。

    新しいネットワーク接続では、サブネット、ゲートウェイ、およびブロードキャストがあります。

    ゲートウェイは、その名前が示すように、パケットのすべてのトラフィックがブリッジエンドポイント間で発生する場所であり、ご覧のとおり、OSでは「inet」と呼ばれます。

    ブロードキャストは最後のIPアドレスにあり、必要に応じてサブネット内のすべてのIPアドレスに同じデータトラフィックを送信する責任があります。

    これらは常にネットワーク接続に存在します。そのため、出力の最初に値「[ADDR]」があります。この値はIPアドレスの変更を表し、新しいネットワーク接続を作成したため、ネットワークアクティビティの監視のために発生するイベントのようなものです!

    Dockerコンテナ

    Docker Hubにアクセスして、Docker Imageと呼ばれるものがあり、基本的にはコンテナー(モデル)のスケルトンであることを確認してください。

    DockerイメージはDockerfilesによって生成され、メンテナンスとカスタマイズを容易にするために、コンテナーの作成に必要なすべての情報が含まれています。

    Docker Hubを注意深く見ると、postgresと呼ばれるPostgreSQLイメージのタグとバージョンが異なることが簡単にわかります。それらのいずれかを指定しないと、デフォルトが使用されます。将来、PostgreSQLの異なるコンテナを一緒に動作させる必要がある場合は、それらを同じバージョンにする必要があります。

    ここで最初の適切なコンテナを作成しましょう。引数「--network」の必要性を覚えておいてください。そうしないと、デフォルトのブリッジにデプロイされます。

    $ docker container run --name postgres-1 --network br-db -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6551:5432 -d postgres
    PostgreSQLコンテナをネットワーク「br-db」に実行します。

    繰り返しますが、UUID、成功、そして他の端末では、何が起こっているのでしょうか?

    ネットワークインターフェイスの変更は、現在発生しているイベント、または単に「[LINK]」です。 「veth」の後に忘れることができるものは何でも、私を信じてください。コンテナが再起動されるか、同様のことが起こると、値は常に変化します。

    Dockerネットワークインターフェースの変更を監視します。

    他のオプション「-ePOSTGRES_PASSWORD=?」はEnvironmentの略で、PostgreSQLコンテナを実行している場合にのみ使用でき、postgresと呼ばれるデータベースのスーパーユーザーアカウントのパスワードを構成しています。

    公開は「-p6551:5432」パラメータの長い名前であり、基本的にOSポート6551をコンテナのポート5432に双方向でバインドします。

    最後になりますが、それほど重要ではありませんが、デタッチオプション「-d」があります。これは、コンテナをこのターミナルから独立して実行することです。

    Dockerイメージ名は、ネットワーク作成の同じパターンに従い、左側にすべての引数とオプションがあり、最後に最も重要なもの、この場合はイメージ名である必要があります。

    コンテナはネットワークサブネットに保持され、それぞれに許可されたIPアドレス上にあり、ゲートウェイとブロードキャストが常に存在するため、最初または最後のアドレスに格納されることはありません。

    作成されたブリッジの詳細を示しました。これで、これらの詳細が保持されている各エンドポイントによって表示されます。

    $ docker network inspect br-db
    Dockerユーザー定義ネットワークインターフェイス"br-db"の検査。
    $ brctl show
    Dockerホストによるユーザー定義ブリッジネットワークに関する情報の表示。

    ご覧のとおり、ネットワーク名とコンテナ名は異なります。2番目の名前はOSによってインターフェースとして認識され、「veth768ff71」と呼ばれ、元の名前はDockerの「postgres-1」です。

    Dockerコマンドでは、以前に作成されたコンテナーのIPアドレス、少し前に開いた他の端末に表示されたものと一致するサブネット、最後にこのカスタムネットワークのオプションを空にすることができます。

    Linuxコマンド「brctlshow」はパッケージbridge-utilsの一部であり、その名前が示すように、その目的はLinuxイーサネットブリッジを構成および管理するための一連のツールを提供することです。

    別のカスタムブリッジネットワーク

    DNSについてはすぐに説明しますが、将来的には非常に簡単になりました。優れた構成は、将来的にDBAの寿命を延ばす傾向があります。

    ネットワークの場合も同じであるため、OSがサブネットを認識する方法を変更して、アドレスとネットワーク名を作成時に引数を追加することができます。

    $ docker network create --driver bridge --subnet 172.23.0.0/16 -o “com.docker.network.bridge.name”=”bridge-host” bridge-docker
    カスタムオプションを使用したユーザー定義のブリッジネットワークインターフェイスの作成。
    $ ip route show
    Dockerルーティングテーブルの表示。

    このLinuxコマンドを使用すると、以前の他のコマンドとほぼ同じことがわかりますが、各ネットワークの「veth」インターフェイスを一覧表示する代わりに、この「リンクダウン」に空のユーザーを表示するだけです。

    目的のサブネットアドレスが引数として指定されており、コンテナ作成の[環境]オプションと同様に、ネットワークの場合、「-o」の後にキーと値のペアが続きます。この場合、DockerにOSに、ネットワークを「ブリッジホスト」と呼ぶように指示しています。

    これらの3つのネットワークの存在は、Dockerでも確認できます。次のように入力してください。

    $ docker network ls
    Dockerエンジンでのネットワークインターフェイスの表示。

    先ほど、コンテナのこれらの「veth」の値は重要ではないことを説明しました。実際に紹介します。

    この演習では、現在の値を確認してから、コンテナーを再起動してから、もう一度確認します。そのためには、以前に使用したLinuxコマンドと、ここでは新しいが非常に単純なDockerコマンドを組み合わせる必要があります。

    $ brctl show
    $ docker container stop postgres-1
    $ docker container start postgres-1
    $ brctl show
    「iptables」によって、Dockerホストのコンテナー名がどのように揮発性になるかを確認します。

    コンテナを停止するときは、必要に応じて新しいIPアドレスを受信できるように、IPアドレスを解放する必要があります。これは、DNSがいかに重要であるかを思い出させるものです。

    OSは、コンテナがIPアドレスに立つたびにインターフェイスにこれらの名前を付け、パッケージiptablesを使用して生成されます。このパッケージは、まもなくnftablesと呼ばれる新しいフレームワークに置き換えられます。

    これらのルールを変更することはお勧めしませんが、必要に応じて、dockervethなどの視覚化に役立つツールがあります。

    コンテナ再起動ポリシー

    Dockerプログラム、またはコンピューターを再起動すると、Dockerによって作成されたネットワークはOSに保持されますが、空になります。

    コンテナには、コンテナ再起動ポリシーと呼ばれるものがあります。これは、作成時に指定されるもう1つの非常に重要な引数です。 PostgreSQLは、本番データベースとして、彼の可用性が非常に重要であり、これがDockerがそれを支援する方法です。

    $ docker container run --name postgres-2 --network bridge-docker --restart always -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6552:5432 -d postgres
    作成時にコンテナ再起動ポリシーを指定します。

    手動で停止しない限り、このコンテナ「postgres-2」は常に利用可能です。

    理解を深めるために、実行中のコンテナーが表示され、Dockerプログラムが再起動されてから、最初のステップが再び実行されます:

    $ docker container ls
    $ systemctl restart docker
    $ docker container ls
    「postgres-2」のコンテナ再起動ポリシーを確認しています。

    コンテナ「postgres-2」のみが実行されており、別の「postgres-1」コンテナは単独では起動しません。詳細については、Dockerのドキュメントをご覧ください。

    ドメインネームシステム(DNS)

    User-Defined Bridge Networkの利点の1つは組織です。これは、新しいコンテナーを実行したり、古いコンテナーを接続したりするために必要な数だけ作成できるためですが、Dockerのデフォルトブリッジを使用していないもう1つの利点はDNS。

    コンテナが相互に通信する必要がある場合、DBAがIPアドレスを記憶するのは困難な場合があります。これについては、www.google.comと172.217.165.4の例を示して前に説明しました。 DNSはこの問題をシームレスに解決し、IPアドレス「172.23.0.2」の代わりに「postgres-2」のように作成時に指定された名前を使用してコンテナと対話できるようにします。

    それがどのように機能するか見てみましょう。同じネットワークに「postgres-3」というデモ目的で別のコンテナを作成し、パッケージiputils-pingをインストールして、データのパケットをコンテナ「postgres-2」に送信します。もちろんその名前を使用します。 。

    $ docker container run --name postgres-3 --network bridge-docker --restart always -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6553:5432 -d postgres
    $ docker container exec -it postgres-3 bash

    理解を深めるために、コマンドをパーツに分けてみましょう。次の出力では、コマンドがコンテナ内で実行されたときは青い矢印で、OSでは赤い矢印で示されます。

    一時コンテナを実行して、ユーザー定義のブリッジネットワークインターフェイスによって提供されるDNSをテストします。
    $ apt-get update && apt-get install -y iputils-ping
    DNSをテストするためのパッケージ「iputils-ping」のインストール。
    $ ping postgres-2
    DNSが正常に機能していることを示しています。

    概要

    PostgreSQLはDocker内で実行されており、彼の可用性は現在保証されています。ユーザー定義のブリッジネットワーク内で使用すると、DNS、カスタムサブネットアドレス、ネットワークのOS名など、多くの利点を備えたコンテナの管理が容易になります。

    Dockerの詳細と、OS上の更新されたパッケージとフレームワークを認識することの重要性を見てきました。


    1. オンプレミスとSaaS:データベース監視システムアーキテクチャ

    2. SQL ServerでのSCHEMA_NAME()のしくみ

    3. SQL Server(T-SQL)で添付ファイル付きの電子メールを送信する

    4. 一時テーブルなしでMySQLテーブル内のすべての重複レコードを削除するにはどうすればよいですか?