Nginxを使ってサーバー内で複数コンテナの共存を実現する方法

Nginxを使ってサーバー内で複数コンテナの共存を実現する方法

背景

Tencent Linux クラウド ホストがあり、その上に Docker (ServiceDocker、sign という名前、以下同じ) がデプロイされています。ServiceDocker は内部でポート 80、443、3306 を使用し、これらはそれぞれホスト (クラウド ホスト) の同じポート (つまり、80、443、3306) にマッピングされています。

ServiceDocker に XAMPP をインストールし、これをベースに QR コードスキャン サインイン アプレットのサーバーを展開します。 ServiceDocker のポート 80 と 443 はそれぞれ http と https サービスを提供しており、ポート 3306 は MySQL データベースのポートです。

ServiceDocker はドメイン名 sign.famend.cn にバインドされています。

ターゲット

クラウド ホスト内の ServiceDocker はポート 80 と 443 を占有します。外部サービスを提供するためにホスト内に別のサーバーを展開する場合、ポート 80 と 443 は使用できません。

私たちの目標は、ホストに複数の ServiceDocker をデプロイすることです。各 ServiceDocker は独自のドメイン名にバインドされ、外部にサービスを提供して、ポート 80 と 443 が利用可能であることを保証します。

アイデア

ServiceDocker のポート マッピングを変更し、ServiceDocker ポート 80 と 443 をそれぞれホストのポート 89 と 449 にマッピングします。これにより、ホストのポート 80 と 443 が解放されます。

解放されたポート 80 と 443 は Nginx によって使用されます。 Nginx を使用して Docker をインストールします (NginxDocker、mynginx という名前、以下同じ)。 NginxDocker は内部的にポート 80 と 443 を使用し、これらはそれぞれホストのポート 80 と 443 にマッピングされます。

NginxDocker はリバース プロキシとして使用されます。アクセス要求がある場合、Nginx 構成を読み取った後、異なる URL が対応する Docker に送信されます。たとえば、http://sign.famend.cn:80 にアクセスすると、自動的に http://sign.famend.cn:89 にマッピングされます。

実装手順

1. ServiceDocker のポート マッピングを変更し、ポート 80 と 443 を解放します。

Docker ではポートを変更するコマンドは提供されていません。インターネットで 2 つの方法を見つけました。

方法 1: 最初にコンテナを停止し、コンテナをイメージにパッケージ化してから、新しいイメージを実行します。新しいイメージを実行するときに新しいポートを指定します。使用されるコマンドは次のとおりです。

#まずコンテナを停止します docker stop containerA 
#コンテナをミラーにコミットする docker commit containerA newImageB 
#コンテナを実行します docker run -p 8080:8080 -p 8081:8081 -v /home/data/:/home/data/ -dt newImageB

方法 2: 最初にコンテナを停止し、次にコンテナ サービスを停止し、コンテナ構成ファイルを変更し、最後にコンテナ サービスを開始してコンテナを起動します。手順は次のとおりです。

①ServiceDocker(ServiceDockerの名前はsignです)を停止し、Dockerサービスを停止します。

sudo docker 停止標識 
sudo サービス docker 停止

②docker ps -aコマンドを使用して、変更するコンテナのCONTAINER IDを見つけます。

③docker inspect [コンテナID] | grep Idコマンドを実行します。

④cd /var/lib/docker/containersコマンドを実行して同じIDのディレクトリに入り、探します。

cd コマンド実行時に permission denied と表示された場合は、まず sudo -s を実行してください。

ID に対応するディレクトリに入ったら、hostconfig.json ファイルを開きます。

ポート 80 のマッピングを次のように見つけます。

"80/tcp": [ 
{ 
"ホストIP": "0.0.0.0", 
"ホストポート": "80" 
}] 
 
次のように「HostPort」:「80」を「HostPort」:「89」に変更します:「80/tcp」:[ 
{ 
"ホストIP": "0.0.0.0", 
"ホストポート": "89" 
}]

