Контейнеры, запущенные с помощью Docker-Compose, не могут подключаться друг к другу

#docker-compose #zipkin

#docker-compose #zipkin

Вопрос:

У меня есть вопрос для начинающих с Docker Compose. Я пытаюсь расширить docker-compose-slim.yml файл примера из репозитория Zipkin GitHub.

Мне нужно изменить его, чтобы он мог включать простое приложение FastAPI, которое я написал. К сожалению, я не могу заставить их соединяться друг с другом. FastAPI отклоняется при попытке отправить POST-запрос в контейнер Zipkin, даже если они оба подключены к одной сети с явными ссылками и сопоставлением портов, определенными в файле YAML. Однако я могу подключиться к ним обоим с хоста.

Не могли бы вы сказать мне, что я сделал не так?

Вот сообщение об ошибке:

 Error emitting zipkin trace. ConnectionError(MaxRetryError("HTTPConnectionPool(host='127.0.0.1', port=9411): Max retries exceeded with url: /api/v2/spans (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fce354711c0>: Failed to es
tablish a new connection: [Errno 111] **Connection refused**'))"))
  

Вот файл Docker Compose YAML:

 version: '2.4'

services:
  zipkin:
    image: openzipkin/zipkin-slim
    container_name: zipkin
    environment:
      - STORAGE_TYPE=mem
    ports:
      # Port used for the Zipkin UI and HTTP Api
      - 9411:9411
    depends_on:
      - storage

  storage:
    image: busybox:1.31.0
    container_name: fake_storage

  myfastapi:
    build: .
    ports:
      - 8000:8000
    links:
      - zipkin
    depends_on:
      - zipkin

  dependencies:
    image: busybox:1.31.0
    container_name: fake_dependencies

networks:
  default:
    name: foo_network
  

Вот файл Dockerfile:

 FROM python:3.8.5
ADD . /app
WORKDIR /app

RUN pip install -r requirements.txt

EXPOSE 8000
CMD ["uvicorn", "wsgi:app", "--host", "0.0.0.0", "--port", "8000"]
  

Комментарии:

1. Я бы рекомендовал вам объединить три контейнера в сеть.

2. Привет, спасибо за ваш ответ. Я думал, что я сделал с этими инструкциями в yml «сети: по умолчанию: имя: foo_network». Я неправильно понимаю, как это работает?

3. Я пишу ответ, пожалуйста, протестируйте его.

Ответ №1:

Вы должны указать контейнерам сеть «foo_network». Внешний флаг указывает, что контейнеры недоступны извне. Конечно, вам не нужно делать ставки, но я подумал, что в качестве примера это может быть неплохо.

И из-за функции «ссылки» посмотрите здесь ссылку

 version: '2.4'

services:
  zipkin:
    image: openzipkin/zipkin-slim
    container_name: zipkin
    environment:
      - STORAGE_TYPE=mem
    ports:
      # Port used for the Zipkin UI and HTTP Api
      - 9411:9411
    depends_on:
      - storage
    networks:
      - foo_network

  storage:
    image: busybox:1.31.0
    container_name: fake_storage
    networks:
      - foo_network

  myfastapi:
    build: .
    ports:
      - 8000:8000
    links:
      - zipkin
    depends_on:
      - zipkin
    networks:
      - foo_network

  dependencies:
    image: busybox:1.31.0
    container_name: fake_dependencies
    networks:
     - foo_network

networks:
  foo_network:
    external: false
  

Комментарии:

1. Привет, спасибо за решение. К сожалению, у меня все еще та же проблема. Ошибка, вызывающая трассировку zipkin. Ошибка подключения (MaxRetryError(«HTTPConnectionPool(host=’127.0.0.1′, port= 9411): превышено максимальное количество попыток с url: /api/v2/spans (вызвано NewConnectionError(‘ Объект HttpConnection в 0x7f8c5ae3c460>: Не удалось установить новое соединение: [Ошибка 111] Соединение отклонено ‘))»))

2. Это мой zipkin_sender, единственная логика, которая отправляется в zipkin def simple_http_zipkin_sender(encoded_span): «»»Простой HTTP-отправитель для zipkin»»» body = encoded_span res = requests.post( » 127.0.0.1:9411/api / v2 /spans «, data=body, headers={‘Content-Введите’: ‘application /json’} ) возвращает res

3. Вы также можете попробовать «zipkin: 9411 / api / v2 / spans», то есть я имею в виду, что вы можете обращаться к контейнерам в вашей сети Docker по имени контейнера.

4. Что происходит при вводе curl -s zipkin:9411/api/v2/spans ?

5. Я нашел решение! Да, это работает, как только я переименовал контейнер в zipkin1 и нажимаю на zipkin1 вместо zipkin или локального хоста!