web-dev-qa-db-fra.com

Exécution du conteneur Docker: iptables: Aucune chaîne / cible / correspondance de ce nom

J'essaie d'exécuter un conteneur mais j'obtiens le problème suivant:

Error response from daemon: Cannot start container b005715c40ea7d5821b15c44f5b7f902d4b39da7c83468f3e5d7c042e5fe3fbd: iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.43 --dport 80 -j ACCEPT: iptables: No chain/target/match by that name.
 (exit status 1)

Voici la commande que j'utilise:

docker run -d -p 10080:80 -v /srv/http/website/data:/srv/http/www/data -v /srv/http/website/logs:/srv/http/www/logs myimage

L'ouverture du port 80 sur mon serveur n'est-elle pas suffisante? Y a-t-il quelque chose que j'ai manqué avec l'interface docker? J'utilise iptables avec un script comme celui-ci:

#!/bin/sh

# reset :
iptables -t filter -F
iptables -t filter -X

# Block all :
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

# Authorize already established connections :
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Authorize backloop :
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

# Authorize ssh :
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

# Authorize HTTP :
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT

# Authorize HTTPS :
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

# Authorize DNS :
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT

# Ping :
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# Authorize FTP :
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT

# # Authorize NTP :
# iptables -t filter -A INPUT -p udp --dport 123 -j ACCEPT
# iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

# Authorize IRC :
iptables -t filter -A INPUT -p tcp --dport 6667 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 6667 -j ACCEPT

# Authorize port 10000 (for Node.JS server) :
iptables -t filter -A INPUT -p tcp --dport 10000 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 10000 -j ACCEPT

# Authorize port 631 (Cups server) :
iptables -t filter -A INPUT -p tcp --dport 631 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 631 -j ACCEPT

# Authorize port 9418 (git) :
iptables -t filter -A INPUT -p tcp --dport 9418 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 9418 -j ACCEPT

Comment pourrais-je résoudre ce problème?

22
vmonteco

Je pense que le problème se situe dans ces limites:

iptables -t filtre -F

iptables -t filtre -X

ce qui efface toutes les chaînes. Une solution possible est de lancer le démon docker après le script de configuration iptables. Sinon, vous devrez supprimer explicitement les chaînes qui vous intéressent.

24
Yoanis Gil

J'ai rencontré le même problème dans une configuration de composition de docker.

1. Effacer toutes les chaînes:

Sudo iptables -t filter -F
Sudo iptables -t filter -X

2. Redémarrez ensuite le service Docker:

systemctl restart docker
25

J'ai rencontré le même problème sur RHEL 7. Le redémarrage du service docker a fonctionné pour moi sans avoir à vider les règles iptable.

$ Sudo systemctl restart docker
2
Junaid

Dans irc.freenode.net # docker, vous avez déclaré que vous utilisez Arch Linux ARM sur un Raspberry Pi.

Si vous n'exécutez pas ce script dans le cadre d'un service systemd, je vous suggère fortement de passer à cela, ou d'utiliser les services iptables existants et d'utiliser leur capacité à enregistrer/restaurer les tables aux moments appropriés. Si vous choisissez de passer à vos propres services, assurez-vous que l'unité indique qu'elle est commandée Before=docker.service

1
WarheadsSE