変更前は、ServiceDocker 内のポート 80 はホストのポート 80 にマップされていましたが、変更後は、ServiceDocker 内のポート 80 はホストのポート 89 にマップされます。

簡単に説明すると、いくつかの記事 (参考文献の 2 と 3) では config.v2.json を変更する必要があると記載されていましたが、個人的にテストした結果、変更は必要ないことがわかりました。このファイルは、ServiceDocker を起動すると自動的に変更されます。

⑤dockerサービスを起動し、ServiceDocker(signという名前)を起動します。

sudo サービス docker 開始 
sudo docker 開始サイン

方法(1)と方法(2)のどちらも可能ですが、私は方法(2)を選択しました。

方法(2)を実行した後、ブラウザを開いて確認すると、「Webサイトにアクセスできません」というメッセージが表示されます。

予備的に、docker 内のサーバーが起動していないと推定されます。次のコマンドを実行します。

sudo /opt/lampp/lampp停止 
sudo /opt/lampp/lampp を起動します

stop を実行すると、Apache が起動しないことがわかりました。これは、ポート 80 が変更されたためである可能性があります。

スタートを実行した後、ブラウザを開いて http://sign.famend.cn:89 と https://sign.famend.cn:449 を確認すると、アクセスが成功します。

Docker ポートを変更する方法は複雑ではありません。Docker の将来のバージョンで対応するコマンドが提供されると、さらに便利になると思います。

ちなみに、ServiceDocker でスケジュールされたタスクが開始されているかどうかを確認するには、crontab -l を実行します。開始されていない場合は、service cron start を実行してスケジュールされたタスクを開始します。

次に、http://sign.famend.cn:80 と https://sign.famend.cn:443 にも正常にアクセスできるように、NginxDocker リバース プロキシを設定します。

2. NginxDocker リバース プロキシを設定します。

①nginxをダウンロードして実行します。

dockerコンテナの実行\ 
 -d \ 
 -p 80:80 \ 
 -p 443:443 \ 
 --rm \ 
 --name mynginx \ 
 nginx

②nginxの設定ファイルを設定します。

mkdir nginx ファイル 
docker コンテナ cp mynginx:/etc/nginx 。 
mv nginx conf 
vi conf/nginx.conf

nginx.conf に次のリバース プロキシ情報を追加します。

サーバ{ 
 443 ssl を聴く; 
 サーバー名 sign.famend.cn; 
 ssl_certificate /etc/nginx/ssl/sign.famend.cn/1_sign.famend.cn_bundle.crt; 
 ssl_certificate_key /etc/nginx/ssl/sign.famend.cn/2_sign.famend.cn.key; 
 
 位置 / { 
  proxy_set_header HOST $host; 
  proxy_set_header X-Real-IP $remote_addr; 
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  proxy_set_header X-Forwarded-Proto $scheme; 
  proxy_pass http://sign.famend.cn:89/; 
 } 
} 
 
サーバ{ 
 聞く 80; 
 サーバー名 famend.cn sign.famend.cn; 
 位置 / { 
  proxy_set_header HOST $host; 
  proxy_set_header X-Real-IP $remote_addr:89; 
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  proxy_set_header X-Forwarded-Proto $scheme; 
  proxy_pass http://sign.famend.cn:89/; 
 } 
}

ポート 443 の場合は、ssl_certificate と ssl_certificate_key を使用する必要があります。 ServiceDocker で使用される LetsEncrypt SSL 証明書は 90 日ごとに更新されます。

SSL 証明書のソース: LetsEncrypt からの SSL 証明書を共有する方法。さらに、Tencent は登録されたドメイン名に対して 1 年間有効な無料の SSL 証明書を提供します。

簡単にするために、Tencent の SSL 証明書を直接使用しました。もちろん、証明書は 1 年以内に期限が切れる前に更新する必要があります。

③mynginxを停止し、再起動します。

