繁体   English   中英

Docker 同一网络内的容器无法相互通信

[英]Docker containers inside same network not able to communicate with each other

我在同一个网络中运行了三个 docker 容器。 我使用 docker-compose 来调出容器。 docker-compose 脚本为:

version: '3.5'

services:
  ### Jesse's Workspace ################################################
  jesse:
    image: salehmir/jesse:latest
    depends_on:
      - postgres
      - redis
    tty: true
    env_file:
      - ../.env
    ports:
      - "9000:9000"
      # Jupyter Port
      - "8888:8888"
    volumes:
      - ../:/home
    container_name: jesse
    command: bash -c "jesse install-live --no-strict && jesse run"

  ### PostgreSQL ################################################
  postgres:
    image: postgres:14-alpine
    restart: always
    environment:
      - POSTGRES_USER=jesse_user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=jesse_db
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data
    container_name: postgres

  ### Redis ################################################
  redis:
    image: redis:6-alpine
    ports:
      - "6379:6379"
    container_name: redis
    command: redis-server --save "" --appendonly no
    
volumes:
  postgres-data:

由于我没有指定网络,所以我检查了所有容器都在 docker_default 网桥网络中运行。 DNS 分辨率通过容器名称在容器内正常工作,但 ping 对任何类型的连接都不起作用。

因为,我已经暴露了 redis 容器的端口 6379,我可以从我的主机系统连接到 redis。 127.0.0.1:6379。 但是,来自任何其他容器的连接被拒绝。 我试图在同一网络内启动另一个 ubuntu 容器,并注意到容器内没有互联网连接,即没有传出流量。 我猜这是特定于操作系统的东西,因为相同的设置在我的 Mac 上运行顺利。 我检查了 ufw 防火墙状态,它是非活动的。

jesse 容器正在尝试连接到不接受任何连接的 redis。

Traceback (most recent call last):
jesse  |   File "/usr/local/bin/jesse", line 33, in <module>
jesse  |     sys.exit(load_entry_point('jesse', 'console_scripts', 'jesse')())
jesse  |   File "/usr/local/bin/jesse", line 25, in importlib_load_entry_point
jesse  |     return next(matches).load()
jesse  |   File "/usr/local/lib/python3.9/importlib/metadata.py", line 77, in load
jesse  |     module = import_module(match.group('module'))
jesse  |   File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
jesse  |     return _bootstrap._gcd_import(name[level:], package, level)
jesse  |   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
jesse  |   File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
jesse  |   File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
jesse  |   File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
jesse  |   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
jesse  |   File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
jesse  |   File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
jesse  |   File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
jesse  |   File "<frozen importlib._bootstrap_external>", line 850, in exec_module
jesse  |   File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
jesse  |   File "/jesse-docker/jesse/__init__.py", line 12, in <module>
jesse  |     from jesse.services import auth as authenticator
jesse  |   File "/jesse-docker/jesse/services/auth.py", line 5, in <module>
jesse  |     from jesse.services.env import ENV_VALUES
jesse  |   File "/jesse-docker/jesse/services/env.py", line 18, in <module>
jesse  |     if jh.is_unit_testing():
jesse  |   File "/jesse-docker/jesse/helpers.py", line 368, in is_unit_testing
jesse  |     from jesse.config import config
jesse  |   File "/jesse-docker/jesse/config.py", line 2, in <module>
jesse  |     from jesse.modes.utils import get_exchange_type
jesse  |   File "/jesse-docker/jesse/modes/utils.py", line 3, in <module>
jesse  |     from jesse.services import logger
jesse  |   File "/jesse-docker/jesse/services/logger.py", line 3, in <module>
jesse  |     from jesse.services.redis import sync_publish
jesse  |   File "/jesse-docker/jesse/services/redis.py", line 23, in <module>
jesse  |     async_redis = asyncio.run(init_redis())
jesse  |   File "/usr/local/lib/python3.9/asyncio/runners.py", line 44, in run
jesse  |     return loop.run_until_complete(main)
jesse  |   File "/usr/local/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
jesse  |     return future.result()
jesse  |   File "/jesse-docker/jesse/services/redis.py", line 12, in init_redis
jesse  |     return await aioredis.create_redis_pool(
jesse  |   File "/usr/local/lib/python3.9/site-packages/aioredis/commands/__init__.py", line 188, in create_redis_pool
jesse  |     pool = await create_pool(address, db=db,
jesse  |   File "/usr/local/lib/python3.9/site-packages/aioredis/pool.py", line 58, in create_pool
jesse  |     await pool._fill_free(override_min=False)
jesse  |   File "/usr/local/lib/python3.9/site-packages/aioredis/pool.py", line 383, in _fill_free
jesse  |     conn = await self._create_new_connection(self._address)
jesse  |   File "/usr/local/lib/python3.9/site-packages/aioredis/connection.py", line 111, in create_connection
jesse  |     reader, writer = await asyncio.wait_for(open_connection(
jesse  |   File "/usr/local/lib/python3.9/asyncio/tasks.py", line 442, in wait_for
jesse  |     return await fut
jesse  |   File "/usr/local/lib/python3.9/site-packages/aioredis/stream.py", line 23, in open_connection
jesse  |     transport, _ = await get_event_loop().create_connection(
jesse  |   File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1056, in create_connection
jesse  |     raise exceptions[0]
jesse  |   File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1041, in create_connection
jesse  |     sock = await self._connect_sock(
jesse  |   File "/usr/local/lib/python3.9/asyncio/base_events.py", line 955, in _connect_sock
jesse  |     await self.sock_connect(sock, address)
jesse  |   File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 502, in sock_connect
jesse  |     return await fut
jesse  |   File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 537, in _sock_connect_cb
jesse  |     raise OSError(err, f'Connect call failed {address}')
jesse  | TimeoutError: [Errno 110] Connect call failed ('172.18.0.2', 6379)

用于连接的 python 代码:

async def init_redis():
    return await aioredis.create_redis_pool(
        address=(ENV_VALUES['REDIS_HOST'], ENV_VALUES['REDIS_PORT']),
        password=ENV_VALUES['REDIS_PASSWORD'] or None,
        db=int(ENV_VALUES.get('REDIS_DB') or 0),
    )

.env 值

REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=

docker ps:

docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED             STATUS          PORTS                                       NAMES
2a741ee69b20   postgres:14-alpine   "docker-entrypoint.s…"   About an hour ago   Up 58 minutes   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   postgres
9012709c0bd1   redis:6-alpine       "docker-entrypoint.s…"   About an hour ago   Up 58 minutes   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis

我试图从 postgres 容器中 ping redis 容器,如下所示:

docker exec -it 2a ping redis
PING redis (172.18.0.2): 56 data bytes
^C
--- redis ping statistics ---
26 packets transmitted, 0 packets received, 100% packet loss

因此,DNS 分辨率工作正常,但通信不起作用。 而我可以从我的主机系统连接到 redis。

容器必须在相同的 docker 网络中运行https://docs.docker.com/compose/networking/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM