У меня есть приложениеactjs, которое я хочу сервировать через nginx. Приложение отправляет запросы API на сервер node.js Express. Я решил объединить nginx вместе со статическими файлами веб-сайта (из приложения activjs) в один файл docker-compose. Я создал другой файл docker-compose для сервера Express. Контейнеры в настоящее время на моем ноутбуке и используют localhost
. Я не мог заставить их работать в течение длительного времени, и, к сожалению, в Интернете не так много информации об этом. (веб-сайт и сервер Express работают, когда нет внутри Docker).
Прежде всего я создал новую сеть докеров:
docker network create --driver bridge appstore-net
Это мой docker-compose файл для сайта и nginx:
version: '3.5'
services:
appstore-front:
container_name: appstore-front-production
build:
context: .
dockerfile: Dockerfile-prod
ports:
- '80:80'
networks:
- appstore-net
external_links:
- appstore-bl-server-production
networks:
appstore-net:
external: true
Это мой файл docker-compose для сервера Express:
version: '3'
services:
appstore-bl-server:
container_name: appstore-bl-server-production
build:
dockerfile: Dockerfile-prod
context: .
volumes:
- ".:/usr/src/app"
ports:
- "3000:3000"
networks:
- appstore-net
networks:
appstore-net:
external: true
Это моя конфигурация nginx:
server {
listen 80;
listen [::]:80;
#Docker DNS
resolver 127.0.0.11;
server_name localhost;
access_log /var/log/nginx/appstore.access.log;
error_log /var/log/nginx/appstore.error.log;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
#hack to prevent nginx to resolve container's host on start up
set $docker_host "appstore-bl-server";
proxy_pass http://$docker_host:3000;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Как вы видите, я использую средство распознавания DNS для докера, а также создаю "передачу прокси" на URL, состоящий из имени контейнера Express.
Как я могу заставить это работать?
РЕДАКТИРОВАТЬ: Я нашел 2 проблемы, которые могли быть причиной:
1) external_links
должен ссылаться на имя контейнера, а не на службу контейнера.
2) docker_host
переменная в nginx должна ссылаться на имя службы, а не на имя контейнера.
С этими исправлениями настройка работает (также исправлены значения в OP).