Межсетевое взаимодействие — сбой HTTP-запроса от одного docker к другому

#docker #nginx #docker-compose

#docker #nginx #docker-compose

Вопрос:

У меня есть три контейнера docker, все запущенные в одной сети docker. Все они развернуты на сервере Linux Ubuntu.

  1. Nginx — это мой веб-сервер / обратный прокси-сервер
  2. Приложение mydjango, обслуживаемое gunicorn
  3. Микросервис, обслуживаемый tomcat

С моего ПК с Windows я могу успешно получить доступ ко всем моим конечным точкам Django. Однако один из них завершается с ошибкой, и это тот, который пытается отправить либо http get, либо http post в микросервис (из моего приложения django). Мой http get-запрос (от docker 2 к docker 3) выглядит следующим образом:

 http://my_ip:9000/output_annotations/
  

С моего ПК с Windows я просматриваю http:my_ip:1337/microservice/output_annotations/ , и он завершается с этой ошибкой:

 requests.exceptions.ConnectionError: HTTPConnectionPool(host='standard_core_nlp', port=9000): Max retries exceeded with url: /output_annotations (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f5ae38e3940>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))
  

Когда я использую postman для выполнения http get from http://my_ip:9000/output_annotations , это удается!

Когда все мои docker развернуты локально, все работает должным образом.

Вот мои файлы, связанные с docker:

docker-compose.yml

 version: "3"

services:
  web:
      build: 
          context: ../..
          dockerfile: docker/pb_django/Dockerfile
          args:
            HTTP_PROXY: http://my_proxy.com:9480
            HTTPS_PROXY: http://my_proxy:9480
      image: pb_django 
      container_name: pb_django
      expose:
        - "8000"
      networks:
        - ciee_network
  nginx:
      build: ./nginx
      ports:
        - "1337:80"
      depends_on:
        - web
      networks:
        - ciee_network
networks:
  ciee_network:
    external: true
  

Dockerfile:

     FROM python:3.6
    ENV PYTHONUNBUFFERED 1
    ENV PYTHONDONTWRITEBYTECODE 1
    ARG HTTP_PROXY
    ARG HTTPS_PROXY
    COPY ./requirements.txt /requirements.txt
    RUN pip install -r /requirements.txt
    RUN mkdir /code
    WORKDIR /code
    ADD . /code/
    RUN chmod -R 755 /code
    RUN useradd -m user
    RUN chmod 777 /home/user
    USER user
    CMD unset http_proxy
    CMD unset https_proxy
    CMD unset HTTP_PROXY
    CMD unset HTTPS_PROXY
    ENV HTTP_PROXY=
    ENV HTTPS_PROXY=
    CMD ["gunicorn", "PB_Django.wsgi:application", "--config", "docker/pb_django/gunicorn.conf", "--keep-alive", "600"]
  

nginx Dockerfile

 FROM nginx:alpine
RUN rm -f /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf
  

nginx.conf

 upstream pb_django {
    server web:8000 fail_timeout=0;
}

server {
    listen 80;

    location / {
        proxy_pass http://pb_django/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_read_timeout 10m;
        proxy_connect_timeout 10m;
        client_max_body_size 700m;
    }
}
  

и, наконец, docker-compose.yml для моего микросервиса

 version: "3"

services:
  web:
      build: 
          context:  ..
          dockerfile: ./docker/Dockerfile.ca
      image: microservice  
      container_name: microservice
      ports:
        - "9000:9000"
  

Dockerfile.ca для микросервиса

 FROM ubuntu:latest
ENV TZ=US/Central
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime amp;amp; echo $TZ > /etc/timezon
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
COPY ./docker/scripts /scripts

RUN scripts/with-proxy.sh apt-get update -y amp;amp; 
    scripts/with-proxy.sh apt-get install -y apt-utils 
        default-jre 
        default-jdk

RUN mkdir /code
WORKDIR /code
ADD ./microservice-server/target/microservice-server-0.0.1-SNAPSHOT.jar /code/
RUN chmod -R 755 /code
RUN useradd -m user
RUN chmod 777 /home/user
USER user
ENV PORT 9000
EXPOSE 9000
CMD java -jar /code/microservice-server-0.0.1-SNAPSHOT.jar
  

Любые мысли или предложения будут высоко оценены!

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

1. вы пробовали связывать docker и заменять my_ip именем контейнера?

2. Я добавил сеть — теперь я получаю другую ошибку.

Ответ №1:

В файле compose, который вы здесь представляете, отсутствует ссылка на сеть, которая должна быть общей для всех контейнеров.

Файл compose для микросервиса также должен содержать эту директиву:

   networks:
    - ciee_network
  

Таким образом, его содержимое может выглядеть следующим образом:

 version: "3"

services:
  web:
      build: 
          context:  ..
          dockerfile: ./docker/Dockerfile.ca
      image: microservice  
      container_name: microservice
      networks:
        - ciee_network
      ports:
        - "9000:9000"
  

Тогда конечная точка микросервиса должна быть доступна как из web , так и nginx из контейнера через http(s)://microservice:9000/

Также:

  1. По-видимому, в Dockerfile.ca строке 3 опечатка — вы, скорее всего, хотите записать в /etc/timezone
  2. python Связанные переменные ENV ( PYTHONUNBUFFERED , PYTHONDONTWRITEBYTECODE ), вероятно, не нужны в dockerfile микросервисе java