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

推薦する

Echarts 基本入門: 棒グラフと折れ線グラフの一般的な構成

1eChartsの基本手順4つのステップ1 DOMコンテナを見つける2 初期化3 設定オプション4 ...

Vue 手書き読み込みアニメーション プロジェクト

ページが応答しない場合、白い画面が表示されないように、読み込みアニメーションを表示するのがユーザーフ...

Docker nginxは1つのホストを実装して複数のサイトを展開します

とあるサイトからレンタルした仮想マシンの有効期限が近づいており、更新料が200元以上かかります。Al...

MySQL REVOKE でユーザー権限を削除する

MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...

MySQLでよく使われる4つのストレージエンジンについて簡単に説明します。

よく使われる4つのMySQLエンジンの紹介(1):MyISAMストレージエンジン:トランザクションや...

Django+vue 登録とログインのサンプルコード

登録するフロントエンドは、vue の axios を使用して値を渡し、取得したアカウントとパスワード...

ES9の新機能の詳細な説明: 非同期反復

目次非同期トラバーサル非同期反復可能トラバーサル非同期反復生成非同期メソッドと非同期ジェネレーター非...

人気の宇宙飛行士ウォッチフェイスをJavaScriptで実装するための完全なコード

1. エフェクト表示JavaScript で書かれた宇宙飛行士のウォッチフェイス。 http://x...

CSS を使用して 3 つのステップでショッピング モールのカード クーポンを作成する

今日は618日、主要なショッピングモールはすべてプロモーション活動を行っています。今日は、次のように...

Centos7.5 構成 Java 環境のインストール Tomcat の説明

Tomcat は Java 言語をベースにした Web サーバー ソフトウェアです。この記事では主に...

HTML ページジャンプコード

次のコードを index.html などのデフォルトのホームページ ファイルとして保存し、ルート デ...

Innodb システムテーブルスペースのメンテナンス方法

環境説明:実行中の MySQL 環境があります。以前の構成ファイルの設定が単純すぎたため (inno...

Docker-Composeコマンドの使い方の詳しい説明

Docker コンテナはさまざまな方法で管理およびデプロイできます。 Docker コマンドを直接使...

Dockerコンテナのネットワークポート設定プロセスの詳細な説明

ネットワークポートの公開実際、Docker にはネットワーク ポートの公開に関わる 2 つのパラメー...

jQueryは何に使われるのですか?jQueryは実際にはjsフレームワークです

jQuery 入門jQuery ライブラリは、簡単なマークアップ行を使用して Web ページに追加で...