ServBayとDockerの連携FAQ
macOS上でローカルWeb開発を行う際、ServBayとDockerのコンテナ環境を組み合わせて使いたいケースが多くあります。本FAQでは、とくにmacOS環境でServBayとDockerを同時利用する際によく生じる質問や、主要な注意点について解説します。主にコンテナからServBayの各種サービスへのアクセス方法や、Dockerコンテナ内のアプリをServBay経由で公開するリバースプロキシ設定についても扱います。
Q1: ServBayはなぜ私のシステムのhosts
ファイルを変更するのですか?変更を防ぐことはできますか?
ServBayでは、システムのhosts
ファイルにエントリー(例:mysite.servbay.demo 127.0.0.1
)を追加することで、mysite.servbay.demo
のようなカスタムローカルドメインでローカル開発環境へアクセスできる仕組みを提供しています。これらのWebサイトは実際にはお使いのMac本体(127.0.0.1
)上で稼働しています。
しかし、Dockerの動作仕様により、コンテナはmacOSホストのhostsファイルを元に自身の/etc/hostsを生成します。その結果、mysite.servbay.demo
が127.0.0.1として解決されてしまい、Dockerコンテナが自分自身を参照してしまいます。
主要な仕組み:
- ServBayで新しいサイトを作成し、例えば
example.servbay.demo
のようなドメイン名を指定すると、自動的に127.0.0.1
へ向けるように割り当てます。 - これは快適なローカル環境のために標準的な方法です。もし
hosts
ファイルを変更しなければ、http://127.0.0.1:PORT
のようなアドレスでしかアクセスできず、独自ドメインでのアクセスはできません。
変更を防ぐことはできる?
理論上、ServBayによって追加されたエントリーを手動で削除することは可能です。しかし、その場合はServBayが設定したドメイン経由でローカルサイトへアクセスできなくなるため、ServBayの利便性が損なわれます。ServBayの主な特徴は、サイト作成とアクセスの簡易化にあります。特定のドメインのhosts
エントリー管理をServBayにさせたくない場合、そのドメインでのWebサイト作成自体を避けるのがよいでしょう。
多くのローカル開発環境では、ServBayによるhosts
ファイル自動管理こそが推奨される機能となっています。
Q2: DockerコンテナからServBayがmacOSホスト上で管理しているWebサイト(例:mysite.servbay.demo
)へ、正しくドメイン経由でアクセスするには?
頻繁にある要件ですが、安易にはまるトラブルも多いです。ServBay上で稼働するWebサイト(例:mysite.servbay.demo
がmacOSホスト上の127.0.0.1
で解決される)に対し、Dockerコンテナからも同じドメイン名でアクセスさせたい場合、まず127.0.0.1
が指す先に注意する必要があります。コンテナ内の127.0.0.1
は「自身(コンテナ)」を指し、ホストのことではありません。
間違った方法:URLのホスト名に直接host.docker.internal
を使ってServBayサイトへアクセスする
たしかにDocker Desktop for Mac(およびWindows)はhost.docker.internal
という特別な名前でコンテナ→ホストの通信ができますが、この名前をServBayサイトURLのホスト名に直接使うのは非推奨です(たとえば、http://host.docker.internal/
でmysite.servbay.demo
を期待する)。
なぜなら、この場合HTTPリクエストのHost
ヘッダーがhost.docker.internal
となってしまい、ServBayのWebサーバー(CaddyやNginx)はそのHost
値をもとにどのサイトかを判断するため、正しくルーティングできなくなります。HTTPS通信の場合はSNI(Server Name Indication)エラーの原因となり、例えばSSL証明書がmysite.servbay.demo
用に発行されているとき、host.docker.internal
でアクセスすると証明書名ミスマッチとなります。
正しい解決法:Docker起動時にextra_hosts
を追加する
Dockerコンテナ内アプリからServBayの「本来のドメイン名」(例:mysite.servbay.demo
)を使い、正しいHost
ヘッダーを送信させるには、コンテナの/etc/hosts
にそのドメイン→ホストIPを追加します。これはdocker-compose.yml
のextra_hosts
や、docker run
の--add-host
で対応できます。値は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以降で利用可能です。)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 Webサーバーに到達します。
- HTTPの
Host
ヘッダーは正しいドメイン名を保持し、ServBayは正しくルーティングとSSL証明書の付与(HTTPS時)を行います。
Q3: Dockerコンテナから、ServBayで管理しているデータベース(MySQLやPostgreSQL等)やHTTP以外のサービスへはどう接続すれば良いですか?
Webサービスのようなドメイン名ベースでのアクセスと異なり、データベース接続やSNIを用いないTCPサービスであれば、host.docker.internal
をサーバー名として使うのがおすすめで有効です。
手順:
ServBay側で対象データベースやサービスが起動していることを確認します(基本的なローカル開発ではデフォルト設定で問題ありません)。
Dockerコンテナ内での接続設定では:
- ホスト名(サーバー名):
host.docker.internal
- ポート番号: ServBayでそのパッケージが使うポート(例:MySQLなら3306、PostgreSQLなら5432)
- ユーザー名・パスワード: ServBayで設定した情報
例:ServBayのMySQLへ接続するケース ServBayでMySQLがデフォルトで3306番ポート稼働の場合:
- ホスト:
host.docker.internal
- ポート:
3306
- ユーザー:
your_db_user
- パスワード:
your_db_password
- ホスト名(サーバー名):
Q4: Dockerコンテナから(extra_hosts
でドメイン解決する設定のもと)ServBay管理のHTTPSサイト(ServBay User CA証明書発行)へアクセスする際、コンテナにこのCAを信頼させるには?
Q2の設定通り、secure.servbay.demo
をhost-gateway
へ向けた上で、そのサイトがServBay User CA発行のSSL証明書を用いている場合、DockerコンテナはデフォルトでそのCAを信頼していないため、SSLエラーとなります。
ServBay CAファイルのパス(macOSホスト上):
- ServBay User CAルート証明書:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- User CA, Public CA, Mozillaルート証明書をまとめたPEM:
- ARM Mac:
/Applications/ServBay/package/common/openssl/3.2/cacert.pem
- Intel Mac:
/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
- ARM Mac:
代表的な解決策:
DockerコンテナがServBay User CAを信頼できるようにする主な方法は次の3つです:
- 方法1: イメージビルド時のシステム全体信頼(Dockerfile)
→ 複数アプリでCAが必要、独自イメージを作れる場合におすすめ。 - 方法2: 起動時にアプリ単体で信頼(ボリュームマウントと環境変数)
→ 特定アプリのみCA信頼で済む場合や公式イメージ加工せず使いたい場合に有効。 - 方法3: 起動時にシステム全体で信頼(ボリュームマウント+起動コマンドカスタム)
→ イメージビルドせず、起動都度システムにCAを登録したい場合向け。
方法1: ビルド時・システム全体信頼(Dockerfile利用)
Dockerイメージビルド時にCAを組み込み、システムで信頼します。
- CAファイル準備:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
をDockerfileと同じビルドディレクトリへコピー。 - 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 - Composeビルド例:yaml
# docker-compose.yml version: '3.8' services: myapp: build: context: ./app_service # DockerfileとCAファイルを格納 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: - /Applications/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
方法3: 起動時・システム全体信頼(マウント+カスタムコマンド)
CAを起動時にボリュームで組み込み、システムごと信頼ストアを更新するパターン。イメージビルド不要ですがコマンドはやや複雑。
- (Debian/Ubuntu系イメージ例)
docker-compose.yml
:yaml注意点:version: '3.8' services: myapp: image: ubuntu:latest # or update-ca-certificatesに対応したイメージ volumes: - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro 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 権限で実行 # user: root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22- 複雑性: コマンドやエントリポイント置き換えにより、公式イメージなどでは独自の工夫が必要な場合があります。
- 権限:
update-ca-certificates
は一般にroot権限が必要です。非rootユーザーなら権限昇格が必要となるケースも。 - パッケージ依存: コンテナイメージに
ca-certificates
パッケージとupdate-ca-certificates
コマンドが必要です。apt系の場合は上述のコマンドで自動インストールもしています。 - 起動遅延: コンテナ毎起動時にチェックやコマンド実行が発生します。
- Alpine: Alpineイメージは
apk add --no-cache ca-certificates && update-ca-certificates
の形になります。
どの方法を選ぶ?
- 独自イメージ準備ができ、全体的なCA信頼が必要なら方法1がベスト。
- イメージをいじりたくない、または特定アプリだけCA信頼で十分なら方法2。
- システムとしてCA信頼(イメージビルド不要)が必要なら方法3。
Let’s Encrypt等、公開CA使用の場合は? ServBayサイトがACME経由の公開CA証明書(Let’s Encryptなど)を使う場合、多くの公式Dockerイメージは公開CAをデフォルトで信頼しているため追加作業は通常不要です。
Q5: Dockerコンテナ内のアプリへ独自ドメイン経由でServBayリバースプロキシ(SSL含む)を設定するには?
たとえばDockerコンテナ内でNode.jsアプリを3000番ポートで動かし、myapp.servbay.demo
のようなドメイン名でローカル開発したい、かつSSL証明書管理もServBay側に任せたいケースです。
やるべき手順:
Dockerコンテナでアプリを起動し、127.0.0.1へポートマッピング コンテナ内でアプリが(例:3000番で)リッスンしている場合、コンテナ起動時に必ず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これでホスト側
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
)で通信します。ブラウザからの動作確認 上記設定後、
http://myapp.servbay.demo
またはSSL有効時はhttps://myapp.servbay.demo
へブラウザでアクセスできるようになります。ServBayがリクエストをDockerコンテナ内アプリへ仲介します。
リクエストの流れイメージ:
ユーザーのブラウザ
↓https://myapp.servbay.demo
↓
ServBay(SSL処理+プロキシ判定)
↓http://127.0.0.1:3001
(ホスト経由)
↓
Dockerコンテナ内アプリ
まとめ
ServBayはmacOSにおけるローカルWeb開発を大幅にシンプルにします。Docker連携時には:
- DockerコンテナからServBay管理サイトへアクセスするには、
extra_hosts
や--add-host
でドメイン名をhost-gateway
に割り当て、正しいHost
ヘッダーとSNI問題の回避を実現します。 - DockerコンテナからServBay管理DBや非HTTPサービスに接続するには、
host.docker.internal
をサーバー名指定すれば簡単便利です。 - ServBay User CAのSSL証明書をDockerコンテナで信頼させたい場合は、CAファイルをイメージに組み込み、信頼ストアを更新しましょう。
- DockerアプリをServBayリバースプロキシで公開したい場合は、「リバースプロキシ」タイプのウェブサイトで、Dockerが127.0.0.1にバインドしたポートをServBayから参照します。
常に、ServBay側の該当パッケージ(Webサーバーやデータベース)およびDockerコンテナが起動・設定済みであることを忘れずに開発を進めてください。