0.0.0.0:3000->3000/tcp, :::3000->3000/tcp front_distance
distance 0.0.0.0:49284->3001/tcp, :::49284->3001/tcp back_distance
redis:alpine 6379/tcp back_redis
mongo:latest 0.0.0.0:49195->27017/tcp, :::49195->27017/tcp back_mongo
jwilder/nginx-proxy 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx-proxy
jrcs/letsencrypt-nginx-proxy-companion letsencrypt-nginx-proxy-companion
в конфиге указана сеть
networks:
default:
external:
name: nginx-proxy
бэкенд висит на порту 49284 - этот порт динамический, потому что в конфиге указано ports: - 3001 (без второго числа через двоеточие)
как его контейнер с Nginx тогда видит? понятно что сеть внутренняя одна, но порт то динамический
ports влияет лишь на доступ с хоста, но не на внутренние сети между контейнерами
то есть независимо от того, какой внутри порт у приложения(а он тут динамический) другой контейнер (Nginx) найдет его все равно? А как? в Nginx нет никакого указания, ни как искать запущенное приложение, ни портов не указано, как он запросы тогда проксирует именно на бэк?
в контейнере с приложением есть expose? nginx-proxy вроде на эту директиву смотрел
в конфиге докер образа нету и в конфиге docker-compose тоже нету и в приложении нету
ports не управляет тем, какой порт слушает приложение внутри контейнера. Приложение всегда слушает порт, который задан его собственными настройками или зашит в коде. В данном случае это порт 3001. А ports лишь пробивает рандомную дырку в изоляции контейнера и перенаправляет из нее запросы на 3001 порт внутри контейнера, чтобы можно было делать запросы к приложению с хоста или внешнего мира
ну выходит что бэк(приложение) внутри контейнера висит на 3001 порту на локалхосте сам контейнер пробрасывает изнутри порт 49284 наружу на порт 3001 (0.0.0.0:49284->3001) nginx ищет что? в конфиге ни ни имени контейнера, ни порта не указано же, как ищет то?
Не локалхосте. Забудьте слово локалхост
добавь в композ expose
этот nginx подслушивает докер сокет и инспектирует стартующие контейнеры чтобы определить какой трафик на них роутить
во! вот теперь немного яснее вроде это выходит что он как раз смотрит на /tmp/docker.sock:ro проброшенный снаружи..? сокет это вроде бы сервис работающий?
Сервис докера постоянно запущен на хосте, и соответственно именно он и занимается управлением контейнерами, сетями, проброса и портов и т.п. Сокет - аналог порта, в который можно отправлять запросы (записывать), но у него есть путь на диске и его можно пробросить в контейнер как обычный файл. Так консольные команды docker и docker-compose общаются с сервисом докера. Можно настроить докер сервер так, чтобы тот слушал порт, тогда вместо проброса файла можно будет обращаться к серверу по сети, а в случае прослушивания адреса 0.0.0.0 можно будет принимать запросы и от других компьютеров в сети. Иногда могут требоваться такие извращения, но крайне редко
Обсуждают сегодня