主機將自動給容器的22和80映射兩個埠,如:
0.0.0.0:49155->22/tcp, 0.0.0.0:49156->80/tcp
當該容器停止并且洗掉后,49155和49156這兩個主機埠應該被釋放,留給新的容器使用,但實際此時再新建容器映射埠發現,這兩并未使用,而是系統自動分配這倆埠后面新的埠,比如49157...
只有docker服務重啟后原來空出來的埠才會被分配。在三臺不同的docker主機上做實驗都是如此,貌似不是我配置的問題,不知大家的環境如何?求解!
uj5u.com熱心網友回復:
通過查看原始碼docker / runtime / networkdriver / portallocator / portallocator.go可以知道docker的動態范圍埠從 49153-65535
const (
BeginPortRange = 49153
EndPortRange = 65535
)
分配埠的方式順序遞增,到最大值后,從頭開始回圈
func nextPort(proto string) int {
c := currentDynamicPort[proto] + 1
if c > EndPortRange {
c = BeginPortRange
}
currentDynamicPort[proto] = c
return c
}
container銷毀時,會釋放埠
func ReleasePort(ip net.IP, proto string, port int) error {
.......
allocated := defaultAllocatedPorts[proto]
allocated.Remove(port)
.......
}
findNextPort方法從nexPort方法回傳的值中,挑一個沒被使用的,如果找一圈沒找到,拋出ErrAllPortsAllocated例外。
func findNextPort(proto string, allocated *collections.OrderedIntSet) (int, error) {
port := nextPort(proto)
startSearchPort := port
for allocated.Exists(port) {
port = nextPort(proto)
if startSearchPort == port {
return 0, ErrAllPortsAllocated
}
}
return port, nil
}
綜上,埠實際上已經釋放,但不會馬上再使用,除非埠資源非常緊張。
所以你看到的是正常情況,不用但心(前提是你需要用v0.10以上版本)。
回圈使用埠這個特性是v0.10版本加上的。 如果低于這個版本,埠號到EndPortRange后,就只能重啟Docker了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/105595.html
標籤:Docker
上一篇:docker中的image如何讓多個tag鏈接到同一個id上
下一篇:如何限制容器的記憶體大小
