Sleezr
Sleezr を購入
Dockerhosts ファイルmacOSコンテナローカル開発

Mac で Docker 開発に hosts ファイルを使う

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

S

Sleezr Team

·6分で読む
Mac で Docker 開発に hosts ファイルを使う

ターミナルなしで hosts ファイルを管理

Sleezr は Windows・macOS・Linux で環境をビジュアルに管理。DNS フラッシュとバックアップも自動です。

目次

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 の間にブリッジを作成します。

YAML
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 ファイルの変更は不要です:

YAML
services:
  web:
    image: nginx:alpine
    depends_on:
      - api
  
  api:
    image: node:18
    expose:
      - "3000"

web コンテナは hosts ファイル設定なしで http://api:3000 で API に到達できます。

Docker サービス向けカスタムドメインの設定

基本的な hosts ファイル設定

最もシンプルな方法は、各 Docker サービスをカスタムドメインにマップすることです:

BASH
# /etc/hosts
127.0.0.1    api.docker.test
127.0.0.1    frontend.docker.test
127.0.0.1    admin.docker.test

docker-compose.yml では:

YAML
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:3001
  • http://frontend.docker.test:3002
  • http://admin.docker.test:3003

標準ポートで複数サービスを使う

標準ポート(80、443)を好む場合、ポートごとに1サービスのみ実行可能です。異なるドメインを使います:

BASH
# /etc/hosts
127.0.0.1    api.docker.test
127.0.0.1    frontend.docker.test
YAML
services:
  api:
    image: node:18
    ports:
      - "80:3000"  # api.docker.test:80 でアクセス
  
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"  # frontend は別ポート

サブドメイン向けワイルドカードドメイン

動的サブドメインを持つアプリには、dnsmasq でワイルドカード DNS を使います:

BASH
# 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 マルチサービスアーキテクチャ

マイクロサービス構成

複数サービスを持つ複雑なアプリケーション:

YAML
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 ファイル設定:

BASH
# /etc/hosts
# Docker Services
127.0.0.1    api.docker.test
127.0.0.1    frontend.docker.test
127.0.0.1    admin.docker.test

Docker 内のサービスディスカバリ

コンテナはサービス名で相互に発見します。frontend コンテナは Docker の内部 DNS が api をコンテナ IP に解決するため、http://api:3000 で API を呼び出せます。

Mac からの外部アクセスには、hosts ファイルエントリとマップされたポートを使います。

高度な Docker ネットワークパターン

カスタム Docker ネットワーク

異なる環境用に隔離ネットワークを作成:

YAML
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 を見ます。

外部ネットワーク

既存ネットワークにコンテナを接続:

YAML
services:
  web:
    image: nginx:alpine
    networks:
      - existing_network

networks:
  existing_network:
    external: true

Host ネットワークモード(Linux のみ)

Linux では host ネットワークモードを使えます。macOS では直接サポートされませんが、ポートマッピングで同様の結果を得られます。

ポート管理戦略

ポート競合の回避

複数の Docker プロジェクトを実行すると、ポート競合はよくあります。戦略:

1. 異なるポート範囲を使う

YAML
# Project A
services:
  web:
    ports:
      - "8000:80"

# Project B  
services:
  web:
    ports:
      - "8001:80"

2. 環境変数を使う

YAML
services:
  web:
    ports:
      - "\$\{WEB_PORT:-8080}:80"
BASH
# .env file
WEB_PORT=9000

3. 動的ポート割り当て

YAML
services:
  web:
    ports:
      - "0:80"  # Docker がランダムポートを割り当て

割り当てポートの確認:docker ps または docker-compose ps

標準ポートとリバースプロキシ

リバースプロキシ(Traefik、Nginx)でドメイン名に基づいてルーティング:

YAML
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 で信頼された証明書を作成:

BASH
# Install mkcert
brew install mkcert
mkcert -install

# Create certificate for Docker services
mkcert api.docker.test frontend.docker.test "*.docker.test"

Docker での HTTPS 設定

YAML
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 を自動処理できます:

YAML
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:/certs

Docker 向け hosts ファイルエントリの整理

プロジェクトベースの整理

プロジェクトごとにエントリをグループ化:

BASH
# ===================
# 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

環境ベースの整理

環境ごとに分離:

BASH
# ===================
# 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.test

Docker Compose オーバーライドパターン

開発用オーバーライド

ローカル開発に docker-compose.override.yml を使用:

YAML
# 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 ファイル

BASH
# 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 up

Docker hosts ファイル問題のトラブルシューティング

