Как настроить соединение между портами в Docker?

Как правильно настроить связь между портами в Docker? У меня возникла проблема с конфигурацией, которая представлена ниже: 

``` 
version: '3' 

services: 
  api: 
    build: ./FunTimeParseEventsApi 
    environment: 
      - NAME=MyApp 
      - TIMEOUT=15 
      - GET_EVENTS_DATA_MESSAGE=Текущие Ивенты 
      - GET_MINES_DATA_MESSAGE=ВСЕ 
      - CHECK_USER=ElytraMistbot 
      - OUTPUT_GROUP_LINK= <a href="https://t.me/" rel="nofollow">https://t.me/</a> 
    volumes: 
      - ./Volumes:/app/cookies 
    networks: 
      - remaxmdcrm_remaxmd-network 
    ports: 
      - 8080:8080 
    command: python app.py 

  discord-bot: 
    build: ./FunTimeEventsDiscordBot 
    environment: 
      - TOKEN=MTI4 
    networks: 
      - remaxmdcrm_remaxmd-network 
    command: python app.py 

networks: 
  remaxmdcrm_remaxmd-network: 
    driver: bridge 
```

При запуске контейнера discord-bot возникает ошибка:  
`urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /setup (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))`. 

Что я могу сделать для устранения этой ошибки?
  • 19 сентября 2024 г. 18:03
Ответы на вопрос 3
Ошибка, с которой вы столкнулись, указывает на то, что контейнер `discord-bot` не может установить соединение с сервисом `api`, работающим на порту 8080. Причины могут быть различными, но основной момент в том, что вы пытаетесь обратиться к `localhost` из контейнера `discord-bot`. Однако `localhost` в этом случае указывает на сам контейнер `discord-bot`, а не на контейнер `api`.

Вот шаги, которые вы можете предпринять для устранения этой ошибки:

1. **Используйте имя сервиса вместо `localhost`**: Вместо того чтобы использовать `localhost` в коде вашего `discord-bot`, используйте имя сервиса `api`. Это имя будет доступно как DNS-имя внутри Docker-сети.

   Например, если ваш код выглядит примерно так:
   ```python
   response = requests.get("http://localhost:8080/setup")
   ```
   измените его на:
   ```python
   response = requests.get("http://api:8080/setup")
   ```

2. **Проверьте, что сервис `api` запущен**: Убедитесь, что сервис `api` действительно запустился и прослушивает 8080 порт. Это можно сделать, например, с помощью команды `docker-compose logs api` для просмотра логов сервиса.

3. **Проверьте доступность порта**: Убедитесь, что приложение в контейнере `api` правильно настроено на прослушивание всех интерфейсов, а не только `localhost`. Если ваше приложение запущено на Flask, убедитесь, что оно запускается с указанием `host='0.0.0.0'`. Например:
   ```python
   app.run(host='0.0.0.0', port=8080)
   ```

4. **Проверка сетевого конфигурации**: Ваши сервисы используют одну и ту же сеть `remaxmdcrm_remaxmd-network`, что правильно, так что они должны видеть друг друга по именам.

5. **Перезапустите контейнеры**: Иногда возможны временные проблемы, которые можно решить, просто перезапустив контейнеры с помощью команд `docker-compose down` и `docker-compose up --build`.

После выполнения этих шагов ваша проблема с соединением должна быть устранена. Если ошибка сохранится, проверьте логи обоих контейнеров для выявления дополнительных подсказок.
В качестве хоста указывай название целевого сервиса.
Вы неправильно указали хост. Пробуйте обращаться к api:8080/setup
Похожие вопросы