#docker #nginx #docker-compose
#docker #nginx #docker-compose
Вопрос:
У меня есть три контейнера docker, все запущенные в одной сети docker. Все они развернуты на сервере Linux Ubuntu.
- Nginx — это мой веб-сервер / обратный прокси-сервер
- Приложение mydjango, обслуживаемое gunicorn
- Микросервис, обслуживаемый 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/
Также:
- По-видимому, в
Dockerfile.ca
строке 3 опечатка — вы, скорее всего, хотите записать в/etc/timezone
python
Связанные переменные ENV (PYTHONUNBUFFERED
,PYTHONDONTWRITEBYTECODE
), вероятно, не нужны вdockerfile
микросервисеjava