Docker
Теория: Сеть
Любое сетевое приложение стартует на каком-то интерфейсе с указанием порта. Часто, по умолчанию, это 127.0.0.1
.По идее этого достаточно для разработки и такой адрес можно открыть в браузере, но с Docker этот фокус не пройдет. Сеть внутри контейнера полностью своя и localhost внутри контейнера, это не тоже самое что и localhost вне его. Поэтому сервер запущенный на localhost внутри контейнера, не будет доступен снаружи
Эта ошибка одна из самых частых у людей, которые только начинают работать с Docker. Они стартуют приложение внутри контейнера и долго не могут понять, почему оно не доступно снаружи.
Для взаимодействия с внешним миром, запуск любых серверов внутри контейнера должен выполняться на адресе 0.0.0.0. Это специальная маска, которая указывает операционной системе подключиться к каждому доступному интерфейсу в системе. А работает это потому, что Docker создает специальный интерфейс со своим ip-адресом внутри каждого контейнера, именно через него реализуется выход наружу.
Но это только первая часть задачи, есть и вторая. Даже когда сервер слушает правильный интерфейс, Docker не дает к нему обратиться просто так. Он требует явного указания порта, который нужно открыть наружу. Это сделано не случайно, так как внутри контейнера может запускаться много всего, но это не значит, что мы хотим дать внешний доступ ко всем запущенным сервисам. Самый распространенный способ указывать порты выглядит так:
Здесь мы говорим Docker, что внешний порт 8080, нужно связать с портом 3000 внутри контейнера. К каким ip-адресам привязаны эти порты? Внутренний это тот, который мы указали веб-серверу, когда запустили его на 0.0.0.0, для нашего приложения это 0.0.0.0
. Внешний автоматически подставляет 0.0.0.0, поэтому любой сервис запущенный в контейнере таким образом, будет автоматически доступен снаружи, если хотя бы один из интерфейсов машины доступен извне. Поэтому возможен запуск с явным указанием адреса:При таком запуске, веб-сервер станет доступным на хост-машине только для 127.0.0.1. Такое бывает нужно, если у хост-машины есть ip-адрес, который доступен снаружи, и мы не хотим случайно дать доступ до контейнера внешним клиентам.
В примере выше мы указали разные номера для внешнего и внутреннего портов для наглядности, но на практике порты могут быть одинаковыми и так делают часто:
Docker позволяет пробрасывать столько портов, сколько нужно. Например, в случае nginx часто требуется использовать и 80 порт, и 443 для HTTPS. Сделать это можно так:
.png)


















