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 複数テーブル接続削除関数の削除

推薦する

CSSでスペースを処理する方法

1. 宇宙のルールHTML コード内の空白は通常、ブラウザによって無視されます。 <p>...

操作タイムアウトがないときにMySQLサーバーがアクティブに切断される問題を解決します

MySQL サービスを使用する場合、通常の状況では、MySQL のタイムアウト設定は 8 時間 (2...

React のクラスからフックへの移行

目次リアクトフック序文なぜフックなのか?クラス関数クラスとフックの比較フックはコンポーネントの状態を...

フロントエンドが習得すべき、複数列の等高レイアウトを実現するための CSS テクニック

1. はじめにページを作成しているときに、複数列のレイアウトに遭遇することがあります。各列の内容が異...

Spring Boot Docker パッケージング ツールの概要

目次スプリングブートDocker spring-boot-maven-プラグインSpotify Ma...

nginx を https をサポートするように設定するためのサンプル コード

1. はじめにあなたのウェブサイトはまだインターネット上に公開されたままですか?ここでは、HTTPS...

MySQL 5.0.96 for Windows x86 32 ビット グリーン簡易版インストール チュートリアル

MySQL 5.0 は、いくつかの「高度な機能」があるため定番となっています。これは、Windows...

HTML CSS3は画像表示効果を引き伸ばさない

1. transform 属性を使用して、画像を拡大せずに表示します (パスの問題は必要に応じて修正...

負の距離(共感) - 相互影響の反復プロセス

ネガティブな距離は共感を意味します。序文(疑問の提起):プロダクトマネージャーは機能を把握します。機...

TypeScriptにおけるunknownとanyの違いについて詳しく説明します

目次序文1. 不明 vs 任意2. 未知とあらゆるもののメンタルモデル3. まとめ要約する序文any...

MySQL空間関数を使用してロケーションパンチインを実装するための完全な手順

序文プロジェクトの要件は、ユーザーの現在の位置が特定の地理的位置範囲内にあるかどうかを判断することで...

Xtrabackup を使用して MySQL をバックアップおよび復元する方法

目次1. バックアップ1.1 万全の準備1.2 追加の準備2 バックアップとリカバリ2.1 データの...

jsプロキシの原理の詳細な説明

目次プロキシモードとは何ですか?実例を紹介例を使ってプロキシモデルの定義を理解するプロキシとはget...

マークアップ言語 - テキストの CSS スタイルを指定する

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...