はじめに
本書の目的
本書は、CDN(コンテンツ配信ネットワーク)とDockerを組み合わせた実践的な技術情報をわかりやすくまとめた入門書です。Cloudflareのtunnelを用いた安全なコンテナ間接続、FastAPIとReactのコンテナ化、GitHub Actionsによるビルド・デプロイ、自動化フロー、そしてCDNの仕組みと活用法を順を追って解説します。
想定読者
- 自分でWebサービスを公開したいエンジニアや学習者
- 基本的なLinuxコマンドとDockerの基礎知識を持つ方
- フロントエンド(React)とバックエンド(FastAPI)の連携に興味がある方
本書の使い方
各章は手を動かしながら理解できるよう、設定ファイルやコマンド例を示します。まずは全体像を掴み、順に実践していくことをおすすめします。疑問点は章ごとに確認しやすいように整理しています。
Cloudflareのtunnel機能を使ってみる
概要
CloudflareのTunnel(旧Argo Tunnel)は、外部から直接ポートを開けずにローカルのWebサービスを公開する仕組みです。ここではDocker ComposeでNginxとcloudflaredコンテナを連携し、Dockerルータ経由でアクセスできるようにする手順を丁寧に説明します。
前提
- DockerとDocker Composeがインストール済み
- Cloudflareアカウントとドメインがある(無料プランで可)
全体の流れ
- Cloudflare上でトンネルを作成して認証ファイル(資格情報)を取得
- docker network(例: router)を用意
- Nginxコンテナとcloudflaredコンテナを同じネットワークに配置
- cloudflaredがNginxへトラフィックを転送する設定にする
実際の手順(概要)
1) トンネル作成:CloudflareダッシュボードかCLIでtunnelを作成して資格情報ファイル(cert.pemやcredentials.json)を取得します。
2) docker network作成:
docker network create router
3) docker-compose.ymlの例(簡略):
services:
nginx:
image: nginx:stable
networks: [router]
cloudflared:
image: cloudflare/cloudflared:latest
command: tunnel –no-autoupdate run –token ${TUNNEL_TOKEN}
volumes:
– ./certs:/etc/cloudflared
networks: [router]
この例ではcloudflaredがトンネルを開き、同ネットワークのnginxへHTTPで転送します。
動作確認
- Cloudflareで発行されたサブドメインへブラウザでアクセスし、Nginxのレスポンスが返るか確認します。
- ログはcloudflaredコンテナの標準出力で確認します。
注意点
- 資格情報は秘匿してください。リポジトリにコミットしないでください。
- Dockerネットワーク名とサービス名を一致させると簡単に接続できます。
- 既存のポート(80/443)を開けずに公開できるため安全性が高まります。
Dockerを用いたFastAPIとReactのコンテナ化とデプロイ方法
目的と全体像
FastAPI(バックエンド)とReact(フロントエンド)をそれぞれコンテナ化し、同じネットワークで動かしてクラウドへデプロイする手順を解説します。コンテナ化で環境差異を減らし、移行やスケーリングを容易にします。
FastAPIのDocker化(基本)
- PythonベースのシンプルなDockerfileを用意します。pipで依存をインストールし、uvicornで起動します。
- 例: ベースイメージにpython:3.11を使い、requirements.txtをコピーしてpip installします。アプリ本体をコピー後、CMDでuvicornを実行します。
ReactのDocker化(マルチステージ推奨)
- ビルド用ステージでnodeで依存をインストールし、npm run buildで静的ファイルを作成します。
- 配信用ステージで軽量なnginxなどにビルド結果をコピーします。これでイメージが小さくなります。
ローカルでの連携(docker-compose)
- docker-compose.ymlでFastAPIとReact(nginx)をサービス定義し、内部ネットワークで通信します。
- 環境変数やボリュームを使い、開発時はホットリロード、本番は最小構成にします。
デプロイの流れ(簡潔)
- それぞれのイメージをビルドし、コンテナレジストリ(例: Docker Hub)にpushします。
- クラウド側(VMやコンテナサービス)でpullして実行します。オーケストレーションには簡易ならdocker-compose、拡張ならKubernetesを検討します。
注意点
- シークレット類は環境変数やシークレットマネージャで管理してください。
- ポートとCORS設定を整え、フロントとバック間の通信を確認してください。
GitHub ActionsでDockerビルド&デプロイする自動化フロー
概要
GitHub ActionsでDockerイメージのビルドからレジストリへのプッシュ、さらに本番環境へのデプロイまでを自動化する流れを説明します。手作業を減らし、リリースを安定化できます。
必要な準備
- リポジトリにDockerfileを置く
- レジストリ(Docker HubやAWS ECR)と認証情報をGitHub Secretsに登録する
- デプロイ先の接続情報(SSH鍵やAWS認証)をSecretsに保存する
ワークフローの流れ(例)
- pushやPRでトリガー
- コードのチェックアウト
- Dockerビルド(タグにコミットSHAを付与)
- レジストリへプッシュ
- デプロイ実行(SSHでコンテナ再起動、またはECS/EKSへ更新)
ポイントとして、ビルドキャッシュを有効にしてビルド時間を短縮します。actions/cacheやbuildxのキャッシュを利用します。
CDNと静的ファイル
フロントエンドのビルド成果物はS3にアップロードし、CloudFrontで配信すると高速化と費用対効果が見込めます。デプロイワークフローにS3アップロードとCloudFrontのキャッシュ無効化を組み込みます。
運用のコツ
- タグに日付やSHAを付けて履歴を残す
- ロールバック用に直近のイメージを保持する
- デプロイ後に簡単なヘルスチェックを実行して成功を確認する
CDNの仕組みと利用
CDNとは
CDN(コンテンツ・デリバリー・ネットワーク)は、ユーザーに近い位置にあるサーバー(エッジ)から静的ファイルを配信する仕組みです。画像やCSS、JavaScriptなどを地理的に近いサーバーで配ることで、表示を速くします。
仕組み(簡単な流れ)
- ブラウザがファイルを要求すると、DNSやルーティングで最寄りのエッジに誘導します。
- エッジにキャッシュがあればそこから応答します。無ければオリジンサーバーから取得して配信し、エッジに保存します。
利点
- 読み込み速度の向上:距離が短いため遅延が減ります。例として大きな画像やライブラリを速く読み込めます。
- オリジン負荷の低減:リクエストの多くをエッジがさばくので、元のサーバーの負担が減ります。
- 可用性の向上:一部のサーバーで障害が起きても別のエッジで補えます。
実践的な使い方
- 静的ファイルは必ずCDN経由で配信します。Reactのビルド成果物(JS/CSS)や画像をアップロードしてください。
- APIの応答は動的なので常時CDN化は注意が必要です。キャッシュ可能なGETレスポンスだけ短時間キャッシュするなど、対象を限定すると安全です。
キャッシュ管理のコツ
- ファイル名にハッシュを付ける(ファイルのバージョン管理)と即時反映が楽です。
- HTTPヘッダー(Cache-Control, Expires)で有効期限を設定します。
- 更新時はCDNのパージ(削除)かバージョニングで対応します。
これらを組み合わせると、アプリの表示が速くなり運用も安定します。
ブログにまとめる際のポイント
1. 読者と目的を明確にする
誰向けの記事か(初心者、開発者、運用担当)を最初に示します。目的を明記すると、記事の範囲が分かりやすくなります。
2. CDNとDockerの組み合わせを具体例で示す
静的ファイルはCDNで配信し、動的APIはDockerコンテナで提供する例を提示します。例えば、Reactのビルド成果物をCloudflareやS3+CloudFrontに置き、FastAPIはコンテナで稼働させると説明します。
3. Docker Composeでの実践手順
複数コンテナの起動例(db、api、frontend)を短いdocker-compose.ymlの断片で示し、起動・ログ確認・再起動方法を具体的に書きます。開発と本番での差分も明示します。
4. CI/CD(GitHub Actions)の見せ方
ビルド、テスト、イメージ作成、デプロイの流れをステップ化して説明します。失敗例と対処法(キャッシュ、シークレット管理など)も入れると親切です。
5. パフォーマンスと運用のポイント
キャッシュ戦略、ヘッダー設定、アセットの最適化(圧縮・画像最適化)を具体的に書きます。モニタリングやログの見方も短く触れます。
6. 読みやすさの工夫
見出しを小分けにし、コードは必須箇所だけ掲載します。手順は箇条書きで、実行コマンドと期待する出力を付けると再現性が高まります。
7. よくある落とし穴
ボリュームやネットワーク設定、環境変数の漏れ、CDNのキャッシュ更新忘れなどをリストで挙げ、対処法を添えます。












