ports と expose の違い

portsの場合

ports:
  - "9000:9000"  # ホストマシンのポート9000 → コンテナのポート9000

どこからアクセスできるか

  • 他のコンテナから(同じネットワーク内)
  • ホストマシンから直接(localhost:9000)
  • 外部ネットワークから直接(サーバーIP:9000)

exposeの場合

expose:
  - "9000"  # コンテナのポート9000を他のコンテナに公開

どこからアクセスできるか:

  • 他のコンテナから(同じネットワーク内)
  • ホストマシンから直接アクセス不可
  • 外部ネットワークから直接アクセス不可

実際の通信例

portsを使った場合

# 外部から直接アクセス可能
curl http://サーバーIP:9000

# ホストから直接アクセス可能
curl http://localhost:9000

# コンテナ間通信も可能
curl http://portainer:9000  # nginx-proxy-managerコンテナ内から

exposeを使った場合

# 外部から直接アクセス
curl http://サーバーIP:9000  # 接続拒否

# ホストから直接アクセス
curl http://localhost:9000  # 接続拒否

# コンテナ間通信のみ可能
curl http://portainer:9000  # nginx-proxy-managerコンテナ内からのみ接続可能

セキュリティ上のメリット

exposeを使うメリット

  • Nginx Proxy Managerなどのコンテナ間経由でのみアクセス可能
  • 不正アクセスのリスクに削減

つまり、exposeは「コンテナ間通信は許可するが、外部からの直接アクセスは一切許可しない」という設定になる。