簡體   English   中英

Docker Swarm 容器無法相互連接

[英]Docker Swarm containers cannot connect to each other

我正在嘗試重復“將堆棧部署到集群”教程,但有一點不同:一個容器將在一個實例上運行,一個容器在另一個實例上運行。 考慮以下文件(尤其是 docker-compose.yml):

碼頭工人-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

應用程序.py

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)

Dockerfile

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

要求.txt

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  

我還試圖排除防火牆問題:

AWS 安全組說明截圖

我沒有理論了。 我還應該檢查什么?

像 BMitch 建議的那樣使用 tcpdump 進行調試后,我發現了兩件事,不確定哪個有幫助:

  • tcpdump 校驗和似乎壞了,所以我使用了各種 ethtool 命令來禁用它們,
  • 我將--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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM