次のコマンドを使用して、手動でブリッジを作成しています。
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を再起動する必要がありますか?どうして?
私の悪い。 --internal
を使用していることに気づきませんでした。自明!