dockerロゴ

https-portalで複数Docker開発環境にHTTPSプロキシを一括構築

はじめに

ローカル開発環境で複数のプロジェクトを管理していると、それぞれのnginxにHTTPS対応させたい場面がありますよね。でも、それぞれに証明書やリバースプロキシを設定するのは面倒……。

そんな時に便利なのが、steveltn/https-portal を使った「HTTPSリバースプロキシの一元管理」です。

この記事では、「複数プロジェクト向けHTTPSポータル構成」を紹介します。

http://localhost:8080はAプロジェクトのwebサーバ、http://localhost:8081はBプロジェクトのwebサーバ、8082は…とても面倒でやってられません。

この仕組みを使えば、https://a.localhost で Aプロジェクトのwebサーバ、https://b.localhost で Bプロジェクトのwebサーバへアクセスできるようになり、管理が簡単です。もちろん追加も簡単です。

システム概要

以下の構成で、複数のnginxコンテナに対してhttps-portalがHTTPSプロキシを提供するようにしています。

簡単な構成図

https-portalで複数Docker開発環境にHTTPSプロキシを一括構築構成図

https-portalコンテナ:HTTPS終端 & リバースプロキシ

nginxコンテナ:各プロジェクトが使用するWebサーバ

共通ネットワーク:proxyネットワークで全コンテナが通信可能

ディレクトリ構成

https-portal/
├── docker-compose.yml # https-portal定義
├── domains.json # コンテナとドメインのマッピング
├── start-https-portal.sh # プロキシ設定の自動生成スクリプト
├── start.sh # 起動コマンド。
├── stop.sh # 停止コマンド。
└── .env #ドメイン。

docker-compose.yml(https-portal)

services:
    https-portal:
    image: steveltn/https-portal
    ports:
        - "443:443"
    environment:
        DOMAINS: ${HTTPS_DOMAINS}
        STAGE: local
        FORCE_SSL: "true"
    networks:
        - proxy

# アプリケーションサーバは別プロジェクト側で定義されている前提
# それらをこの proxy ネットワークに接続しておくこと

networks:
    proxy:
        name: proxy
        driver: bridge

domains.json(ドメインマッピング)
fooやbarがdocker-composeで設定するプロジェクト名です。

{
    "foo-nginx-1": "foo.localhost",
    "bar-nginx-1": "bar.localhost"
}

.env

# 値は自動生成されるので空でOK
HTTPS_DOMAINS=

start-https-portal.sh

#!/bin/bash

cd "$(dirname "$0")"
ENV_FILE=".env"
DOMAIN_JSON="domains.json"

echo "🔍 proxyネットワークに接続されているコンテナを検索中..."

# proxyネットワークに接続されている全てのコンテナ名を取得
ALL_CONTAINERS=$(docker network inspect proxy -f '{{range .Containers}}{{.Name}}{{"\n"}}{{end}}')

if [ -z "$ALL_CONTAINERS" ]; then
  echo "⚠️  proxyネットワークに属するコンテナが見つかりません。"
  echo "" > "$ENV_FILE"
  exit 0
fi

DOMAINS=""
for container in $ALL_CONTAINERS; do
  domain=$(jq -r --arg key "$container" '.[$key]' "$DOMAIN_JSON")
  if [ "$domain" != "null" ] && [ -n "$domain" ]; then
    entry="$domain -> http://$container"
    echo "✅ マッピング: $entry"
    if [ -z "$DOMAINS" ]; then
      DOMAINS="$entry"
    else
      DOMAINS="$DOMAINS, $entry"
    fi
  else
    echo "ℹ️  ドメインマッピングが存在しない: $container → スキップ"
  fi
done

if [ -z "$DOMAINS" ]; then
  echo "⚠️ 有効なHTTPSドメインが1つもありません。https-portalの起動はスキップします。"
  echo "" > "$ENV_FILE"
  exit 0
fi

echo "HTTPS_DOMAINS=$DOMAINS" > "$ENV_FILE"
echo "✅ .env に書き出しました:"
cat "$ENV_FILE"

echo "🚀 docker compose --env-file $ENV_FILE up -d"
docker compose --env-file "$ENV_FILE" up -d

start.sh

#!/bin/bash

PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
HTTPS_PORTAL_DIR="/usr/local/https-portal" # 好きなところでOK
HTTPS_PORTAL_CONTAINER="https-portal-https-portal-1"

echo "🚀 プロジェクトを起動します..."

# ① foo プロジェクト(自身)の docker を先に起動(nginxも含めて)
echo "📦 プロジェクトの docker-compose を起動中..."
docker compose up -d

