web-dev-qa-db-ja.com

Dockerコンテナは、Dockerサービスが再起動するまでインターネットにアクセスできません

次のコマンドを使用して、手動でブリッジを作成しています。

docker network create --driver bridge --internal --subnet=172.20.0.0/24 br0

次に、そのブリッジパラメータを使用してコンテナを起動します--net=br0 --ip=172.20.0.x

問題は、それらのコンテナーがインターネットにアクセスできないことです。外部にpingすることさえできません。

本当の問題はiptablesに関連しています。サーバーを再起動すると、iptablesにいくつかのルールが表示され、コンテナーにインターネットアクセスがありません。

しかし、Dockerサービスを再起動すると、iptablesには異なるルールがあり、コンテナーはインターネットにアクセスできます。

ルールセットの違いだけをここに貼り付けます。

サーバーを再起動すると、次のルールが表示されます。

*filter
-A DOCKER-ISOLATION ! -s 172.20.0.0/24 -o br-aa4c507d3f06 -j DROP
-A DOCKER-ISOLATION ! -d 172.20.0.0/24 -i br-aa4c507d3f06 -j DROP
COMMIT

Dockerサービスを再起動すると、これら2つのルールが消え、代わりに次のように表示されます。

*filter
-A FORWARD -o br-aa4c507d3f06 -j DOCKER
-A FORWARD -o br-aa4c507d3f06 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br-aa4c507d3f06 ! -o br-aa4c507d3f06 -j ACCEPT
-A FORWARD -i br-aa4c507d3f06 -o br-aa4c507d3f06 -j ACCEPT

-A DOCKER-ISOLATION -i br-aa4c507d3f06 -o docker0 -j DROP
-A DOCKER-ISOLATION -i docker0 -o br-aa4c507d3f06 -j DROP
COMMIT

*nat
-A POSTROUTING -s 172.20.0.0/24 ! -o br-aa4c507d3f06 -j MASQUERADE
-A DOCKER -i br-aa4c507d3f06 -j RETURN
COMMIT

したがって、手動で追加することはおそらく悪い考えであり、これを正常に機能させたいと思います。

コンテナーがインターネットを使用できるようにするiptablesルールをロードするためだけにdockerサービスを再起動する必要があるのはなぜですか?

どうすれば修正できますか?

ブリッジを作成するとiptablesルールが変更され、そのためだけにDockerサービスを再起動する必要はありません。


編集:

ブリッジの作成だけがこのルールをiptablesに追加することに気づきました。

-A DOCKER-ISOLATION ! -s 172.20.0.0/24 -o br-aa4c507d3f06 -j DROP
-A DOCKER-ISOLATION ! -d 172.20.0.0/24 -i br-aa4c507d3f06 -j DROP

だから、ブリッジの作成後、Dockerを再起動する必要がありますか?どうして?

4
Félix Sanz

私の悪い。 --internalを使用していることに気づきませんでした。自明!

3
Félix Sanz