[Troubleshooting] ホストは正常だが Docker コンテナ内だけネットワークが使えない場合

サーバー自体のネットワークは正常なのに、
Docker コンテナの中だけで ping、curl、外部通信がすべて失敗するケースがある。

この場合、問題はサーバーのネットワークではなく、
Docker のネットワークスタックにある。


症状

ホスト側は正常

ping 8.8.8.8
curl https://google.com

正常に応答する。

DNS やルーティングの問題はない。

コンテナ内では失敗

docker exec -it <container> ping 8.8.8.8
docker exec -it <container> curl https://google.com
  • Network is unreachable
  • Temporary failure in name resolution
  • 応答なし

👉 ホスト OK / コンテナ FAIL


原因まとめ(ほとんどはここで終わる)

この状況の大半は、以下のいずれかが原因だ。

  • Docker bridge ネットワークの状態破綻
  • iptables / nftables ルールの不整合
  • Docker DNS 設定の破損
  • カーネルのネットワーク状態と Docker ネットワーク状態の不一致

つまり、Docker のネットワーク階層だけが壊れている状態。


最も確実な解決策

systemctl restart docker
  • Docker ネットワークスタックを初期化
  • bridge / iptables / DNS をすべて再構成

👉 ほとんどのケースで即座に解決する。


ただし…

Docker を再起動できない環境もある。

  • プロダクショントラフィック稼働中
  • 数十個のコンテナに影響
  • 再起動自体が障害になる

その場合に試す価値がある代替手段だけを整理する。


対応 1: 問題のあるコンテナだけネットワークを再接続

現在のネットワーク確認:

docker inspect <container> | grep -i network

ネットワーク再接続:

docker network disconnect bridge <container>
docker network connect bridge <container>
  • コンテナは停止しない
  • ネットワークインターフェースのみ再生成

👉 DNS やルーティング問題の場合に有効。


対応 2: Docker DNS 問題を強制回避

Docker 内部 DNS が壊れているケースは多い。

一時確認:

docker exec -it <container> cat /etc/resolv.conf

nameserver が不正、または応答しない場合:

コンテナ起動時に DNS を直接指定する。

docker run --dns 8.8.8.8 --dns 1.1.1.1 ...

または docker-compose.yml:

dns:
  - 8.8.8.8
  - 1.1.1.1

👉 DNS だけが壊れている場合は非常に効果的。


対応 3: iptables / FORWARD ポリシー確認

Docker はカーネルの FORWARD チェーンに依存する。

iptables -L FORWARD

以下は問題状態:

Chain FORWARD (policy DROP)

一時的な対応:

iptables -P FORWARD ACCEPT

⚠️ セキュリティポリシーに影響あり
確認用途のみに使用する。


対応 4: docker0 インターフェース状態確認

ip addr show docker0
ip route
  • docker0 が DOWN
  • Docker サブネットがルーティングテーブルに存在しない

→ Docker ネットワーク自体が崩壊
→ この場合、再起動以外に解決策はない


諦めて再起動すべきタイミング

以下のいずれかに当てはまる場合、
Docker 再起動が唯一の解決策になる。

  • docker0 インターフェースが DOWN
  • 複数コンテナで同時にネットワーク障害
  • iptables ルールが継続的に壊れる
  • 原因不明の DNS 失敗が繰り返される

👉 この状態で耐え続ける方がリスクが高い。


要点まとめ

  • ホストのネットワークが正常ならサーバー問題ではない
  • コンテナだけ通信できない場合は Docker ネットワーク問題
  • 最も確実な解決策は Docker 再起動

再起動できない場合のみ:

  • ネットワーク再接続
  • DNS 回避
  • FORWARD ポリシー確認

この順で対応すれば、
不要なサーバー再起動や無駄なアプリケーション調査を避けられる。

🛠 마지막 수정일: 2025.12.24

💡 お困りですか?
Zabbix、Kubernetes、各種オープンソースインフラの構築・運用・最適化・障害解析が必要であれば、いつでもご連絡ください。

📧 メール: jikimy75@gmail.com
💼 サービス: 導入支援 | 性能チューニング | 障害解析コンサルティング

What are your feelings

Updated on 2025-12-24