Docker 使 Redis 的外部連接失敗
我已經嘗試了 StackOverflow 或其他論壇上所有可能的解決方案,我可以找到。我開始按照 Hub Docker 上提供的實際說明使用 docker 安裝 redis。但我無法連接到容器外的 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,但我再次無法從外部訪問(通過同一主機,外部容器)。我再次刪除了容器/映像,並嘗試了其他 2 個命令,但每次我遇到相同的 iptables 錯誤時,我什至嘗試重新啟動 docker。還是沒用。
我正在使用 Centos 7。如果其他人遇到此類問題,請告訴我。在過去的幾個小時裡,我完全被困在這裡。
docker:來自守護程序的錯誤響應:驅動程序在端點 c-redis 上程式外部連接失敗(f251e744aeacbd1a084f11b0e01731b1e1a36454ca8ad634889dd38dae66314d):(iptables 失敗: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: 沒有該名稱的鏈/目標/匹配。(退出狀態 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 在啟動時創建的
DOCKER
鏈。nat
您可以重新創建此鏈,Docker 應該能夠再次開始向其寫入規則。iptables -t nat -N DOCKER
但是可能還缺少其他規則,因此您應該重新啟動 Docker 並讓它修復所有問題。