環境: 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 xxx
docker 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. 理由
Docker
iptables
との関係については公式ドキュメントを参照してください: https://docs.docker.com/network/iptables/
docker
サービスが開始されると、docker
サービスiptables
はDOCKER-USER
と という名前のDOCKER
2 つの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
、コマンドによって復元することですが、実践の過程ではあまり実用的ではありません。
iptables
にDocker
2 つの場合、すべてのサービスによって公開されているポートは有効にならず、サービスは中断されます (この時点では、直接再起動することをお勧めします)。- バックアップしていても、
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 のブログ