Dockerは、開発者がアプリケーションを簡単に開発およびデプロイできるようにする非常に便利なプラットフォームです。この記事では、Dockerコンテナを使用して単一のサーバーで複数のWebサイトをホストする方法について説明します。 Dockerコンテナーを使用することの最も重要な利点の1つは、軽量で、高速で、管理が簡単なことです。
今月は、カスタムビルドの2つのアプリケーションを2つの別々のサーバーから1つのサーバーに移動し、それぞれが独自のDockerコンテナーに入れました。両方のアプリケーションの管理が簡単になり、制作コストも削減されます。
各アプリケーションは、独自の安全な環境内にセットアップされ、ドメイン名を介してアクセスできます。手順に進む前に、それがどのように機能するか、すべてをセットアップするために必要なツールについて簡単に説明しましょう。それでは始めましょう。
何を設定しますか?
Dockerコンテナーを使用して、複数のアプリケーションまたはWebサイトにサービスを提供できる単一のサーバーをセットアップしたいと考えています。ユーザーがホストされているWebサイトの1つのURLを要求すると、メインサーバーはその要求をコンテナーにプロキシし、コンテナーがコンテンツを提供する必要があります。
これを実現するには、サーバーをセットアップする必要があります。この記事では、静的IPアドレスを使用してサーバーをセットアップしました。優れたクラウドホスティングサービスをお探しの場合は、MassiveGRID、DigitalOcean、またはVultrをご覧ください。
次に、ユーザーリクエストを適切なコンテナにルーティングするためのプロキシを作成します。この目的で利用できるツールはたくさんありますが、セットアップが非常に簡単で、必要な機能のほとんどすべてを備えているため、nginx-proxyを使用します。最後に、CloudflareをDNSマネージャーとして使用して、ドメイン名がホストサーバー(IPアドレス)を指すようにします。
また、Dockerコンテナを管理するための使いやすいグラフィカルインターフェイスであるPortainerを使用することをお勧めします。 Portainerの設定については、このガイドに従ってください。サーバーが稼働したら、サーバーにSSH接続して更新します。
ssh [email protected]
ログインするためのsshキーを設定している場合は、sshコマンドの-i option in the ssh command to log in
秘密のsshキーを使用します。
ssh -i path-to-ssh-key [email protected]
ホストマシンでは、Ubuntu20.04を実行しています。手順は、Debianを使用している場合でも、別のDebianベースのディストリビューションを使用している場合でも同じです。他のディストリビューションの場合、dockerを構成するための唯一の手順は異なり、他のすべては同じままです。このガイドに従って、UbuntuにDockerをインストールしてください。
nginx-proxyでSSL証明書を使用する
2番目のステップは、各ドメインのSSL証明書とキーを格納するディレクトリを作成することです。ホストサーバーで、/etc/ディレクトリにディレクトリを作成します。このディレクトリには好きな名前を付けることができます。この記事では、cloudflareと名付けています。
mkdir /etc/cloudflare
後で、このディレクトリをnginx-proxyでバインドして、各ドメイン名のSSL証明書とキーにアクセスします。
また、nginx-proxyを含むすべてのDockerコンテナが接続する仮想ネットワークを作成します。
docker network create nginx-proxy
必要に応じて、このような状況に対処するためのプロキシを作成できます。ありがたいことに、nginx開発者は、すべてのコンテナーを追跡し、新しいコンテナーが作成されるとすぐに更新されるDockerイメージ全体を構築しました。 (sslを念頭に置いて)nginx-proxy dockerを作成するには、次のコマンドを実行してください–
docker run -d –name nginx-proxy -p 80:80 -p 443:443 –net nginx-proxy -v /etc/cloudflare:/etc/nginx/certs -v /var/run/docker.sock:/tmp/docker.sock:ro nginxproxy/nginx-proxy
上記のコマンドを段階的に分解してみましょう。
- 実行 –このオプションはコンテナを作成します。
- -d –デバッグモードを有効にします。何か問題が発生した場合は、問題を突き止めるのに役立つ情報が出力されます。
- –名前 –コンテナの名前。
- -p 80:80 –それは非常に重要です。 -pパラメーターは、ホストポートをコンテナーポートにバインドします。 80:80の左側にはホストポートがあり、その逆も同様です。
- –net –新しく作成されたコンテナをnginx-proxyネットワークに接続します。
- -v / etc / cloudflare:/ etc / nginx / certs –WebサイトでSSLを使用する場合に必要です。ホストディレクトリを、SSL証明書とキーを格納するnginx-proxyコンテナのディレクトリにバインドします。
- -v /var/run/docker.sock:/tmp/docker.sock:ro –Dockerデーモンと通信するためにコンテナにDockerソケットを接続します。
- nginxproxy / nginx-proxy –hub.docker.comでホストされているnginx-proxydockerイメージのアドレス。
nginx-proxyコンテナを作成したら、ゲームの最大のパズルを解きました。とてもシンプルでした。右?それはすべてnginx-proxyイメージのおかげです。そうしないと、すべてを手動で行う必要があります。
VIRTUAL_HOST環境変数を使用してコンテナーを作成します
環境変数VIRTUALHOSTは、nginx-proxyによって使用され、どのドメインがどのサーバーを指すかを決定します。新しいコンテナを作成するたびに、VIRTUALHOST変数の値をこのコンテナを指すドメイン名に設定します。
docker run -it -d --name gaminggroup.online -h gaminggroup.online --expose 80 --net nginx-proxy -e VIRTUAL_HOST=gaminggroup.online -e VIRTUAL_HOST=www.gaminggroup.online httpd
上記のコマンドを段階的に説明してみましょう。
- -h –完全修飾ドメイン名を設定します(ドメイン名を設定します)
- –公開 –ポート80を公開して、HTTPトラフィックを許可します
- –net –新しく作成したコンテナをnginx-proxyネットワークに接続します
- VIRTUAL_HOST =domain.xyz – VIRTUAL_HOST変数は、ユーザーのリクエストをそれぞれのコンテナにリダイレクトするためにnginx-proxyによって使用されます
- httpd –DockerハブからApacheサーバーイメージをプルします
上記のコマンドは、人気のあるWebサーバーApacheでコンテナーを起動します。ホストサーバーに到達したリクエストはすべてnginxプロキシにリダイレクトされ、nginxプロキシはそれをこのコンテナのポート80に転送します。 。
最後に、ホストサーバーを指すようにドメイン名を構成します。 「@」という名前でAレコードを作成し、ホストサーバーのIPアドレスとしてIPv4を使用します。終了したらしばらく待ちます。 DNSの伝播には、数分から数時間かかる場合があります。
DNS伝播が完了すると、ドメイン名はApacheWebサーバーをホストする新しく作成されたコンテナーを指します。これですべてがセットアップされました。 VIRTUAL_HOST変数を使用してコンテナーを作成し続けるだけで、nginx-proxyがトラフィックをコンテナーに適切にリダイレクトします。
Docker内でのSSL/HTTPSの使用
私たちのほとんどは、安全でないHTTPではなくHTTPSを介してコンテンツを提供することを好むため、nginx-proxyはそれを簡単に処理できます。ディレクトリ/etc/cloudflare
で-vパラメータをすでに渡しました nginx-proxyを設定するとき 容器。このディレクトリはnginx-proxyに関連付けられています ディレクトリ/etc/nginx/certs
。
各SSL証明書とキーは/etc/cloudflare
に保存する必要があります 固有名で。 SSL証明書とキーは、使用するドメイン名に応じて名前を変更する必要があります。たとえば、ドメイン名の場合、example.com
、SSL証明書の名前をexample.com.crt
に変更する必要があります キーはexample.com.key
である必要があります 。
nginx-proxyを使用すると、プロセスが大幅に簡素化されます。他のすべてを処理するコンテナをデプロイするだけです。これが完了すると、構成ファイルの数が多すぎることを心配することなく、必要な数のコンテナーをデプロイできます。コンテナは軽量ですが、トラフィック/ワークロードが増加するにつれて、より多くのリソースが必要になります。
上記の手順を実行する際に問題が発生した場合は、以下のコマンドセクションでお知らせいただくか、Discordサーバーに参加して迅速なサポートを受けてください。