Dockerコンテナを使用してプロキシ転送とデータバックアップを実装する方法

Dockerコンテナを使用してプロキシ転送とデータバックアップを実装する方法

序文

アプリケーションを Docker コンテナとしてサーバーにデプロイする場合、通常はネットワークとストレージという 2 つの側面を考慮する必要があります。

ネットワークに関しては、一部のアプリケーションはポートを占有する必要があり、さらに外部アクセスを提供する必要があるアプリケーションもあります。

セキュリティ上の理由から、ファイアウォール ポートを直接開くよりも、プロキシ転送の方が適切です。

ストレージに関しては、コンテナはデータの永続化には適していないため、ボリュームをマウントしてサーバーのディスクにデータを保存するのが一般的です。

ただし、サーバーは絶対的なセキュリティを保証することはできないため、データをクラウドにバックアップする必要もあります。

プロキシ転送

デフォルトでは、コンテナ間のネットワークは互いに分離されていますが、一部の関連アプリケーション(Web フロントエンド コンテナ、サーバー コンテナ、データベース コンテナ)では、コンテナ同士が通信可能でありながら外部から分離されるように、独立したブリッジ サブネット(以下、サブネット)に分割されるのが一般的です。

サブネット外部へのアクセスを提供する必要のあるコンテナーの場合は、ポートをサーバー ホストにマップできます。全体の構造は次のようになります。


上記のポート マッピングは、サーバー (ホスト) がコンテナー ネットワーク サービスにアクセスする問題のみを解決します。ローカル マシンからインターネット経由でサーバー上のコンテナーにアクセスする場合、セキュリティ上の考慮事項に加えて、サーバーはデフォルトでファイアウォールを有効にし、22 などのいくつかのポートのみを開くため、通常は不可能です。

従来のネットワーク プロセスの場合、実装方法は、Nginx を使用して次のプロキシを構成するなど、リバース プロキシ サーバーを介してネットワーク要求を転送することです。

# 異なるパスへの転送 server {
 聞く 80;               
 サーバー名 www.xx.com;            

 場所 /a {
  プロキシパス ローカルホスト:1234;
 }
 場所 /b {
  プロキシパス ローカルホスト:2234;
 }
}
# 異なるドメイン名の転送サーバー {
 聞く 80;               
 サーバー名 www.yy.com;            

 位置 / {
  プロキシパス ローカルホスト:1234;
 }
}

この時点で問題は解決されたように見えますが、Nginx もコンテナー内で実行されている場合はどうなるでしょうか?

先ほど、サブネットは外部コンテナから分離されているため、Nginx コンテナはこれらの外部サービスにアクセスできないと述べました。

Nginx コンテナを対応するサブネットに分割することは簡単に思いつくかもしれません。コンテナは複数のサブネットの構成をサポートしていますが、この操作方法の問題は、新しいサブネットが追加されるたびに、Nginx コンテナのネットワーク構成を変更し、コンテナを再起動する必要があることです。

したがって、より良い方法は、Nginx を HOST ネットワーク モードに設定することです。 Nginx コンテナとサーバー間の分離を放棄し、ネットワークとポートをサーバーと直接共有します。その後、Nginx コンテナはマップされたポートを持つすべてのコンテナに直接アクセスできるようになります。

次の図に示すように:


データのバックアップ

アプリケーションシナリオ

速度とセキュリティを考慮して、企業では通常、イントラネット経由でのみアクセスできるサーバーがいくつか存在します。ただし、サーバー自体も含め、これらのサーバー上のデータはいつでも変更されたり、障害が発生したりする可能性があります。

したがって、データのバックアップは特に重要です。ここでは、小規模なデータのバックアップについて説明します。

私が最近チーム用に構築したナレッジ ベース サーバーを例に挙げてみましょう。

この Web アプリケーションは、コンテナの形式でイントラネット サーバーに展開される小さな Python サービスです。オンライン編集をサポートし、データを md ファイル形式で保存します。

コンテナに障害が発生すると、内部データにアクセスできなくなります。したがって、コンテナ内にデータを直接配置することは絶対に安全ではありません。コンテナとサーバーがデータの読み取りと書き込みを共有できるようにする唯一の方法は、ファイルをマウントすることです。

では、データをどのようにバックアップすればよいのでしょうか?ここでは、保存先として GitHub のプライベート リポジトリを選択します。理由は3つあります。

  • 安全性。データは簡単に紛失したり盗まれたりすることはありません。
  • 便利です。バックアップには git コマンドを使用するだけです。
  • 速い。バックアップされたデータの容量や量が大きくないためです。

