MENU
Language

ドメインにアクセスしてからDockerを利用するまでの流れ

ドメインにアクセスしてからDockerを利用するまでの流れを、具体的なシナリオを元に詳しく説明します。このシナリオでは、以下の環境を仮定します:

  • ドメイン名: example.com
  • ホストサーバーでDockerを使用してWebアプリケーション(例: Nginx + Flaskアプリケーション)を動かす。

目次

1. ドメインアクセスの概要

(1) ドメイン名からIPアドレスの解決(DNSルックアップ)

  1. ユーザーがブラウザで http://example.com にアクセス。
  2. ブラウザは、指定されたドメイン名(example.com)をDNSサーバーに問い合わせ、対応するIPアドレスを取得。
    • : example.com -> 192.168.1.10
  3. 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}")

注意

  • nslookupdig は多くのシステムで利用可能ですが、システムに応じてインストールが必要な場合があります。
  • 一部のドメインには複数のIPアドレスが関連付けられている場合があります。
    この場合、digsocket.getaddrinfo を使うと複数の結果を取得可能です。

1-(1)-2 ドメインでアクセスした場合のポート番号

ドメイン名でウェブサイトにアクセスした場合、ポート番号は通常デフォルトのものが使用されます。具体的には、以下の通りです:

通常のポート番号

  1. HTTPアクセス(非暗号化通信)
    • デフォルトポート: 80
    • 例: http://example.com
      • 実際には http://example.com:80 と同じ意味ですが、ポート番号は省略されます。
  2. 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 プロトコルのデフォルトポートが自動的に使用されます。

nslookupdigではポートは表示されない

これらのツールはDNS情報(IPアドレスの解決)を取得するためのもので、ポート番号の情報は取得できません。

カスタムポートの確認

サーバー管理者に問い合わせるか、以下のようなコマンドを使って確認できます:

telnet example.com 80
telnet example.com 443
telnet example.com <カスタムポート番号>

telnetがインストールされていない場合は、必要に応じてインストールしてください。

HTTPヘッダーの確認

curlwgetを使用して接続時のレスポンスを確認できます。

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

各項目の説明の例:

  1. HTTP/1.1 307 Temporary Redirect
    • 307 Temporary Redirect は、一時的なリダイレクトを表します。
    • クライアント(ブラウザやHTTPクライアント)は、同じHTTPメソッド(GETやPOSTなど)を使用して、Location ヘッダーで指定されたURLにアクセスするよう指示されています。
  2. Server: nginx/1.27.2
    • サーバーが Nginx バージョン 1.27.2 で動作していることを示します。
  3. Date: Tue, 26 Nov 2024 08:57:47 GMT
    • レスポンスが生成された日時を示します。
  4. Connection: keep-alive
    • サーバーが接続を維持することを示します。この設定により、クライアントとサーバー間の接続が次回のリクエストで再利用されます。
  5. location: /apps
    • クライアントがリダイレクト先としてアクセスするべきURLを示します。この場合、リダイレクト先は相対パス /apps です。

通常、ブラウザでドメイン名を入力してアクセスすると、HTTP(80)またはHTTPS(443)のポート番号が使用されます。カスタムポートを使用する場合は明示的に指定する必要があります。

(2) リクエストがWebサーバーに到達

  1. HTTPリクエストは、サーバーのポート80(HTTPの場合)または443(HTTPSの場合)でリッスンしているWebサーバー(例: Nginx)に到達。
  2. 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コンテナ内での処理

  1. Dockerがリクエストを処理
    • Nginxが転送したリクエストは、Dockerコンテナ内で動作しているアプリケーション(例: Flask)に届きます。
  2. アプリケーションがレスポンスを生成
    • Flaskアプリケーションがリクエストを処理し、必要なデータを生成。
  3. レスポンスが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利用までのまとめ

  1. ユーザーがドメイン名(例: example.com)にアクセス
  2. DNSでIPアドレスを取得し、リクエストがホストサーバーに到達
  3. NginxがリバースプロキシとしてリクエストをDockerコンテナに転送
  4. Dockerコンテナ内のアプリケーションがリクエストを処理し、レスポンスを返す
  5. レスポンスがNginxを経由してユーザーに送信される

これにより、Dockerを利用してドメインに対応するWebアプリケーションを効率的に運用できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

AIアーティスト | エンジニア | ライター | 最新のAI技術やトレンド、注目のモデル解説、そして実践に役立つ豊富なリソースまで、幅広い内容を記事にしています。フォローしてねヾ(^^)ノ

コメント

コメントする

目次