カスタムドメイン経由でコンテナにアクセスできない

問題:ドメインは解決するが接続拒否。

解決策

1
ポートマッピングを確認:docker ps0.0.0.0:PORT->... が表示されること
2
コンテナが実行中か確認:docker-compose ps
3
hosts エントリを確認:ping api.docker.test が 127.0.0.1 に解決されること
4
ファイアウォール設定を確認

ポートが既に使用中

問題Error: bind: address already in use

解決策

1
ポートを使用しているプロセスを特定:lsof -i :8080
2
競合コンテナを停止:docker stop <container>
3
docker-compose.yml でポートマッピングを変更
4
別のポート範囲を使用

DNS 解決の問題

問題:ドメインが解決されない。

解決策

1
hosts ファイル構文を確認(余分なスペースなし)
2
DNS キャッシュをフラッシュ:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
3
ワイルドカード使用時は dnsmasq を確認
4
Docker Desktop を再起動

コンテナ間通信の失敗

問題:サービスが相互に到達できない。

解決策

1
同一ネットワーク上か確認:docker network inspect <network>
2
localhost ではなくサービス名を使用
3
depends_on の順序を確認
4
expose/ports 設定を確認

Docker hosts ファイル管理のベストプラクティス

1. 一貫した命名規則を使う

BASH
# Good: Project-based naming
api.projectname.test
frontend.projectname.test

# Avoid: Generic names
api.test
web.test

2. ポートマッピングを文書化

README にポートドキュメントを含める:

MARKDOWN
## Local Development

- API: http://api.project.test:3000
- Frontend: http://frontend.project.test:8080
- Admin: http://admin.project.test:3001

3. hosts ファイルテンプレートをバージョン管理

プロジェクトに hosts.example を作成:

BASH
# hosts.example
127.0.0.1    api.project.test
127.0.0.1    frontend.project.test

4. 環境固有ドメインを使う

BASH
# Development
dev-api.project.test

# Staging  
staging-api.project.test

# Local
local-api.project.test

5. hosts ファイル更新の自動化

docker-compose サービスと hosts ファイルを同期するスクリプトを作成:

BASH
#!/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

開発ツールとの統合

ホットリロードとボリュームマウント

YAML
services:
  api:
    build: ./api
    volumes:
      - ./api/src:/app/src  # Hot reload
    ports:
      - "3000:3000"

api.docker.test:3000 経由でアクセスし、コードは自動リロード。

データベースアクセス

YAML
services:
  db:
    image: postgres:15
    ports:
      - "5432:5432"  # Expose for external tools

Mac から localhost:5432 で接続するか、hosts ファイルに db.docker.test を追加。

デバッグツール

YAML
services:
  api:
    image: node:18
    ports:
      - "3000:3000"
      - "9229:9229"  # Node.js debugger

api.docker.test:9229 経由でデバッガーをアタッチ。

結論

Docker で hosts ファイルを効果的に管理するには、Docker ネットワークと macOS の DNS 解決の両方を理解する必要があります。このガイドのパターンに従えば:

  • コンテナサービスを覚えやすいドメイン名にマップできる
  • 複数プロジェクト間のポート競合を避けられる
  • クリーンで整理された hosts ファイル設定を維持できる
  • Docker 開発ワークフローを効率化できる

競合を避けるため .test ドメインを使い、ポートマッピングを文書化し、Sleezr などのツールで hosts エントリを効率的に管理してください。適切な設定により、Docker と hosts ファイルはシームレスに連携し、生産的なローカル開発環境を作れます。

Docker を使うチームには、Sleezr(€4.99)で hosts 設定を共有し、環境の一貫性を保ち、手動編集の負担をなくすことを検討してください。Sleezr はエクスポート、インポート、チーム全体での hosts エントリ同期を簡単にします。

参考リンク

あわせて読むMac で 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 設定の共有と同期が簡単になります。

関連記事

3分で読む
hosts ファイルmacOSチュートリアル

Mac で hosts ファイルを編集:Terminal vs GUI(2026)

macOS で /etc/hosts をエラーなく編集するには?Terminal(sudo nano)と GUI の比較。permission denied と DNS キャッシュの問題を2分で解決。

S

Sleezr Team

3分で読む
SwitchHostshosts マネージャー比較

SwitchHosts vs Sleezr:2026年 hosts マネージャー比較

SwitchHosts と Sleezr のデスクトップ hosts ファイル管理を比較:機能、UI、DNS フラッシュ、バックアップ、コラボレーション、価格。

S

Sleezr Team