方法は決定されましたが、解決すべき問題がまだ 2 つ残っています。

  • GitHub リポジトリにアクセスするには、権限認証が必要です。
  • GitHub にデータをスケジュールまたは自動的に送信する方法。

実装

まず、コンテナの単一責任の原則に従って、バックアップ タスクを実行するための新しいコンテナを作成する必要があります。

ここでは、docker-compose またはその他のオーケストレーション ツールを使用して複数のコンテナを作成できます。

次に権限認証を行います。ローカルマシンに SSH キーを作成し、それを GitHub 設定に追加して、コンテナーが対応するウェアハウスにファイルをプッシュできるようにします。

ただし、現在コードをプッシュできるのはコンテナではなくサーバーのみなので、.ssh ファイルもコンテナにコピーする必要があります。

最後に、自動バックアップの実装です。より良い方法は、ファイルが変更されるたびにコードを送信してプッシュすることですが、現在、コンテナ内のファイルを監視する簡単な方法はありません。そのため、次善の策は、スケジュールされたタスク戦略を使用することです。つまり、対応する git コマンドを 5 分ごとに実行して、ファイルをウェアハウスに送信してプッシュします。

ここでは、busybox イメージ パッケージに基づく軽量コンテナーを使用し、プロジェクト コードをコンテナーにマウントしてファイルの同期更新を確実に行い、cron サービスを開始して操作を実装できます。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Dockerコンテナデータをコピーしてバックアップする方法の詳細な説明
  • docker での psql データベースのバックアップとリカバリの詳細な説明
  • Dockerはmysqldumpコマンドを使用してプロジェクト内のmysqlデータをバックアップおよびエクスポートします。
  • docker 環境でのデータベース バックアップ (postgresql、mysql) のサンプル コード
  • Linux システムをバックアップする docker コマンドの詳細な説明
  • Docker におけるコンテナのバックアップ、リカバリ、移行の詳細な説明
  • Dockerデータのバックアップとリカバリプロセスの詳細な説明

<<:  Node.js の TCP 接続処理のコア プロセス

>>:  MySQL 5.7 でデータベースのデータ保存場所を変更する方法

推薦する

JavaScriptの再帰の詳細

目次1. 再帰とは何ですか? 2. 再帰を使って数学の問題を解く1. 1 * 2 * 3 * 4 …...

VMware Workstation のインストール Linux システム

始める段階から初心者になるまで、Linux オペレーティング システムは不可欠です。最初のステップは...

Dockerを使用してサーバー上で複数のPHPバージョンを実行する

PHP7 がリリースされてからかなり時間が経ちますが、パフォーマンスが大幅に向上したことはよく知られ...

Vue 円形パーセンテージ プログレスバー コンポーネントの機能の実装

必要な方はどなたでも参考にしてください。試してみて問題が見つかった場合は、メッセージを残してお知らせ...

高並列処理 nginx サーバー向け Linux カーネル最適化構成の説明

デフォルトの Linux カーネル パラメータは最も一般的なシナリオに基づいており、高い同時アクセス...

セマンティック XHTML タグの紹介

まず最初に指摘しておきたいのは、人間は視覚的な区分を通じてコン​​テンツの意味を判断できるが、検索エ...

Docker-compose を使用して ELK をデプロイするためのサンプル コード

環境ホストIP 192.168.0.9 Docker バージョン 19.03.2 docker-co...

MySQL マスタースレーブレプリケーションの役割と動作原理の詳細な説明

1. マスタースレーブレプリケーションとは何ですか?マスタースレーブレプリケーションは、スレーブデー...

CSS スキル コレクション - 古典の中の古典

リンク上の点線のボックスを削除しますコードをコピーコードは次のとおりです。 a:アクティブ、a:フォ...

この記事では、イベント委任を使用してJavaScriptメッセージボード機能を実装する方法について説明します。

イベント委任を使用してメッセージ ボード機能を実装します。 <!DOCTYPE html>...

MySQL クロスデータベーストランザクション XA 操作の例

この記事では、例を使用して、MySQL のデータベース間トランザクション XA 操作について説明しま...

Zabbix ベースの Jenkins プロセス監視の詳細な説明

1. 監視アーキテクチャ図 2. 実装のアイデアJenkins に Metrics プラグインをイン...

超詳細なMySQL使用仕様の共有

最近、データベース関連の操作が多くなり、会社の既存の仕様はあまり包括的ではありません。インターネット...

Docker で Python スクリプトを実行する方法

まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...

HTML チェックボックスとラジオボタンスタイルの美化の簡単な例

HTML チェックボックスとラジオボタンスタイルの美化の簡単な例チェックボックス: XML/HTML...