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