ServBay と Docker 連携 FAQ
ローカルWeb開発でServBayを利用する際、Dockerによるコンテナ環境と組み合わせて使いたい場面があるでしょう。本FAQでは、macOSとWindows環境でServBayとDockerを併用する場合によくある質問とその対処法をまとめています。DockerからServBayサービスへのアクセスや、ServBayによるDockerコンテナ内アプリのリバースプロキシ設定も解説します。
Q1: ServBayはなぜシステムのhosts
ファイルを書き換えるのですか?それを止められますか?
ServBayは、システムのhosts
ファイルにエントリ(例: mysite.servbay.demo 127.0.0.1
)を追加することで独自のローカルドメイン(例: mysite.servbay.demo
)を使ってローカル開発サイトへアクセスできるようにしています。これらのサイトは実際にはあなたのPCの127.0.0.1
で動作しています。
しかしDockerの仕組みにより、ホスト(macOSやWindows)のhostsファイルがコンテナにも反映され、mysite.servbay.demo
が127.0.0.1
に解決され、結果としてDockerコンテナ自身へのアクセスになってしまいます。
仕組みのポイント:
- ServBayで新しいサイトを作り、ドメイン(
example.servbay.demo
など)を指定すると、そのドメインが自動的に127.0.0.1
へ向けられます。 - カスタムドメインでローカルサイトへアクセスするためにはhostsファイルを修正することが一般的です。hostsファイルを変更しない場合は、
http://127.0.0.1:PORT
のような形式でしかアクセスできません。
止めることは可能ですか?
理論上、ServBayが追加したエントリを手動で消すことは可能ですが、その場合ServBayが設定した独自ドメイン経由でローカルサイトにアクセスできなくなり、ServBayの便利なローカル開発体験が損なわれます。ServBayの主要機能の1つは、ローカルサイトの作成・アクセスを簡素化することです。特定ドメインの管理をServBayに任せたくない場合は、ServBayでそのドメインのサイトを作成しないことを推奨します。
ほとんどのローカル開発パターンでは、ServBayによる自動hosts管理が期待される動作であり、設定を非常に簡単にしてくれます。
Q2: Dockerコンテナから、ServBayの管理するウェブサイト(例: mysite.servbay.demo
)へドメイン名で正しくアクセスする方法は?
このニーズは非常に多いですが、正しく設定しないとトラブルにつながります。ServBayがホスト(macOSやWindows)上で稼働しているサイト(例: mysite.servbay.demo
、これはホストでは127.0.0.1
)にアクセスしたい場合、Dockerコンテナ内の127.0.0.1
は「コンテナ自身」を指すため、ホストのサイトへは届きません。
NG例:URLのホスト名として直接host.docker.internal
を用いてServBayサイトにアクセスする
Docker Desktop for Mac/Windowsでは、host.docker.internal
という特殊なDNS名でコンテナ→ホストのIP解決をサポートしていますが、この名前で直接URLアクセス(例: http://host.docker.internal/
→mysite.servbay.demo
を期待)することは推奨されません。
この理由は、アクセス時にHTTPリクエストヘッダのHost
フィールドがhost.docker.internal
になってしまうためです。ServBayのWebサーバ(CaddyやNginx)はこのHost
ヘッダで訪問サイトを判定しています。Host
がhost.docker.internal
だと目的のサイトへ正しくルーティングできず、HTTPSの場合はSNI(Server Name Indication)のエラーの元となります。これは提供されるSSL証明書がmysite.servbay.demo
向けであり、host.docker.internal
には一致しないためです。
正しい方法:Docker起動時にextra_hosts
を追加する
Dockerコンテナ内のアプリで本来のドメイン(mysite.servbay.demo
など)を用い、Host
ヘッダを正しく送りたい場合は、コンテナの/etc/hosts
に該当ドメインをホストのIPへ向けるよう登録します。これはextra_hosts
(docker-compose.yml
)や--add-host
(docker run
)で行い、IPにはhost.docker.internal
または推奨されるhost-gateway
を指定します。
docker run
の場合:bashdocker run --add-host=mysite.servbay.demo:host-gateway ... your_image
1(
host-gateway
は特別な値で、Dockerがホストの内部IPへ自動変換するものです。Docker 20.10以降ではhost.docker.internal
の低レイヤ別名です。)docker-compose.yml
の場合:yamlversion: '3.8' # 以降のバージョンも可 services: myapp: image: your_image extra_hosts: - "mysite.servbay.demo:host-gateway" # または "mysite.servbay.demo:host.docker.internal" # ... その他設定
1
2
3
4
5
6
7
この設定後、Dockerコンテナ内で:
- アプリが
http://mysite.servbay.demo
またはhttps://mysite.servbay.demo
にアクセスしようとすると、コンテナの/etc/hosts
に従いmacOSホストのIPへ向かう - リクエストはホスト側で已稼働のServBayウェブサーバへ送信される
- HTTPの
Host
ヘッダがmysite.servbay.demo
となり、ServBayは正しくサイト判定・SSL証明書(HTTPS使用時)提供が可能になる
Q3: Dockerコンテナから、ServBay管理のデータベース(MySQL・PostgreSQLなど)やHTTP以外のサービスに接続する方法は?
ドメインベースのWebサービスとは異なり、データベースやSNI不要のTCPサービスへの接続はhost.docker.internal
をホスト名として使うのが推奨かつ有効です。
手順:
ServBay内でデータベースソフト(またはサービス)が起動済みであることを確認し、ホストからの接続が許可されているか確認(通常ローカル開発ではデフォルトでOK)。
Dockerコンテナ内でデータベース接続設定:
- ホスト名(Hostname/Server):
host.docker.internal
を指定 - ポート(Port): ServBayで該当サービスに割り当てたポート(MySQL標準
3306
、PostgreSQL標準5432
など) - ユーザー名/パスワード: ServBay側で設定した認証情報を利用
例:ServBay管理のMySQLへ接続する場合 ServBayのMySQLがデフォルトの
3306
ポートで稼働している場合、Dockerコンテナ内アプリでは- ホスト:
host.docker.internal
- ポート:
3306
- ユーザー:
your_db_user
- パスワード:
your_db_password
などの接続情報を設定してください。
- ホスト名(Hostname/Server):
Q4: Dockerコンテナが、ドメイン名(extra_hosts利用)経由でServBay上のHTTPSサイト(ServBay User CA証明書使用)にアクセスする際、コンテナにCA信頼情報を認識させるには?
Q2の手順通り、extra_hosts
や--add-host
でsecure.servbay.demo
をhost-gateway
へ向けているとします。このときsecure.servbay.demo
のSSL証明書がServBay User CAによるものである場合、Dockerコンテナは通常このCAを「信頼されない」と判定してSSL接続に失敗します。
ServBay CA関連ファイルのパス:
- ServBay User CAルート証明書:
- macOS:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- Windows:
C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt
- macOS:
- ServBay User CA+Public CA+Mozilla CAを含むPEMファイル:
- macOS(ARM):
/Applications/ServBay/package/common/openssl/3.2/cacert.pem
- macOS(Intel):
/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
- Windows:
C:\ServBay\package\common\openssl\3.3\cacert.pem
- macOS(ARM):
解決策の概要:
DockerコンテナにServBay User CAを信頼させるには主に下記3つの方法があります。
方法1:システムレベル信頼(Dockerfileでビルド時追加)
CAを全システムで信頼したい場合やカスタムイメージを構築できる場合にお勧め。方法2:アプリケーションレベル信頼(ボリュームマウント+環境変数)
特定アプリだけCAを信頼させたいか、イメージを変更したくない場合に。方法3:システムレベル信頼(ボリュームマウント+カスタム起動コマンド)
イメージのビルド無しですべてのシステムでCA信頼を有効にしたい場合。
方法1:Dockerfileでシステムレベル信頼を構築時に
Dockerイメージビルド時にCA証明書を信頼ストアへ追加。
- CAファイルを準備: ServBay User CAルート証明書をDockerビルドコンテキスト(Dockerfileと同じ階層)へコピー
- macOS:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- Windows:
C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt
- macOS:
- Dockerfile例(Debian/Ubuntu系):dockerfile
# Dockerfile FROM ubuntu:latest COPY ServBay-Private-CA-ECC-Root.crt /usr/local/share/ca-certificates/ServBay-User-CA.crt RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && \ update-ca-certificates && \ rm -rf /var/lib/apt/lists/*
1
2
3
4
5
6 - Dockerfile例(Alpine):dockerfile
# Dockerfile FROM alpine:latest COPY ServBay-Private-CA-ECC-Root.crt /usr/local/share/ca-certificates/ServBay-User-CA.crt RUN apk add --no-cache ca-certificates && update-ca-certificates
1
2
3
4 - Docker Composeでビルド:yaml
# docker-compose.yml version: '3.8' services: myapp: build: context: ./app_service # DockerfileやServBay-Private-CA-ECC-Root.crtのあるディレクトリ dockerfile: Dockerfile extra_hosts: ["secure.servbay.demo:host-gateway"]
1
2
3
4
5
6
7
8
方法2:ボリュームマウントと環境変数によるアプリレベル信頼
CA証明書ファイルをコンテナにマウントし、アプリケーションで環境変数などにより利用。
docker-compose.yml
例:yamlアプリごとに適切な環境変数の確認が必要です。version: '3.8' services: myapp: image: some-base-image volumes: # macOSパス例 - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/etc/ssl/certs/MyCustomCA.crt:ro # Windowsパス例(必要に応じて要調整) # - C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt:/etc/ssl/certs/MyCustomCA.crt:ro environment: # Node.js用例: - NODE_EXTRA_CA_CERTS=/etc/ssl/certs/MyCustomCA.crt # Python(requests)用例: # - REQUESTS_CA_BUNDLE=/etc/ssl/certs/MyCustomCA.crt # 汎用SSL_CERT_FILE例: # - SSL_CERT_FILE=/etc/ssl/certs/MyCustomCA.crt extra_hosts: ["secure.servbay.demo:host-gateway"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
方法3:ボリューム+カスタム起動コマンドでシステム全体で信頼
ボリュームで証明書をマウントした後、起動コマンドでシステムのCAストアを更新します。イメージのビルド不要ですが、起動手順がやや複雑です。
docker-compose.yml
例(Debian/Ubuntu系):yaml注意事項:version: '3.8' services: myapp: image: ubuntu:latest # update-ca-certificatesに対応したイメージ volumes: # ホストのCA証明書をシステム所定のディレクトリへマウント # macOSパス例 - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro # Windowsパス例(必要に応じて調整) # - C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro # 起動時にCA更新+アプリ起動コマンド command: > sh -c " echo 'Attempting to update CA certificates...' && if command -v update-ca-certificates > /dev/null; then if [ ! -f /usr/bin/update-ca-certificates ]; then apt-get update && apt-get install -y --no-install-recommends ca-certificates; fi && update-ca-certificates && echo 'CA certificates updated.' else echo 'update-ca-certificates command not found, skipping CA update.' fi && echo 'Starting application...' && exec your_original_application_command_here # ここはイメージの元々のCMDまたは起動コマンドと置き換えてください " extra_hosts: ["secure.servbay.demo:host-gateway"] # rootユーザーでupdate-ca-certificatesを実行する必要がある場合はuser: rootで一時切替も検討
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26- 複雑さ: 起動コマンドやentrypointの変更は公式イメージ利用時などは手順が煩雑になることも。
- 権限:
update-ca-certificates
は通常root権限が必要です。デフォルト非root起動の場合は要権限変更。 - パッケージ依存: イメージ内に
ca-certificates
やupdate-ca-certificates
が必要。サンプルは不在時自動インストール(aptベースの場合)。 - 起動時間: 起動毎に処理するため起動が遅くなる場合があります。
- Alpine Linuxの場合: コマンドは
apk add --no-cache ca-certificates && update-ca-certificates
。
どの方法が最適?
- カスタムイメージビルド可能でグローバル信頼を目的とするなら方法1が最適
- イメージを変更せず特定アプリのみ信頼させたい場合は方法2
- システム全体に信頼、イメージ変更はしたくない場合は方法3が良い選択です
Let's EncryptなどパブリックCAの場合: ServBayのウェブサイトがACME(Let's Encrypt等)パブリックCA証明書の場合、多くの公式Dockerイメージは標準でこれらCAを信頼済みのため追加作業は不要です。
Q5: Dockerコンテナ内アプリにServBayで独自ドメインを設定し、リバースプロキシするには?
Dockerコンテナ内で(例:Node.jsサービス3000番ポート)アプリを稼働させ、ServBayで好きなドメイン(例: myapp.servbay.demo
)を割り振り、ホスト側からアクセス+SSLによるセキュアな公開を行う手順です。
手順:
Dockerコンテナでアプリ稼働、ポートをホスト
127.0.0.1
にマッピング:
ポートの公開はホストローカルのみ(127.0.0.1
バインド)として、外部公開を防ぎますbash# 例:コンテナ内3000番ポートをホスト127.0.0.1:3001へマッピング docker run -d -p 127.0.0.1:3001:3000 your-docker-app-image
1
2この例では、コンテナアプリは
3000
でListen、ホストのhttp://127.0.0.1:3001
からアクセス可能。ServBayで新規サイト(リバースプロキシ)を追加:
- ServBay管理画面を開く
- 「ウェブサイト追加」をクリック
- ドメイン名: 例:
myapp.servbay.demo
を指定 - サイトタイプ: ドロップダウンで**「リバースプロキシ」**を選択
- IPアドレス: サイト設定入力欄に
127.0.0.1
を入力 - ポート: 手順1で割り当てたホスト側ポート(例:
3001
)を入力 - 「保存」または「追加」をクリック
(任意)SSL設定: サイト追加後、SSL有効化設定が可能です。ServBayはACME(Let's Encryptなど)パブリックCAによる証明書取得も可能、またServBay User CAやPublic CAも選択できます。SSL終端はServBay側が担当し、ServBay→Dockerコンテナの経路は通常HTTP(例:
http://127.0.0.1:3001
)でOKです。動作確認: ServBayの設定が保存されたら、ブラウザで
http://myapp.servbay.demo
やhttps://myapp.servbay.demo
(SSL設定時)にアクセスください。ServBayがDockerコンテナのアプリへプロキシします。
動作フロー: ブラウザ → https://myapp.servbay.demo
→ ServBay(SSL終端・リバースプロキシ) → http://127.0.0.1:3001
(ホストローカルポート) → Dockerコンテナ内アプリ
まとめ
ServBayはmacOS・WindowsでのローカルWeb開発を大幅に効率化します。Dockerと連携する際のポイントは:
- DockerコンテナからServBay管理のウェブサイトへアクセスする際は、
extra_hosts
または--add-host
でサイトのドメイン名をhost-gateway
に向けることで、Host
ヘッダを正しく伝達しSNI等の問題を回避できます。 - DockerコンテナからServBay管理のデータベースやHTTP以外のサービスへアクセスする際は、
host.docker.internal
をホスト名指定するだけで簡単に接続できます。 - ServBay User CAによるSSL証明書をDockerコンテナに信頼させる場合は、CA証明書コピー&信頼ストアの更新が必要です。
- Dockerコンテナ内アプリをServBayでリバースプロキシする場合は、「リバースプロキシ」サイトタイプ設定で、ホスト
127.0.0.1
の公開ポートを指定してください。
ServBayの各種サービス(ウェブサーバ・データベース等)およびDockerコンテナの設定・稼働状況を常に確認して正しい連携を心がけましょう。