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 でデータベースのデータ保存場所を変更する方法

推薦する

Nodejs エラー処理プロセス記録

この記事では、接続エラー ECONNREFUSED を例に、Node.js がエラーを処理するプロセ...

MySQL でデータをクエリし、条件に基づいて別のテーブルに更新する方法の例

この記事では、MySQL が条件に基づいてデータをクエリし、別のテーブルに更新する方法を例を使用して...

Vue.jsフレームワークはショッピングカート機能を実装します

この記事では、ショッピングカートを実装するためのVue.jsフレームワークの具体的なコードを参考まで...

MySQL の自動インクリメント主キーが連続していないのはなぜですか?

目次1. はじめに2. 自己増分ストレージの説明3つの自己付加価値修正メカニズム4. 自己評価を修正...

Vue3 + TypeScript 開発の概要

目次Vue3 + TypeScript 学習1. 環境設定1.1 最新のVue scaffoldin...

この記事では、MySQLのマスタースレーブ同期の原理を説明します。

目次MySQL マスタースレーブ同期原理の簡単な分析1. マスタースレーブとは何ですか? 2. 主従...

Jenkins の紹介と Docker で Jenkins をデプロイする方法

1. 関連概念1.1 Jenkins の概念: Jenkins は、使用されるプラットフォームに関係...

JavaScript es6 の新しい配列メソッドの詳細な説明

目次1. 各() 2. arr.filter() 3. arr.every() 4. arr.map...

HTMLからPDFへの変換のための純粋なクライアント側と純粋なサーバー側の実装ソリューション

必要ユーザーがフォームに入力して「保存」をクリックすると、PDF ドキュメントを直接ダウンロードでき...

Ubuntu 18.0.4 は mysql をインストールし、エラー 1698 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されましたを解決します

序文最近 Linux を学び、その後 Win から Ubuntu に変更しました。以前インストールし...

UbuntuのVimにNERDTreeプラグインをインストールする詳細な手順

NERDTree は Vim 用のファイル システム ブラウザーです。このプラグインを使用すると、ユ...

Docker を使用して ELK ログ システムを構築する例

以下のインストールではすべて、インストール ルート ディレクトリとして ~/ ディレクトリが使用され...

Vue+video.jsはビデオプレイリストを実装します

この記事では、ビデオプレイリストを実装するためのvue + video.jsの具体的なコードを参考ま...

ウェブデザインにおける画像フォーマットとデザインの関係を詳しく説明

なぜこの領域のコンテンツを整理したいのでしょうか。それは、油絵の具とキャンバスを理解する必要があり、...

CSS3のbox-shadowプロパティの使い方の詳細な例

CSS には多くの属性があります。特に複数の値を設定する必要がある属性は、長期間使用しないと忘れられ...