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

推薦する

Baidu百科事典UIの開発動向について議論する

<br />百度百科事典の正式版がついにオンラインになりました。2年間の「テスト版」の帽...

Vueシャトルボックスは上下の動きを実現します

この記事の例では、vueシャトルボックスを上下に動かすための具体的なコードを参考までに共有しています...

Vue 関数のアンチシェイクとスロットリングの正しい使用方法

序文1. デバウンス: 高頻度イベントがトリガーされた後、関数は n 秒以内に 1 回だけ実行されま...

Ubuntu仮想マシンでシリアル通信にcutecomを使用する方法

Ubuntu仮想マシンでのシリアル通信にcutecomを使用する1. cutecomをインストールす...

クリックナンバーゲームを実装するネイティブJS

参考までに、クリックナンバーゲームをネイティブJSで実装しました。具体的な内容は以下のとおりです。最...

3つの簡単な調整でMySQLを最適化する

私は熟練した DBA になるつもりはありませんが、MySQL を最適化するときは、いくつかの構成を調...

MySQL の frm ファイルからテーブル構造を復元する 3 つの方法 [推奨]

mysql が正常に実行されている場合、テーブル構造を表示することは難しくありません。しかし、場合...

js を使用して 2 つの HTML ウィンドウ間で通信する方法

シナリオ: ページAがページBを開くと、ページBで操作した後、ページAは変更されたデータを同期する必...

ARM64アーキテクチャでmysql5.7.22をインストールするプロセス全体

MySQLダウンロードアドレス: https://obs.cn-north-4.myhuaweicl...

トップに戻るボタンを実装するJavaScript

この記事では、トップに戻るボタンを実装するためのJavaScriptの具体的なコードを参考までに紹介...

MySQLの空の値とnull値の違いを知っていますか?

序文最近、友人がSQLを書くときにnull値を判定する方法が間違っていて、プログラム内のデータにエラ...

MySQL シリーズ 6 のユーザーと認証

目次チュートリアルシリーズ1. ユーザー管理1. ユーザーアカウント2. アカウントの追加と削除3....

Linuxコマンドunzipの詳しい説明

目次1. 解凍コマンド1.1 構文1.2 オプション2. 例1. 解凍コマンドunzip コマンドは...

ドラッグアンドドロップによる並べ替えの詳細を実現する js

目次1. はじめに2. 実装3. HTML ドラッグ アンド ドロップ API を使用しないのはなぜ...

SpringBoot を MySQL に接続してデータを取得し、バックエンド インターフェースに書き込む方法

目次1. 新しいプロジェクトを作成する2. 依存関係を追加する3. SpringコンテナにDrive...