[英]Docker Swarm containers cannot connect to each other
我正在嘗試重復“將堆棧部署到集群”教程,但有一點不同:一個容器將在一個實例上運行,一個容器在另一個實例上運行。 考慮以下文件(尤其是 docker-compose.yml):
version: "3.9"
services:
web:
image: 127.0.0.1:5000/stackdemo
build: .
ports:
- "8000:8000"
networks:
- data
deploy:
placement:
constraints: [node.hostname == primary]
redis:
image: redis:alpine
networks:
data:
aliases:
- redis
deploy:
placement:
constraints: [node.hostname == secondary]
networks:
data:
driver: overlay
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis.docker', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True)
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
flask
redis
我正在使用 Ubuntu 22.04 AMI 在 t2.nano AWS 實例上嘗試這個。 我得到的錯誤是:
Traceback (most recent call last):
File "/usr/local/lib/python3.4/site-packages/redis/connection.py", line 539, in connect
sock = self._connect()
File "/usr/local/lib/python3.4/site-packages/redis/connection.py", line 566, in _connect
socket.SOCK_STREAM):
File "/usr/local/lib/python3.4/socket.py", line 537, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name does not resolve
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 2334, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 2320, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1766, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.4/site-packages/flask/_compat.py", line 36, in reraise
raise value
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 2317, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1840, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1743, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.4/site-packages/flask/_compat.py", line 36, in reraise
raise value
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1838, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1824, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/code/app.py", line 9, in hello
count = redis.incr('hits')
File "/usr/local/lib/python3.4/site-packages/redis/client.py", line 1367, in incr
return self.incrby(name, amount)
File "/usr/local/lib/python3.4/site-packages/redis/client.py", line 1376, in incrby
return self.execute_command('INCRBY', name, amount)
File "/usr/local/lib/python3.4/site-packages/redis/client.py", line 836, in execute_command
conn = self.connection or pool.get_connection(command_name, **options)
File "/usr/local/lib/python3.4/site-packages/redis/connection.py", line 1073, in get_connection
connection.connect()
File "/usr/local/lib/python3.4/site-packages/redis/connection.py", line 544, in connect
raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error -2 connecting to redis.docker:6379. Name does not resolve.
之前,我通過其官方存儲庫(不是發行版中的存儲庫)安裝了 Docker,我設置了一個注冊表,構建並推送了映像,並使用 --advertise-addr 初始化了 swarm。 以下是我檢查兩個容器是否正在運行的方法:
# docker stack ps stackdemo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8l3d77uvncjz stackdemo_redis.1 redis:alpine secondary Running Running 19 minutes ago
s1iwncohtjwn stackdemo_web.1 127.0.0.1:5000/stackdemo:latest primary Running Running 19 minutes ago
我還試圖排除防火牆問題:
我沒有理論了。 我還應該檢查什么?
像 BMitch 建議的那樣使用 tcpdump 進行調試后,我發現了兩件事,不確定哪個有幫助:
--data-path-addr $( curl ifconfig.me/ip )
添加到 docker docker swarm join
命令我認為是后者有所幫助——通過 SSH 可見的默認 eth0 IP 是本地地址,這可能會破壞連接。 它現在似乎起作用了。
此外,事實證明我可以將我的 docker-compose.yml 簡化為:
version: "3.9"
services:
web:
image: 127.0.0.1:5000/stackdemo
build: .
ports:
- "8000:8000"
deploy:
placement:
constraints: [node.hostname == primary]
redis:
image: redis:alpine
deploy:
placement:
constraints: [node.hostname == secondary]
app.py 中的主機名應該是redis
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.