В соответствии сэтотвеб-сайт, когда настроена сеть контейнеров, каждый контейнер по умолчанию слушает порт 80, и это может привести к конфликту между входящим трафиком. Это решается с помощью обратного прокси-сервера Nginx (также слушающего порт 80), который ищет переменную VIRTUAL_HOST и направляет трафик в нужный контейнер.
Но вот чего я не понимаю. Если Nginx также прослушивает порт 80 (как и все остальные контейнеры), то как это решает проблему конфликта трафика? Поскольку Nginx прослушивает порт 80, то разве проблема конфликта не должна сохраняться? Nginx автоматически захватывает весь входящий трафик независимо от номера порта других контейнеров? Я нахожу всю эту концепцию довольно запутанной.
решение1
Если Nginx также прослушивает порт 80 (как и все остальные контейнеры), то как это решает проблему конфликта трафика?
Возможно, я неправильно понял статью, но похоже, что «все остальные контейнеры» не прослушивают порт 80 (выделено мной):
По умолчанию все службы Docker прослушивают порт 80, что может создать конфликты для входящего трафика. Конечно, вы можете изменить порт прослушивания, но никто не хочет вводить coolwebsite.com:34567, чтобы получить доступ к своему любимому сайту.
Что если вместо этого вы могли бы использовать nginx для маршрутизации трафика, поступающего на coolwebsite.com, на уникальный контейнер, прослушивающий порт 34567, и маршрутизации трафика, поступающего на anothercoolwebsite.net, на второй контейнер, прослушивающий порт 45678?
В этом сценарии Nginx, по-видимому, является единственным веб-сервером, прослушивающим порт 80.
Захватывает ли Nginx автоматически весь входящий трафик независимо от номера порта других контейнеров?
Nginx будет захватывать весь трафик на порту 80. То есть, http://coolwebsite.com
фактически эквивалентно http://coolwebsite.com:80
большинству программного обеспечения. Затем Nginx будет ретранслировать трафик между портом 80 и любым портом, на котором запущен(ы) контейнер(ы) Docker, в зависимости от имени хоста.