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
は「コンテナ間通信は許可するが、外部からの直接アクセスは一切許可しない」という設定になる。