Maison > Questions et réponses > le corps du texte
新建容器时映射某些端口,如下:
主机将自动给容器的22和80映射两个端口,如:
0.0.0.0:49155->22/tcp, 0.0.0.0:49156->80/tcp
当该容器停止并且删除后,49155和49156这两个主机端口应该被释放,留给新的容器使用,但实际此时再新建容器映射端口发现,这两并未使用,而是系统自动分配这俩端口后面新的端口,比如49157...
只有docker服务重启后原来空出来的端口才会被分配。在三台不同的docker主机上做实验都是如此,貌似不是我配置的问题,不知大家的环境如何?求解!
天蓬老师2017-04-21 10:57:34
Vous pouvez le savoir en consultant le code sourcedocker / runtime / networkdriver / portallocator / portallocator.go
Le port de plage dynamique de Docker est de 49153 à 65535
const (
BeginPortRange = 49153
EndPortRange = 65535
)
La méthode d'attribution des ports augmente séquentiellement après avoir atteint la valeur maximale, le cycle recommence depuis le début
func nextPort(proto string) int {
c := currentDynamicPort[proto] + 1
if c > EndPortRange {
c = BeginPortRange
}
currentDynamicPort[proto] = c
return c
}
Lorsque le conteneur est détruit, le port sera libéré
func ReleasePort(ip net.IP, proto string, port int) error {
.......
allocated := defaultAllocatedPorts[proto]
allocated.Remove(port)
.......
}
La méthode findNextPort
sélectionne une valeur inutilisée parmi la valeur renvoyée par la méthode nexPort
Si la valeur n'est pas trouvée après l'avoir recherchée, une exception ErrAllPortsAllocated
est levée.
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
}
Pour résumer, le port a effectivement été libéré, mais ne sera pas réutilisé immédiatement à moins que les ressources portuaires ne soient très limitées.
Donc ce que vous voyez est normal, ne vous inquiétez pas (à condition que vous deviez utiliser la version v0.10 ou supérieure).
La fonctionnalité de recyclage des ports a été ajoutée dans la version v0.10. S'il est inférieur à cette version, une fois que le numéro de port atteint EndPortRange
, vous ne pouvez redémarrer Docker que
Référence : https://github.com/dotcloud/docker/pull/4949