ここに問題があります:
Docker は範囲 172.17.0.1/16
を割り当てました あなたの docker0
に インターフェース。これには、172.17.0.1
からのすべてのアドレスが含まれます 172.17.255.255
まで .この範囲には DNS サーバー (172.17.100.3
) が含まれることに注意してください。 そして 172.17.100.70
)。あなたが抱えているのはルーティングの問題です:
ホストが DNS サーバーにアクセスする必要があるときはいつでも、同じネットワーク (docker0
) 上に既にインターフェイスがあることがわかります。 )、そのインターフェイスを使用してパケットをルーティングしようとします...もちろんどこにも行きません.DNSが機能しなくなるのはそのためです.
Docker には、自動選択プロセスからアドレス範囲を除外するための単純なメカニズムがないため、問題を解決するには、おそらく次の 2 つのことを行う必要があります:
まず、docker0
のアドレスを明示的に設定します。 あなたの /etc/docker/daemon.json
で .内部ネットワークと競合しないネットワークを使用してください。例:
{
"bip": "172.31.0.1/16"
}
Docker を再起動する必要があります。
次に、Docker がユーザー定義ネットワーク (docker network create
を使用して明示的に作成したネットワーク) に対して同じネットワーク範囲を選択しないようにします。 または暗黙のうちに docker-compose
などを使用する または docker stack ...
)、新しいネットワークを作成し、それを使用しない:
docker network create --subnet 172.17.0.0/16 --config-only do_not_use
これにより、問題が解決され、将来的に元に戻るのを防ぐことができます。
更新
実際、Docker はこれを達成するための間違いなく優れた方法を文書化しています。「Docker ネットワークの作成」中に Docker が選択するネットワーク アドレス範囲に影響を与えるにはどうすればよいですか?
これには、システムに永続的な静的ルートを設定する必要がありますが、これは Linux ディストリビューションによって異なります。