Linux では、Docker がサービスを開始すると、エラー ドライバーがエンドポイントでの外部接続のプログラミングに失敗しました: xxxx が報告されます

環境: Rocky 8.6( CentOS 7) firewalld、、、Docker

PS: ファイアウォールがオフになっていれば、この問題に常に遭遇することはなくなるかもしれません。また髪の毛が大量に抜けてしまいました。

サーバーのポートを占有する必要がある場合に限り、エラーが報告されます。ポートをマッピングする必要がない場合、対応する問題は発生しません
例:docker run -d --name nginx-test1 nginxこの種のポートはマッピングされていません。
docker run -d --name nginx-test1 -p 80:80 nginxポートがマッピングされている場合は、ファイアウォールを操作する必要があります (有効な場合)。

1. シーン

サーバー上のサービスがポートを公開する必要があるため、ファイアウォールが動作して再起動され、サーバーDocker上で正常に使用できなくなります。と を実行すると、次のエラーが報告されます。
docker run xxxdocker start xxxx

docker: Error response from daemon: driver failed programming external connectivity 
on endpoint xxxx(d3e43fa36d34987312e2c3ffd30d3ce3d1892d43ef951241fc2ae320ffeb1330):  
(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9905 -j DNAT 
--to-destination 172.18.0.2:9005 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

2. 理由

Dockeriptablesとの関係については公式ドキュメントを参照してください: https://docs.docker.com/network/iptables/

dockerサービスが開始されると、dockerサービスiptablesDOCKER-USERと という名前のDOCKER2 つのdockerサービス管理容器(containner)によって公開されているポート間の通信を許可します。

ファイアウォールfirewalldを再起動するとチェーンが失われ、docker run使用時に上記のエラーが表示されます。

3. 解決策

3.1 Docker の再起動 (推奨)

この方法は、Docker起動時。素敵ですね!

systemctl restart docker
# 或
service docker restart 

【注意】--restart=alwaysパラメータを自動的にDockerとして起動されますが、設定されていない場合は手動で再起動する必要があります。
コンテナの自動起動を設定したい場合は、次のコマンドで設定できます。

# 更新已有的容器:xxx 为容器的标识或容器的名称
docker container update --restart=always xxxx

# 启动时设置
 docker run -d --name nginx-test1 -p 80:80 --restart=always nginx

3.2 iptables ルールの復元 (非推奨)

実際には、この方法は、iptables-saveコマンド、その後iptables-restore、コマンドによって復元することですが、実践の過程ではあまり実用的ではありません。

  • iptablesDocker2 つの場合、すべてのサービスによって公開されているポートは有効にならず、サービスは中断されます (この時点では、直接再起動することをお勧めします)。
  • バックアップしていても、Docker公開されている、手動で差分を処理する必要があり、非常に面倒です。
  • バックアップがまったくない場合は、対応するチェーンを手動で追加します。多くのサービスDockerが実行されている、追加するのは非常に手間がかかります (それでも手間はかかりません)
  • 定期的にバックアップを行っている場合は、この方法しか使用できません(ただし、サービスが中断されているため、直接再起動することをお勧めします)。

iptablesルールの複雑さは、次のことを直接的に説得します。

# Generated by iptables-save v1.8.4 on Thu Jan 26 14:58:33 2023
*filter
:INPUT ACCEPT [105973064:35160153136]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [96468849:80475545565]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8805 -j ACCEPT
-A DOCKER -d 172.18.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8801 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Thu Jan 26 14:58:33 2023
# Generated by iptables-save v1.8.4 on Thu Jan 26 14:58:33 2023
*security
:INPUT ACCEPT [105973069:35160156762]
:FORWARD ACCEPT [11122602:8643145221]
:OUTPUT ACCEPT [96468861:80475547136]
COMMIT
# Completed on Thu Jan 26 14:58:33 2023
# Generated by iptables-save v1.8.4 on Thu Jan 26 14:58:33 2023
*raw
:PREROUTING ACCEPT [117095673:43803302209]
:OUTPUT ACCEPT [96468861:80475547136]
COMMIT
# Completed on Thu Jan 26 14:58:33 2023
# Generated by iptables-save v1.8.4 on Thu Jan 26 14:58:33 2023
*mangle
:PREROUTING ACCEPT [117095673:43803302209]
:INPUT ACCEPT [105973071:35160156988]
:FORWARD ACCEPT [11122602:8643145221]
:OUTPUT ACCEPT [96468861:80475547136]
:POSTROUTING ACCEPT [107591469:89118692771]
COMMIT
# Completed on Thu Jan 26 14:58:33 2023
# Generated by iptables-save v1.8.4 on Thu Jan 26 14:58:33 2023
*nat
:PREROUTING ACCEPT [288081:17293388]
:INPUT ACCEPT [287965:17286375]
:POSTROUTING ACCEPT [1756221:105814926]
:OUTPUT ACCEPT [1756221:105814926]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.18.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.2/32 -d 172.18.0.2/32 -p tcp -m tcp --dport 8805 -j MASQUERADE
-A POSTROUTING -s 172.18.0.3/32 -d 172.18.0.3/32 -p tcp -m tcp --dport 8801 -j MASQUERADE
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8805 -j DNAT --to-destination 172.18.0.2:8805
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8801 -j DNAT --to-destination 172.18.0.3:8801
COMMIT
# Completed on Thu Jan 26 14:58:33 2023

個人ブログ: Roc のブログ

おすすめ

転載: blog.csdn.net/peng2hui1314/article/details/128734497