Как Docker автоматически распределяет и перераспределяет порты для контейнеров - PullRequest
0 голосов
/ 12 ноября 2018

Когда я запускаю команду docker

docker run -d -P nginx

docker запустится и автоматически назначит порт для порта 80 nginx. Если я остановлю образ и запустите его снова, новый порт будет назначен для nginx (обычно следующийодин доступный).

Как я выяснил, диапазон для распределения портов основан на эфемерном диапазоне портов, в случае с докером по умолчанию это 32768 - 61000. (https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/)

Как и когда делаетпорты перезапуска докера? Вернется ли он к 32768 или ближайшему доступному?

1 Ответ

0 голосов
/ 12 ноября 2018

Мне потребовалось много времени, чтобы выяснить, но docker мало что делает.

Я погрузился в docker-ce исходные файлы и увидел, что он использует функцию RequestPortInRange, которая просто дает следующий доступный порт.

Теперь, когда вы запускаете команду docker run -d -P nginx, docker предоставляет вам первый доступный порт в «эфемерном диапазоне», т. Е. 32768 - 61000 (как вы указали).

После того, как вы уничтожите /остановите контейнер, он должен вернуться к 32768, однако он перейдет к следующему доступному порту, т.е. 32769 (по крайней мере, на моем компьютере).

Итак, я подумал, что это может занять некоторое время для linux или любая ОС для возврата порта после уничтожения контейнера, но netstat -lntu подтверждает, что порт больше не используется.

Итак, моя теория такова (что может быть совершенно неверным, вв этом случае я буду рад исправить), что он создает один экземпляр PortAllocator вещь и, следовательно, он имеет состояние.поэтому при следующем вызове docker run -P ... он перейдет к следующему доступному порту.Это также подтверждается тем фактом, что даже когда вы создаете другие контейнеры, docker engine предоставляет вам следующий доступный порт, а не предыдущие, пока доступные.

Я надеюсь, что ответил на ваш вопрос, и я незнаю многое из golang, так что, прости любую ошибку в терминологии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...