dockerコンテナの実行\ 
 --name mynginx \ 
 --volume "$PWD/conf":/etc/nginx \ 
 -p 80:80 \ 
 -p 443:443 \ 
 -d \ 
 nginx

今回は、コンテナを停止したときにコンテナが保存されるように、--rm オプションを省略します。

これで設定は完了です。

確認する

ブラウザで開く

sign.famend.cn:80 
sign.famend.cn:89 
sign.famend.cn:449 
sign.famend.cn:443

正常にアクセスできます。もちろん、449 と 443 を開くと、2 つの URL で使用されている証明書が異なることがわかります。 449 は LetsEncrypt によって提供され、90 日間有効です。443 は Tencent (TrustAsia によって発行) から提供され、1 年間有効です。

もちろん、ServiceDocker の別の Web サイト famend.cn にもアクセスできます。

フェイメンド:80
フェイメンド.cn:89

要約する

上記は、編集者が紹介した、Nginx を使用してサーバー内で複数のコンテナの共存を実現する方法です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • nginx を使用してビデオオンデマンドおよびライブストリーミングサーバーを構築する方法
  • Nginx 静的ファイル サーバーの設定方法を学ぶ
  • nginx でシンプルなファイルダウンロードサーバーを構築する方法
  • Dockerコンテナでnginxを実行する
  • Dockerコンテナ構成 Nginxインスタンス共有

<<:  Vue で video.js を使用して m3u8 形式のビデオを再生する方法

>>:  mysql 複数テーブル接続削除関数の削除

推薦する

MySql の null 関数の使用の共有

MySql の null に関する関数IFNULL ISNULL NULLIF IFNULL使用法:...

Apache の一般的な仮想ホスト設定方法の分析

1. Apacheサーバーのインストールと設定yum インストール httpd -y systemc...

1 つの記事で Vue ミドルウェア パイプラインを学ぶ

SPA を構築する場合、多くの場合、特定のルートを保護する必要があります。たとえば、認証されたユーザ...

CSS 前景と背景の自動カラーマッチング技術の紹介 (デモ)

1. カラーマッチング効果のプレビュー下の GIF に示すように、ボタンの背景色が徐々に薄くなると...

MySQL マルチテーブル結合クエリの詳細な説明

目次複数テーブル結合クエリ内部結合左結合右結合サブクエリ要約する複数テーブル結合クエリテーブル間の接...

MySQL の DDL と DML についての簡単な説明

目次序文1. DDL 1.1 データベース操作1.2 データテーブルの操作1.3 一般的なデータ型1...

MySQL の完全バックアップ中に特定のライブラリを除外する方法

MySQLの完全バックアップを実行するときは、--all-databaseパラメータを使用します。例...

JavaScript はスローモーションアニメーションのカプセル化と使用法を説明します

プロセス分析の実装(1)繰り返して電話をかけるには?答え: 関数をカプセル化して一度だけ呼び出すコー...

CSS (カスケーディング スタイル シート) の一般的な用語の概要

CSS を使用する場合は、DOCTYPE (ドキュメント タイプ定義) を記述することを忘れないでく...

フォーム内のどの隠し属性をフォームとともに送信できるか

フォーム内の visibility=hidden および display=none のフォーム要素は...

ウェブサイトのコンテンツの100~1%はナビゲーションである

ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...

HTML マルチメディア アプリケーション: Web ページにフラッシュ アニメーションと音楽を挿入する

1. HTML_falshアニメーションでのマルチメディアの応用(WebページへのFlashアニメー...

vue.js 動的コンポーネントの詳細な説明

:動的コンポーネントv-bind:is="component name" を使用...

MySQL で固定されていない位置から文字列要素を抽出する方法

序文注: テストデータベースのバージョンはMySQL 8.0ですテストデータ: テーブルzqs(id...

VMware Workstationはデバイス/資格情報ガードと互換性がありません

仮想マシンをインストールするときに、「VMware ワークステーションはデバイス/資格情報ガードと互...