Mac で Docker 開発に hosts ファイルを使う
Docker、docker-compose、コンテナネットワーク向けに hosts ファイルを設定。サービスをローカルドメインにマップし、Mac 開発を簡素化。
Sleezr Team

ターミナルなしで hosts ファイルを管理
Sleezr は Windows・macOS・Linux で環境をビジュアルに管理。DNS フラッシュとバックアップも自動です。
目次
- Docker で hosts ファイルを使う方法
- Docker ネットワークの基礎を理解する
- Docker Desktop ネットワークアーキテクチャ
- コンテナ間通信
- Docker サービス向けカスタムドメインの設定
- 基本的な hosts ファイル設定
- 標準ポートで複数サービスを使う
- サブドメイン向けワイルドカードドメイン
- Docker Compose マルチサービスアーキテクチャ
- マイクロサービス構成
- Docker 内のサービスディスカバリ
- 高度な Docker ネットワークパターン
- カスタム Docker ネットワーク
- 外部ネットワーク
- Host ネットワークモード(Linux のみ)
- ポート管理戦略
- ポート競合の回避
- 標準ポートとリバースプロキシ
- Docker とローカル HTTPS
- Docker サービス向け SSL 証明書の生成
- Docker での HTTPS 設定
- 自動 HTTPS の Traefik
- Docker 向け hosts ファイルエントリの整理
- プロジェクトベースの整理
- 環境ベースの整理
- Docker Compose オーバーライドパターン
- 開発用オーバーライド
- 複数 Compose ファイル
- Docker hosts ファイル問題のトラブルシューティング
- カスタムドメイン経由でコンテナにアクセスできない
- ポートが既に使用中
- DNS 解決の問題
- コンテナ間通信の失敗
- Docker hosts ファイル管理のベストプラクティス
- 1. 一貫した命名規則を使う
- 2. ポートマッピングを文書化
- Local Development
- 3. hosts ファイルテンプレートをバージョン管理
- 4. 環境固有ドメインを使う
- 5. hosts ファイル更新の自動化
- 開発ツールとの統合
- ホットリロードとボリュームマウント
- データベースアクセス
- デバッグツール
- 結論
- 参考リンク
Docker は隔離された再現可能な環境を提供し、ローカル開発を革新しました。しかし、カスタムドメイン名でコンテナにアクセスするには、Docker ネットワークと Mac の hosts ファイルの慎重な調整が必要です。このガイドでは、hosts ファイル管理を Docker、docker-compose、コンテナネットワークとシームレスに統合する方法を示します。
Docker で hosts ファイルを使う方法
Mac でカスタムドメインから Docker コンテナにアクセスするには、/etc/hosts でドメインを `127.0.0.1` にマッピングし、コンテナのポートを公開します(例:`-p 8080:80`)。Docker Desktop はコンテナを localhost で公開するためです。コンテナ内からホストのサービスへアクセスする場合は、hosts ファイルを編集せず `host.docker.internal` を使います。
Docker ネットワークの基礎を理解する
hosts ファイルの設定に入る前に、macOS での Docker ネットワークの仕組みを理解することが重要です。
Docker Desktop ネットワークアーキテクチャ
Mac 上の Docker Desktop は Linux VM 内でコンテナを実行します。-p や docker-compose の ports: でポートをマップすると、Docker はコンテナネットワークと Mac の localhost の間にブリッジを作成します。
services:
web:
image: nginx:alpine
ports:
- "8080:80" # Host:Containerこれは次を意味します:
- Mac のポート 8080 がコンテナのポート 80 にマップされる
localhost:8080または127.0.0.1:8080でアクセス可能- カスタムドメインを使うには、127.0.0.1 を指す hosts ファイルエントリを追加
コンテナ間通信
同一 Docker ネットワーク内のコンテナは、docker-compose.yml で定義したサービス名で通信できます。hosts ファイルの変更は不要です:
services:
web:
image: nginx:alpine
depends_on:
- api
api:
image: node:18
expose:
- "3000"web コンテナは hosts ファイル設定なしで http://api:3000 で API に到達できます。
Docker サービス向けカスタムドメインの設定
基本的な hosts ファイル設定
最もシンプルな方法は、各 Docker サービスをカスタムドメインにマップすることです:
# /etc/hosts
127.0.0.1 api.docker.test
127.0.0.1 frontend.docker.test
127.0.0.1 admin.docker.testdocker-compose.yml では:
version: '3.8'
services:
api:
image: node:18
ports:
- "3001:3000"
frontend:
image: nginx:alpine
ports:
- "3002:80"
admin:
image: nginx:alpine
ports:
- "3003:80"サービスへのアクセス:
http://api.docker.test:3001http://frontend.docker.test:3002http://admin.docker.test:3003
標準ポートで複数サービスを使う
標準ポート(80、443)を好む場合、ポートごとに1サービスのみ実行可能です。異なるドメインを使います:
# /etc/hosts
127.0.0.1 api.docker.test
127.0.0.1 frontend.docker.testservices:
api:
image: node:18
ports:
- "80:3000" # api.docker.test:80 でアクセス
frontend:
image: nginx:alpine
ports:
- "8080:80" # frontend は別ポートサブドメイン向けワイルドカードドメイン
動的サブドメインを持つアプリには、dnsmasq でワイルドカード DNS を使います:
# Install dnsmasq
brew install dnsmasq
# Configure wildcard for .docker.test
echo "address=/.docker.test/127.0.0.1" >> /usr/local/etc/dnsmasq.conf
# Create resolver
sudo mkdir -p /etc/resolver
echo "nameserver 127.0.0.1" | sudo tee /etc/resolver/docker.test
# Start dnsmasq
sudo brew services start dnsmasqこれで任意の *.docker.test ドメインが自動的に localhost に解決されます!
Docker Compose マルチサービスアーキテクチャ
マイクロサービス構成
複数サービスを持つ複雑なアプリケーション:
version: '3.8'
services:
# Backend API
api:
build: ./api
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://db:5432/myapp
depends_on:
- db
# Frontend Application
frontend:
build: ./frontend
ports:
- "3001:3000"
environment:
- API_URL=http://api:3000
# Admin Panel
admin:
build: ./admin
ports:
- "3002:3000"
# Database
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
# Redis Cache
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:hosts ファイル設定:
# /etc/hosts
# Docker Services
127.0.0.1 api.docker.test
127.0.0.1 frontend.docker.test
127.0.0.1 admin.docker.testDocker 内のサービスディスカバリ
コンテナはサービス名で相互に発見します。frontend コンテナは Docker の内部 DNS が api をコンテナ IP に解決するため、http://api:3000 で API を呼び出せます。
Mac からの外部アクセスには、hosts ファイルエントリとマップされたポートを使います。
高度な Docker ネットワークパターン
カスタム Docker ネットワーク
異なる環境用に隔離ネットワークを作成:
version: '3.8'
networks:
frontend_network:
driver: bridge
backend_network:
driver: bridge
services:
frontend:
image: nginx:alpine
networks:
- frontend_network
ports:
- "80:80"
api:
image: node:18
networks:
- backend_network
- frontend_network
ports:
- "3000:3000"api サービスは両ネットワークからアクセス可能で、frontend は共有ネットワーク経由でのみ API を見ます。
外部ネットワーク
既存ネットワークにコンテナを接続:
services:
web:
image: nginx:alpine
networks:
- existing_network
networks:
existing_network:
external: trueHost ネットワークモード(Linux のみ)
Linux では host ネットワークモードを使えます。macOS では直接サポートされませんが、ポートマッピングで同様の結果を得られます。
ポート管理戦略
ポート競合の回避
複数の Docker プロジェクトを実行すると、ポート競合はよくあります。戦略:
1. 異なるポート範囲を使う
# Project A
services:
web:
ports:
- "8000:80"
# Project B
services:
web:
ports:
- "8001:80"2. 環境変数を使う
services:
web:
ports:
- "\$\{WEB_PORT:-8080}:80"# .env file
WEB_PORT=90003. 動的ポート割り当て
services:
web:
ports:
- "0:80" # Docker がランダムポートを割り当て割り当てポートの確認:docker ps または docker-compose ps
標準ポートとリバースプロキシ
リバースプロキシ(Traefik、Nginx)でドメイン名に基づいてルーティング:
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
api:
image: node:18
labels:
- "traefik.http.routers.api.rule=Host(`api.docker.test`)"
- "traefik.http.services.api.loadbalancer.server.port=3000"
frontend:
image: nginx:alpine
labels:
- "traefik.http.routers.frontend.rule=Host(`frontend.docker.test`)"hosts ファイルエントリと組み合わせれば、すべてのサービスがドメイン経由でポート 80 からアクセス可能です。
Docker とローカル HTTPS
Docker サービス向け SSL 証明書の生成
mkcert で信頼された証明書を作成:
# Install mkcert
brew install mkcert
mkcert -install
# Create certificate for Docker services
mkcert api.docker.test frontend.docker.test "*.docker.test"Docker での HTTPS 設定
services:
nginx:
image: nginx:alpine
ports:
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./api.docker.test.pem:/etc/nginx/ssl/cert.pem
- ./api.docker.test-key.pem:/etc/nginx/ssl/key.pem自動 HTTPS の Traefik
Traefik は HTTPS を自動処理できます:
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./certs:/certsDocker 向け hosts ファイルエントリの整理
プロジェクトベースの整理
プロジェクトごとにエントリをグループ化:
# ===================
# DOCKER PROJECT: E-commerce Platform
# ===================
127.0.0.1 shop.docker.test
127.0.0.1 api.shop.docker.test
127.0.0.1 admin.shop.docker.test
# ===================
# DOCKER PROJECT: Blog Platform
# ===================
127.0.0.1 blog.docker.test
127.0.0.1 cms.blog.docker.test環境ベースの整理
環境ごとに分離:
# ===================
# DOCKER: Development
# ===================
127.0.0.1 dev-api.docker.test
127.0.0.1 dev-frontend.docker.test
# ===================
# DOCKER: Staging
# ===================
127.0.0.1 staging-api.docker.test
127.0.0.1 staging-frontend.docker.testDocker Compose オーバーライドパターン
開発用オーバーライド
ローカル開発に docker-compose.override.yml を使用:
# docker-compose.yml (base)
version: '3.8'
services:
api:
image: node:18
ports:
- "3000:3000"
# docker-compose.override.yml (local, gitignored)
version: '3.8'
services:
api:
volumes:
- ./src:/app/src # Hot reload
environment:
- NODE_ENV=development複数 Compose ファイル
# Development
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# Production-like
docker-compose -f docker-compose.yml -f docker-compose.prod.yml upDocker hosts ファイル問題のトラブルシューティング
カスタムドメイン経由でコンテナにアクセスできない
問題:ドメインは解決するが接続拒否。
解決策:
docker ps に 0.0.0.0:PORT->... が表示されることdocker-compose psping api.docker.test が 127.0.0.1 に解決されることポートが既に使用中
問題:Error: bind: address already in use
解決策:
lsof -i :8080docker stop <container>DNS 解決の問題
問題:ドメインが解決されない。
解決策:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponderコンテナ間通信の失敗
問題:サービスが相互に到達できない。
解決策:
docker network inspect <network>depends_on の順序を確認Docker hosts ファイル管理のベストプラクティス
1. 一貫した命名規則を使う
# Good: Project-based naming
api.projectname.test
frontend.projectname.test
# Avoid: Generic names
api.test
web.test2. ポートマッピングを文書化
README にポートドキュメントを含める:
## Local Development
- API: http://api.project.test:3000
- Frontend: http://frontend.project.test:8080
- Admin: http://admin.project.test:30013. hosts ファイルテンプレートをバージョン管理
プロジェクトに hosts.example を作成:
# hosts.example
127.0.0.1 api.project.test
127.0.0.1 frontend.project.test4. 環境固有ドメインを使う
# Development
dev-api.project.test
# Staging
staging-api.project.test
# Local
local-api.project.test5. hosts ファイル更新の自動化
docker-compose サービスと hosts ファイルを同期するスクリプトを作成:
#!/bin/bash
# sync-docker-hosts.sh
SERVICES=$(docker-compose config --services)
for service in $SERVICES; do
PORT=$(docker-compose config | grep -A 5 "$service:" | grep -oP 'd+:d+' | head -1 | cut -d: -f1)
echo "127.0.0.1 $service.docker.test" >> /tmp/docker-hosts
done開発ツールとの統合
ホットリロードとボリュームマウント
services:
api:
build: ./api
volumes:
- ./api/src:/app/src # Hot reload
ports:
- "3000:3000"api.docker.test:3000 経由でアクセスし、コードは自動リロード。
データベースアクセス
services:
db:
image: postgres:15
ports:
- "5432:5432" # Expose for external toolsMac から localhost:5432 で接続するか、hosts ファイルに db.docker.test を追加。
デバッグツール
services:
api:
image: node:18
ports:
- "3000:3000"
- "9229:9229" # Node.js debuggerapi.docker.test:9229 経由でデバッガーをアタッチ。
結論
Docker で hosts ファイルを効果的に管理するには、Docker ネットワークと macOS の DNS 解決の両方を理解する必要があります。このガイドのパターンに従えば:
- コンテナサービスを覚えやすいドメイン名にマップできる
- 複数プロジェクト間のポート競合を避けられる
- クリーンで整理された hosts ファイル設定を維持できる
- Docker 開発ワークフローを効率化できる
競合を避けるため .test ドメインを使い、ポートマッピングを文書化し、Sleezr などのツールで hosts エントリを効率的に管理してください。適切な設定により、Docker と hosts ファイルはシームレスに連携し、生産的なローカル開発環境を作れます。
Docker を使うチームには、Sleezr(€4.99)で hosts 設定を共有し、環境の一貫性を保ち、手動編集の負担をなくすことを検討してください。Sleezr はエクスポート、インポート、チーム全体での hosts エントリ同期を簡単にします。
参考リンク
よくある質問
カスタムドメインで Docker コンテナにアクセスするには?
docker-compose.yml でコンテナポートをホストポートにマップし、hosts ファイルに 127.0.0.1 を指すエントリを追加します。競合を避けるため .test ドメインを使います。
各 Docker コンテナごとに hosts ファイルを変更する必要がありますか?
カスタムドメイン名が必要な場合のみです。同一 Docker ネットワーク内のコンテナは、hosts ファイルの変更なしでサービス名で相互アクセスできます。
Docker ネットワークは hosts ファイルとどう連携しますか?
hosts ファイルは Mac の DNS 解決にのみ影響します。Docker コンテナは独自の内部 DNS とネットワークを使用します。ホストポートをマップすれば、hosts ファイルエントリでコンテナにアクセスできます。
Mac で Docker に .local ドメインは使えますか?
推奨しません。.local ドメインは macOS Bonjour と競合します。パフォーマンスと互換性のため .test や .localhost を使ってください。
Docker の hosts ファイル設定をチームと共有するには?
hosts ファイルエントリをエクスポートし、プロジェクトドキュメントに含めます。Sleezr などのツールで、チームメンバー間の hosts 設定の共有と同期が簡単になります。
関連記事
Mac で hosts ファイルを編集:Terminal vs GUI(2026)
macOS で /etc/hosts をエラーなく編集するには?Terminal(sudo nano)と GUI の比較。permission denied と DNS キャッシュの問題を2分で解決。
Sleezr Team
Mac で DNS キャッシュをフラッシュする方法(2026)
Tahoe、Sequoia、Sonoma、Ventura など各 macOS で使える DNS キャッシュのフラッシュコマンドをそのままコピー。検証手順とブラウザキャッシュの消去も解説。
Sleezr Team
hosts ファイル完全ガイド:仕組み・場所・使い方(2026)
hosts ファイルの完全ガイド:何か、Windows/Mac/Linux での場所、構文、主な用途、トラブルシューティングを解説。
Sleezr Team
DNS キャッシュをフラッシュする方法(Windows・Mac・Linux・Chrome)
Windows、Mac、Linux、Chrome で DNS キャッシュをフラッシュ(クリア)する方法。お使いのシステム向けのコマンドをコピーし、DNS フラッシュの役割と安全性も解説します。
Sleezr Team
SwitchHosts vs Sleezr:2026年 hosts マネージャー比較
SwitchHosts と Sleezr のデスクトップ hosts ファイル管理を比較:機能、UI、DNS フラッシュ、バックアップ、コラボレーション、価格。
Sleezr Team