# ② https-portal が動いていたら止める
if docker ps --format '{{.Names}}' | grep -q "^$HTTPS_PORTAL_CONTAINER$"; then
    echo "🛑 https-portal を一旦停止します..."
    docker stop "$HTTPS_PORTAL_CONTAINER"
else
    echo "ℹ️ https-portal は起動していません"
fi

# ③ https-portal の .env 再生成 → 再起動
echo "🔄 https-portal を再起動します..."
(
    cd "$HTTPS_PORTAL_DIR" || exit 1
    ./start-https-portal.sh
)

# ④ foo プロジェクトのログをリアルタイム表示
echo "📺 プロジェクトのログ出力(Ctrl + C で停止)"
docker compose logs -f

stop.sh

#!/bin/bash

PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
HTTPS_PORTAL_DIR="/usr/local/https-portal" # 好きなところでOK
HTTPS_PORTAL_CONTAINER="https-portal-https-portal-1"

echo "🚀 プロジェクトを終了します..."

# ① プロジェクト(自身)の docker を停止
echo "📦 プロジェクトの docker-compose を停止中..."
docker compose stop

# ② https-portal を停止
echo "🛑 https-portal を一旦停止します..."
docker stop "$HTTPS_PORTAL_CONTAINER"

# ③ https-portal の .env 再生成 → 再起動
echo "🔄 https-portal を再起動します..."
(
    cd "$HTTPS_PORTAL_DIR" || exit 1
    ./start-https-portal.sh
)

リバースプロキシで接続するプロジェクト側の設定

domains.jsonで定義したdockerコンテナが定義されているdocker-compose.ymlでの設定となります。

docker-compose.yml の nginx と networks

services:
    nginx:
    build:
        context: ./nginx
    volumes:
        - /home/user/project/code:/var/www
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf
        - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
    environment:
        TZ: "Asia/Tokyo"
    networks:
        - default
        - proxy

# 省略

networks:
    default:
        driver: bridge
        ipam:
            config:
                - subnet: ${DOCKER_SUBNET} # お好きなIPセグメントで
                  gateway: ${DOCKER_GATEWAY} # お好きなゲートウェイIPで
    proxy:
        external: true

解説

🗑 start-https-portal.sh の仕組み

proxyネットワークに接続されている全コンテナを列挙

domains.jsonと照合してドメイン名を割り出し

.envにHTTPS_DOMAINS 環境変数を動的に生成

https-portalコンテナを再起動してプロキシ設定を反映

🚀 プロジェクト起動(start.sh)

リバースプロキシで接続するプロジェクトのdocker開発環境のディレクトリに .start.sh をコピーしておく。

  1. ./start.sh 実行。
    1. 対象プロジェクトのコンテナ起動
    2. https-portalを一時停止
    3. 再度 start-https-portal.sh を実行してプロキシ更新
    4. 対象プロジェクトのログ表示

🚫 プロジェクト停止(stop.sh)

リバースプロキシで接続するプロジェクトのdocker開発環境のディレクトリに .stop.sh をコピーしておく。

  1. ./stop.sh 実行。
    1. 対象プロジェクトのコンテナ停止
    2. https-portalを一時停止
    3. 残りのプロジェクトに対してプロキシ設定を再構築

🆕新しいプロジェクトを追加するには?

  1. domains.json にnginxコンテナ名とローカルドメインを追加
  2. プロジェクトの docker-compose.yml に proxy ネットワークを接続
  3. プロジェクトに start.sh / stop.sh を設置して、パスなどを調整

メリットまとめ

  • ✅ HTTPS対応が簡単:証明書発行不要!自動でHTTPS化
  • ✅ 一元管理:全プロジェクトをまとめて管理
  • ✅ 動的設定:コンテナの起動/ 停止に応じて自動で反映
  • ✅ ローカル開発に最適:複数ドメインのテストも楽々!

注意点

  • ⚠️ 各nginxコンテナは proxy ネットワークに接続されている必要があります
  • ⚠️ domains.json のキーは 実際のコンテナ名 に一致させましょう。
  • ⚠️ start.sh / stop.sh の中で使っている HTTPS_PORTAL_DIR は環境に合わせて変更してください

最後に

複数プロジェクトの開発をしていると、HTTPS対応の整備って意外と手間ですよね。でもこの構成を一度作っておけば、新しいプロジェクトを追加するたびに楽になります。

興味がある方はぜひ真似してみてくださいね!

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん
仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん
Amazonで今すぐ購入
Home » コンピューター » https-portalで複数Docker開発環境にHTTPSプロキシを一括構築