Назад | Перейти на главную страницу

Docker не поддерживает внешнее подключение для Redis

Я перепробовал все возможные решения, доступные на 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 и позволить ему все исправить.