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

推薦する

役に立つメタ設定方法(必読)

<meta name="viewport" content="...

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

LinuxにDockerをインストールする(非常に簡単なインストール方法)

最近、かなり暇です。大学4年生として数か月間インターンをしていました。インターンとして、Docker...

MacでNodeとnpmを完全にアンインストールする方法

npmアンインストール sudo npm アンインストール npm -g この文に遭遇して npm ...

SSMは、mysqlデータベースアカウントのパスワード暗号文ログイン機能を実装します。

導入当社は、情報セキュリティと機密アプリケーションに関わるいくつかのプロジェクトの研究開発に従事して...

Linux システムに 3 つ以上の Tomcat をインストールする (詳細な手順)

複数のTomcatをインストールする場合は、システムにJDKがインストールされている必要があり、 T...

CSS フィルターを使用してマウスオーバー効果を記述する例

CSSフィルターを使用してマウスオーバー効果を記述する <div class="fi...

画像を使用してハイパーリンクのパーソナライズされた下線を実現します

画像内に下線付きのリンクが表示されても驚かないでください。実はとても簡単なので、あなたにもできるので...

MYSQL クエリの効率を向上させる 10 の SQL ステートメント最適化テクニック

MySQL データベースの実行効率はプログラムの実行速度に大きな影響を与えます。データベースの効率的...

docker run後にコンテナがExited (0)と表示される問題を解決する

Centos7 上で openresty 用の Dockerfile を作成し、ビルドしました。 d...

Deepin Linuxでカーネルを手動でアップグレードする方法

deepinとUbuntuどちらもdebianをベースにしたディストリビューションであり、ここではU...

Dockerでパラメータ変数を外部から指定する方法

この記事は主にDockerでパラメータ変数を外部から指定する方法を紹介します。この記事のサンプルコー...

Centos7.3は起動時に自動的に起動または指定されたコマンドを実行します

Centos7では、/etc/rc.d/rc.localファイルの権限が削減されており、実行権限があ...

Mac での MySql の詳細なインストールと構成

1.ダウンロードしてインストールする公式ウェブサイトからコミュニティ エディションの dmg インス...

フィルターと固定間の競合の原因と解決策の詳細な説明

問題の説明body内でfilter属性を使用すると、 fixed要素の位置が不正確になります。つまり...