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

推薦する

CentOS 6.5 の設定 ssh キーフリーログインで pssh コマンドを実行する方法の説明

1. psshを確認してインストールします。yum list pssh 2. キーレスログインが設定...

kindとDockerを使用してローカルKubernetes環境を起動する

導入Kubernetes を使い始めるのに丸一日を費やしたことはありませんか?最近登場したいくつかの...

VSCode 開発 UNI-APP 構成チュートリアルとプラグイン

目次前面に書かれた予防開発環境構築開発構成に関する注意事項前面に書かれたuni-app は、Vue....

HTMLノードの追加と削除の簡単な例

HTML ノードの追加と削除の簡単な例 HTML ノードの追加と削除の簡単な例<input t...

ランキングを取得するためのMySQLソートの例コード

コードは次のようになります。 SELECT @i:=@i+1 行番号、 if(@total=t.s_...

MySQLでNULL値を判定する際の落とし穴事例

目次序文Mysql の case when 構文:事例実践:要約:序文今日、プログラムを開発している...

IdeaでTomcatを起動したときに複数のリスナーが報告される問題を解決する

エラーのスクリーンショット例外が発生した場所が見つかりません。解決策: リソースディレクトリにlog...

Vue スキャフォールディング学習プロジェクト作成方法

1. 足場とは何ですか? 1. Vue CLI Vue CLI は、Vue.js をベースにした迅速...

Linux での MySQL 8.0.11 のインストールに関するチュートリアル

1. 公式サイトにアクセスしてインストールパッケージをダウンロードしますダウンロードリンク: クリッ...

MySQL 8.0.13 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

MySQL 8.0.13 のインストールと設定方法を皆さんと共有したいと思います。お役に立てれば幸...

Linux 3.X/4.x/5.x でパゴダ パネルのパスワードを忘れた場合の解決方法

ssh に入り、次のコマンドを入力してパスワードをリセットします (コマンドの末尾の「testpas...

CSS疑似クラス名を数字で始めないでください

初心者が div+css を開発する場合、.ggg、#ccc などの形式の CSS 疑似クラス名を付...

MySQLの基本操作学習ノートテーブル

テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...

JS を使用して Web ページのウォーターフォール レイアウトを実装する方法

目次序文:ウォーターフォールレイアウトとは何ですか?達成方法: 1. 画像を取得する2. 画像の帯域...

Linux サーバー上の hosts ファイル構成の詳細な説明

Linux サーバーのホスト ファイルの構成hosts ファイルは、Linux システム内の IP ...