Мне потребовалось много времени, чтобы выяснить, но docker
мало что делает.
Я погрузился в docker-ce
исходные файлы и увидел, что он использует функцию RequestPortInRange
, которая просто дает следующий доступный порт.
Теперь, когда вы запускаете команду docker run -d -P nginx
, docker предоставляет вам первый доступный порт в «эфемерном диапазоне», т. Е. 32768 - 61000 (как вы указали).
После того, как вы уничтожите /остановите контейнер, он должен вернуться к 32768
, однако он перейдет к следующему доступному порту, т.е. 32769
(по крайней мере, на моем компьютере).
Итак, я подумал, что это может занять некоторое время для linux
или любая ОС для возврата порта после уничтожения контейнера, но netstat -lntu
подтверждает, что порт больше не используется.
Итак, моя теория такова (что может быть совершенно неверным, вв этом случае я буду рад исправить), что он создает один экземпляр PortAllocator
вещь и, следовательно, он имеет состояние.поэтому при следующем вызове docker run -P ...
он перейдет к следующему доступному порту.Это также подтверждается тем фактом, что даже когда вы создаете другие контейнеры, docker engine
предоставляет вам следующий доступный порт, а не предыдущие, пока доступные.
Я надеюсь, что ответил на ваш вопрос, и я незнаю многое из golang
, так что, прости любую ошибку в терминологии.