Dockerは、コンテナーを使用してアプリケーションを作成、デプロイ、実行するための最も一般的なツールになりました。これにより、ライブラリやその他の依存関係など、必要なすべての部分を含むアプリケーションをパッケージ化し、すべてを1つのパッケージとして出荷できます。 Dockerは仮想マシンと見なすことができますが、Dockerを使用すると、仮想オペレーティングシステム全体を作成する代わりに、アプリケーションで実行しているシステムと同じLinuxカーネルを使用でき、アプリケーションには、まだ実行されていないものを同梱するだけで済みます。ホストコンピューター。これにより、パフォーマンスが大幅に向上し、アプリケーションのサイズが小さくなります。
このブログでは、Dockerを介してPostgreSQLセットアップを簡単にデプロイする方法と、ClusterControlを使用してプライマリ/スタンバイレプリケーションセットアップでセットアップを有効にする方法を説明します。
Dockerを使用してPostgreSQLをデプロイする方法
まず、PostgreSQL Dockerイメージを使用して、Dockerを使用してPostgreSQLを手動でデプロイする方法を見てみましょう。
イメージはDockerHubで入手でき、コマンドラインから見つけることができます:
$ docker search postgres
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
postgres The PostgreSQL object-relational database sy… 6519 [OK]
最初の結果を取得します。公式のもの。したがって、画像をプルする必要があります:
$ docker pull postgres
そして、ローカルポートをデータベースポートからコンテナにマッピングするノードコンテナを実行します。
$ docker run -d --name node1 -p 6551:5432 postgres
$ docker run -d --name node2 -p 6552:5432 postgres
$ docker run -d --name node3 -p 6553:5432 postgres
これらのコマンドを実行した後、次のDocker環境を作成する必要があります:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51038dbe21f8 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6553->5432/tcp node3
b7a4211744e3 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6552->5432/tcp node2
229c6bd23ff4 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6551->5432/tcp node1
これで、次のコマンドを使用して各ノードにアクセスできます。
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.
postgres=#
次に、データベースユーザーを作成したり、要件に応じて構成を変更したり、ノード間のレプリケーションを手動で構成したりできます。
PostgreSQLコンテナをClusterControlにインポートする方法
関連リソースClusterControlforPostgreSQLDockerコンテナにPostgreSQLをデプロイするKubernetesを使用してPostgreSQLをデプロイするPostgreSQLクラスターをセットアップしたので、それを監視し、パフォーマンスの問題が発生した場合にアラートを出し、バックアップを管理し、障害を検出し、正常なサーバーに自動的にフェイルオーバーする必要があります。
Docker上でPostgreSQLクラスターを既に実行していて、ClusterControlでそれを管理したい場合は、データベースコンテナーと同じDockerネットワークでClusterControlコンテナーを実行するだけです。唯一の要件は、ターゲットコンテナにSSH関連のパッケージ(openssh-server、openssh-clients)がインストールされていることを確認することです。次に、ClusterControlからデータベースコンテナへのパスワードなしのSSHを許可します。完了したら、「既存のサーバー/クラスターのインポート」機能を使用すると、クラスターがClusterControlにインポートされます。
まず、OpenSSH関連のパッケージをデータベースコンテナにインストールし、rootログインを許可して起動し、rootパスワードを設定しましょう:
$ docker exec -ti [db-container] apt-get update
$ docker exec -ti [db-container] apt-get install -y openssh-server openssh-client
$ docker exec -it [db-container] sed -i 's|^PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -ti [db-container] service ssh start
$ docker exec -it [db-container] passwd
ClusterControlコンテナを起動し(起動されていない場合)、コンテナのポート80をホストのポート5000に転送します。
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
ClusterControlコンテナーが稼働していることを確認します:
$ docker ps | grep clustercontrol
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 4 hours ago Up 4 hours (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
Webブラウザーを開き、 http:// [Docker_Host]:5000 / clustercontrolに移動します デフォルトの管理者ユーザーとパスワードを作成します。これで、ClusterControlのメインページが表示されます。
最後のステップは、すべてのデータベースコンテナにパスワードなしのSSHを設定することです。このためには、各データベースノードのIPアドレスを知る必要があります。それを知るために、ノードごとに次のコマンドを実行できます。
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.6",
次に、ClusterControlコンテナのインタラクティブコンソールに接続します。
$ docker exec -it clustercontrol bash
SSHキーをすべてのデータベースコンテナにコピーします:
$ ssh-copy-id 172.17.0.6
$ ssh-copy-id 172.17.0.7
$ ssh-copy-id 172.17.0.8
これで、クラスターのClusterControlへのインポートを開始できます。 Webブラウザを開き、マップされたポートを使用してDockerの物理ホストIPアドレスに移動します(例: http://192.168.100.150:5000/clustercontrol ) 、[既存のサーバー/クラスターのインポート]をクリックして、次の情報を追加します。
SSHでサーバーに接続するには、ユーザー、キー、またはパスワードとポートを指定する必要があります。新しいクラスターの名前も必要です。
SSHアクセス情報を設定した後、データベースユーザー、バージョン、basedir、および各データベースノードのIPアドレスまたはホスト名を定義する必要があります。
ホスト名またはIPアドレスを入力するときに緑色のチェックマークが表示されていることを確認してください。これは、ClusterControlがノードと通信できることを示します。次に、[インポート]ボタンをクリックし、ClusterControlがジョブを終了するまで待ちます。 ClusterControlアクティビティセクションでプロセスを監視できます。
インポートすると、データベースクラスターがClusterControlダッシュボードの下に一覧表示されます。
PostgreSQLマスターノードしかない場合は、ClusterControlに追加できることに注意してください。次に、ClusterControl UIからスタンバイノードを追加して、ClusterControlがスタンバイノードを構成できるようにします。
データベースインフラストラクチャ全体のClusterControlSingleコンソールClusterControlのその他の新機能を確認するClusterControlを無料でインストールClusterControlを使用してPostgreSQLコンテナをデプロイする方法
それでは、CentOS Dockerイメージ(severalnines / centos-ssh)とClusterControl Dockerイメージ(severalnines / clustercontrol)を使用してDockerでPostgreSQLをデプロイする方法を見てみましょう。
まず、最新バージョンを使用してClusterControl Dockerコンテナをデプロイするため、severenines /clustercontrolDockerイメージをプルする必要があります。
$ docker pull severalnines/clustercontrol
次に、ClusterControlコンテナを実行し、ポート5000を公開してアクセスします。
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
これで、 http:// [Docker_Host]:5000 / clustercontrolでClusterControlUIを開くことができます。 デフォルトの管理者ユーザーとパスワードを作成します。
somenines / centos-sshには、SSHサービスが有効になっていることに加えて、自動展開機能が付属していますが、これはGaleraClusterでのみ有効です。 PostgreSQLはまだサポートされていません。そのため、docker runコマンドでAUTO_DEPLOYMENT変数を0に設定して、データベースノードを作成します。
$ docker run -d --name postgres1 -p 5551:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres2 -p 5552:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres3 -p 5553:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
これらのコマンドを実行すると、次のDocker環境が作成されます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0df916b918a9 severalnines/centos-ssh "/entrypoint.sh" 4 seconds ago Up 3 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5553->5432/tcp postgres3
4c1829371b5e severalnines/centos-ssh "/entrypoint.sh" 11 seconds ago Up 10 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5552->5432/tcp postgres2
79d4263dd7a1 severalnines/centos-ssh "/entrypoint.sh" 32 seconds ago Up 31 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5551->5432/tcp postgres1
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 38 minutes ago Up 38 minutes (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
各データベースノードのIPアドレスを知る必要があります。それを知るために、ノードごとに次のコマンドを実行できます。
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.3",
これでサーバーノードが稼働しているので、データベースクラスターをデプロイする必要があります。簡単に作成するために、ClusterControlを使用します。
ClusterControlからデプロイを実行するには、 http:// [Docker_Host]:5000 / clustercontrolでClusterControlUIを開きます。 、次に[展開]オプションを選択し、表示される指示に従います。
PostgreSQLを選択するときは、SSHでサーバーに接続するためのユーザー、キー、またはパスワードとポートを指定する必要があります。また、新しいクラスターの名前と、ClusterControlに対応するソフトウェアと構成をインストールさせる場合も必要です。
SSHアクセス情報を設定した後、データベースユーザー、バージョン、およびdatadir(オプション)を定義する必要があります。使用するリポジトリを指定することもできます。
次のステップでは、作成するクラスターにサーバーを追加する必要があります。
サーバーを追加するときに、IPまたはホスト名を入力できます。ここでは、以前に各コンテナから取得したIPアドレスを使用する必要があります。
最後のステップで、レプリケーションを同期にするか非同期にするかを選択できます。
ClusterControlアクティビティモニターから新しいクラスターの作成ステータスを監視できます。
タスクが完了すると、ClusterControlのメイン画面にクラスターが表示されます。
結論
ご覧のとおり、Dockerを使用したPostgreSQLのデプロイは最初は簡単ですが、レプリケーションを構成するにはもう少し作業が必要になります。最後に、クラスターを監視して、何が起こっているかを確認する必要があります。 ClusterControlを使用すると、Dockerを使用してPostgreSQLクラスターをインポートまたはデプロイできるだけでなく、バックアップや自動フェイルオーバー/リカバリなどの監視および管理タスクを自動化できます。試してみてください。