Я перепробовал все возможные решения, доступные на StackOverflow или других форумах, которые смог найти. Я начинаю установку Redis с помощью Docker, следуя инструкциям, доступным на Hub Docker. Но мне не удалось подключиться к Redis вне контейнера.
Моя начальная команда:
docker run --name c-redis -d redis
После дальнейшего поиска я обнаружил, что мне нужно выполнить его как:
docker run --name mag-redis -d redis -p 6379:6379
Но это тоже не удалось, так как я получил следующую ошибку.
$ docker run --name c-redis -d redis -p 6379:6379
c2dbf68f52b46e90671a7efaafbe46898368bb"
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
8559a31e96f4: Already exists
85a6a5c53ff0: Already exists
b69876b7abed: Already exists
a72d84b9df6a: Already exists
5ce7b314b19c: Already exists
04c4bfb0b023: Already exists
Digest: sha256:800f2587bf3376cb01e6307afe599ddce9439deafbd4fb8562829da96085c9c5
Status: Downloaded newer image for redis:latest
075d68ec71abf3752050c947e44a4b1c52305fb6153febe815e31659284612cf
docker: Error response from daemon: driver failed programming external connectivity on endpoint c-redis (f251e744aeacbd1a084f11b0e01731b1e1a36454ca8ad634889dd38dae66314d): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 6379 -j DNAT --to-destination 172.17.0.3:6379 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
Затем я перезапустил iptables
как одно из решений, доступных в Интернете, было это. Но это не помогло, и снова та же ошибка. Затем я нашел еще один запрос в Stackoverflow, т.е.
docker run --name c-redis -p 6379:6379 -d redis --restart unless-stopped -v /etc/redis/:/data --appendonly yes --requirepass "password"
Однако такая же ошибка iptables ... Затем я удалил изображение / контейнер и выполнил его с помощью первой команды (docker run --name c-redis -d redis)
, он был установлен redis, но снова я не смог получить доступ извне (с того же хоста, вне контейнера).
Я снова удалил контейнер / изображение и попробовал эти две другие команды, но каждый раз, когда у меня возникала одна и та же ошибка iptables, я даже пытался перезагрузить докер. По-прежнему бесполезно.
Я использую Centos 7. Сообщите мне, если кто-нибудь еще столкнулся с такой проблемой. Я застрял здесь в течение последних нескольких часов.
docker: ответ об ошибке от демона: драйвер не смог запрограммировать внешнее подключение на конечной точке c-redis (f251e744aeacbd1a084f11b0e01731b1e1a36454ca8ad634889dd38dae66314d): (ошибка iptables: iptables --wait -t nat -A DOCKPATD -p0 -p --to-destination 172.17.0.3:6379! -i docker0: iptables: Нет цепочки / цели / совпадения с этим именем. (статус выхода 1)).
РЕДАКТИРОВАТЬ:
Версия докера:
Client: Docker Engine - Community
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:46:54 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:45:28 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
ОБНОВЛЕНИЕ: (Iptables -S; iptables -t nat -S)
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-N f2b-postfix
-N f2b-postfix-sasl
-A INPUT -p tcp -m multiport --dports 25,587 -j f2b-postfix
-A INPUT -p tcp -m multiport --dports 25,587,953 -j f2b-postfix-sasl
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 31337 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443,587,25,53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-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 FORWARD -j REJECT --reject-with icmp-host-prohibited
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -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
-A f2b-postfix -s 212.70.149.18/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -j RETURN
-A f2b-postfix-sasl -s 212.70.149.18/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -j RETURN
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
Спасибо!
Вам, вероятно, стоило просто использовать firewalld вместо того, чтобы пытаться написать брандмауэр вручную. Похоже, вы удалили DOCKER
цепочка из nat
table, который Docker создает при запуске. Вы можете воссоздать эту цепочку, и Docker сможет снова начать писать для нее правила.
iptables -t nat -N DOCKER
Но, вероятно, отсутствуют другие правила, поэтому вам следует просто перезапустить Docker и позволить ему все исправить.