ドメインにアクセスしてからDockerを利用するまでの流れを、具体的なシナリオを元に詳しく説明します。このシナリオでは、以下の環境を仮定します:
- ドメイン名:
example.com
- ホストサーバーでDockerを使用してWebアプリケーション(例: Nginx + Flaskアプリケーション)を動かす。
1. ドメインアクセスの概要
(1) ドメイン名からIPアドレスの解決(DNSルックアップ)
- ユーザーがブラウザで
http://example.com
にアクセス。 - ブラウザは、指定されたドメイン名(
example.com
)をDNSサーバーに問い合わせ、対応するIPアドレスを取得。- 例:
example.com
->192.168.1.10
- 例:
- DNS解決後、ブラウザはそのIPアドレスにHTTPリクエストを送信。
1-(1)-1 ドメイン名をIPアドレスに変換
ドメイン名をIPアドレスに変換するには、以下のコマンドでも確認できます。
これは、DNSを通じて名前解決を行う標準的な方法です。
Linux / macOS / Windows
nslookup <ドメイン名>
または
dig <ドメイン名> +short
例:
nslookup example.com
dig example.com +short
Pythonスクリプトでの方法
Pythonを使う場合、socket
ライブラリを使用できます。
import socket
domain = "example.com"
ip_address = socket.gethostbyname(domain)
print(f"{domain} -> {ip_address}")
注意
nslookup
とdig
は多くのシステムで利用可能ですが、システムに応じてインストールが必要な場合があります。- 一部のドメインには複数のIPアドレスが関連付けられている場合があります。
この場合、dig
やsocket.getaddrinfo
を使うと複数の結果を取得可能です。
1-(1)-2 ドメインでアクセスした場合のポート番号
ドメイン名でウェブサイトにアクセスした場合、ポート番号は通常デフォルトのものが使用されます。具体的には、以下の通りです:
通常のポート番号
- HTTPアクセス(非暗号化通信)
- デフォルトポート: 80
- 例:
http://example.com
- 実際には
http://example.com:80
と同じ意味ですが、ポート番号は省略されます。
- 実際には
- HTTPSアクセス(暗号化通信)
- デフォルトポート: 443
- 例:
https://example.com
- 実際には
https://example.com:443
と同じ意味ですが、ポート番号は省略されます。
- 実際には
カスタムポートの場合
- サーバーがデフォルトポート以外を使用している場合、明示的にポート番号を指定する必要があります。
- 例:
http://example.com:8080
(ポート8080で動作するHTTPサーバー)https://example.com:8443
(ポート8443で動作するHTTPSサーバー)
- 例:
- カスタムポートが指定されていない場合、ブラウザやクライアントはデフォルトのポート(80または443)に接続します。
確認方法
ブラウザ
ドメイン名だけを入力すると、http
または https
プロトコルのデフォルトポートが自動的に使用されます。
nslookup
やdig
ではポートは表示されない
これらのツールはDNS情報(IPアドレスの解決)を取得するためのもので、ポート番号の情報は取得できません。
カスタムポートの確認
サーバー管理者に問い合わせるか、以下のようなコマンドを使って確認できます:
telnet example.com 80
telnet example.com 443
telnet example.com <カスタムポート番号>
telnetがインストールされていない場合は、必要に応じてインストールしてください。
HTTPヘッダーの確認
curl
やwget
を使用して接続時のレスポンスを確認できます。
curl -I http://example.com
下記のような結果が取得できます。
HTTP/1.1 307 Temporary Redirect
Server: nginx/1.27.2
Date: Tue, 26 Nov 2024 08:57:47 GMT
Connection: keep-alive
location: /apps
各項目の説明の例:
HTTP/1.1 307 Temporary Redirect
- 307 Temporary Redirect は、一時的なリダイレクトを表します。
- クライアント(ブラウザやHTTPクライアント)は、同じHTTPメソッド(GETやPOSTなど)を使用して、
Location
ヘッダーで指定されたURLにアクセスするよう指示されています。
Server: nginx/1.27.2
- サーバーが Nginx バージョン 1.27.2 で動作していることを示します。
Date: Tue, 26 Nov 2024 08:57:47 GMT
- レスポンスが生成された日時を示します。
Connection: keep-alive
- サーバーが接続を維持することを示します。この設定により、クライアントとサーバー間の接続が次回のリクエストで再利用されます。
location: /apps
- クライアントがリダイレクト先としてアクセスするべきURLを示します。この場合、リダイレクト先は相対パス
/apps
です。
- クライアントがリダイレクト先としてアクセスするべきURLを示します。この場合、リダイレクト先は相対パス
通常、ブラウザでドメイン名を入力してアクセスすると、HTTP(80)またはHTTPS(443)のポート番号が使用されます。カスタムポートを使用する場合は明示的に指定する必要があります。
(2) リクエストがWebサーバーに到達
- HTTPリクエストは、サーバーのポート80(HTTPの場合)または443(HTTPSの場合)でリッスンしているWebサーバー(例: Nginx)に到達。
- Webサーバーはリクエストのヘッダー(例:
Host: example.com
)を確認し、適切な処理を選択。
2. Dockerを利用したアプリケーション処理の流れ
(1) WebサーバーからDockerコンテナへのリクエストルーティング
Nginxをリバースプロキシとして使用している場合、リクエストはNginxからDockerで動作するアプリケーションにルーティングされます。
Nginxの設定例 (/etc/nginx/sites-available/example
):nginxコード
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:5000; # Flaskアプリケーション(Dockerコンテナ)に転送
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
(2) Dockerコンテナ内での処理
- Dockerがリクエストを処理
- Nginxが転送したリクエストは、Dockerコンテナ内で動作しているアプリケーション(例: Flask)に届きます。
- アプリケーションがレスポンスを生成
- Flaskアプリケーションがリクエストを処理し、必要なデータを生成。
- レスポンスがWebサーバーを経由してクライアントに送信
- FlaskからのレスポンスはNginxを経由してクライアント(ブラウザ)に返されます。
3. システム構築の手順(具体例)
(1) ドメインのDNS設定
- ドメイン管理サービスでAレコードを設定し、ドメイン名をホストサーバーのIPアドレスに紐付ける。
A example.com 192.168.1.10
(2) サーバー環境の準備
DockerとDocker Composeのインストール
sudo apt update
sudo apt install docker docker-compose
Nginxのインストール(リバースプロキシ用)
sudo apt install nginx
(3) Docker Composeでアプリケーションをセットアップ
docker-compose.yml
ファイルを作成してアプリケーション構成を定義。
例: Nginx + Flaskアプリケーション
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "5000:5000" # Flaskアプリケーションをポート5000で公開
environment:
FLASK_ENV: development
nginx:
image: nginx:latest
ports:
- "80:80" # ポート80で公開
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
(4) Flaskアプリケーションの作成
Dockerfile
を作成してアプリケーションをコンテナ化。
Dockerfile
の例:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
requirements.txt
の例:
Flask
(5) Nginx設定ファイル
nginx.conf
ファイルを作成してリバースプロキシを構成。
nginxコード
server {
listen 80;
location / {
proxy_pass http://app:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
(6) アプリケーションの起動
Docker Composeを使ってアプリケーションを起動します。
ビルドと起動bashコードをコピーするdocker-compose up -d
docker-compose up -d
動作確認
ブラウザで http://example.com
にアクセス。
Flaskアプリケーションの応答が表示されれば成功。
4. ドメインアクセスからDocker利用までのまとめ
- ユーザーがドメイン名(例:
example.com
)にアクセス。 - DNSでIPアドレスを取得し、リクエストがホストサーバーに到達。
- NginxがリバースプロキシとしてリクエストをDockerコンテナに転送。
- Dockerコンテナ内のアプリケーションがリクエストを処理し、レスポンスを返す。
- レスポンスがNginxを経由してユーザーに送信される。
これにより、Dockerを利用してドメインに対応するWebアプリケーションを効率的に運用できます。
コメント