docker - 容器删除后,主机映射给容器的端口为何并立即未回收利用?
阿神
阿神 2017-04-21 10:55:34
0
1
908

新建容器时映射某些端口,如下:

docker run -d -p 22 -p 80 ubuntu /usr/sbin/sshd -D

主机将自动给容器的22和80映射两个端口,如:
0.0.0.0:49155->22/tcp, 0.0.0.0:49156->80/tcp
当该容器停止并且删除后,49155和49156这两个主机端口应该被释放,留给新的容器使用,但实际此时再新建容器映射端口发现,这两并未使用,而是系统自动分配这俩端口后面新的端口,比如49157...
只有docker服务重启后原来空出来的端口才会被分配。在三台不同的docker主机上做实验都是如此,貌似不是我配置的问题,不知大家的环境如何?求解!

阿神
阿神

闭关修行中......

membalas semua(1)
Peter_Zhu

Anda boleh mengetahui dengan melihat kod sumberdocker / runtime / networkdriver / portallocator / portallocator.go
Port julat dinamik Docker ialah dari 49153-65535

const (
    BeginPortRange = 49153
    EndPortRange   = 65535
)

Kaedah memperuntukkan port meningkat secara berurutan Selepas mencapai nilai maksimum, kitaran bermula dari awal

func nextPort(proto string) int {
    c := currentDynamicPort[proto] + 1
    if c > EndPortRange {
        c = BeginPortRange
    }
    currentDynamicPort[proto] = c
    return c
}

Apabila kontena dimusnahkan, pelabuhan akan dilepaskan

func ReleasePort(ip net.IP, proto string, port int) error {
    .......

    allocated := defaultAllocatedPorts[proto]
    allocated.Remove(port)

    .......
}
Kaedah

findNextPort memilih nilai yang tidak digunakan daripada nilai yang dikembalikan oleh kaedah nexPort Jika nilai itu tidak ditemui selepas mencarinya, pengecualian ErrAllPortsAllocated dilemparkan.

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
}

Ringkasnya, port sebenarnya telah dikeluarkan, tetapi tidak akan digunakan semula serta-merta melainkan sumber port sangat ketat.
Jadi apa yang anda lihat adalah perkara biasa, jangan risau (dengan syarat anda perlu menggunakan versi v0.10 ke atas).
Ciri port kitar semula telah ditambahkan dalam versi v0.10. Jika ia lebih rendah daripada versi ini, selepas nombor port mencapai EndPortRange, anda hanya boleh memulakan semula Docker

Rujukan: https://github.com/dotcloud/docker/pull/4949

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan