Penyetelan Kernel dengan wadah Docker istimewa

Saya sedang membangun wadah untuk menyetel pengaturan kernel untuk penyeimbang beban. Saya lebih suka menerapkan perubahan tersebut ke host dalam gambar menggunakan satu wadah istimewa. Misalnya:

docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535

Dalam pengujian perubahan berlaku tetapi hanya untuk wadah itu. Saya mendapat kesan bahwa dengan wadah yang sepenuhnya istimewa, perubahan ke /proc akan benar-benar mengubah OS yang mendasarinya.

$docker run --rm --privileged ubuntu:latest \    sysctl -w net.core.somaxconn=65535net.core.somaxconn = 65535$ docker run --rm --privileged ubuntu:latest \    /bin/bash -c "sysctl -a | grep somaxconn"net.core.somaxconn = 128

Apakah ini cara kerja wadah istimewa?

Apakah saya hanya melakukan sesuatu yang konyol?

Apa cara terbaik untuk membuat perubahan yang langgeng?

Info Versi:

Client version: 1.4.1Client API version: 1.16Go version (client): go1.3.3Git commit (client): 5bc2ff8OS/Arch (client): linux/amd64Server version: 1.4.1Server API version: 1.16Go version (server): go1.3.3Git commit (server): 5bc2ff8

Contoh perintah dengan Mount / proc:

$ docker run -v /proc:/proc ubuntu:latest \    /bin/bash -c "sysctl -a | grep local_port"net.ipv4.ip_local_port_range = 32768    61000$ docker run -v /proc:/proc --privileged ubuntu:latest \    /bin/bash -c "sysctl -p /updates/sysctl.conf"net.ipv4.ip_local_port_range = 2000 65000$ docker run -v /proc:/proc ubuntu:latest \    /bin/bash -c "sysctl -a | grep local_port"net.ipv4.ip_local_port_range = 32768    61000$ docker run -v /proc:/proc --privileged ubuntu:latest \    /bin/bash -c "sysctl -a | grep local_port"net.ipv4.ip_local_port_range = 32768    61000

Pengaturan khusus ini berada di bawah pengaruh namespace jaringan tempat docker berjalan.

Sebagai aturan umum /proc apakah mengubah pengaturan yang relevan di seluruh sistem, secara teknis namun Anda mengubah pengaturan di /proc/net yang mengembalikan hasil pada basis namespace per jaringan.

Perhatikan bahwa /proc/net sebenarnya adalah symlink ke /proc/self/net karena itu benar-benar mencerminkan pengaturan namespace tempat anda melakukan pekerjaan.

Docker 1.12 + memiliki dukungan asli untuk mengutak-atik nilai sysctl di dalam wadah. Berikut adalah kutipan dari dokumentasi:

Mengkonfigurasi parameter kernel namespaced (sysctls) saat runtime

The -- sysctl set namespaced parameter kernel (sysctls) dalam wadah. Misalnya, untuk mengaktifkan penerusan IP di namespace jaringan kontainer, jalankan perintah ini:

docker run --sysctl net.ipv4.ip_forward=1 someimage

Menggunakan contoh Anda, cara yang benar untuk meningkatkan net.core.somaxconn akan menjadi:

docker run ... --sysctl net.core.somaxconn=65535 ...

Wadah istimewa masih menggunakan namespace prosesnya sendiri untuk /proc. Apa yang dapat Anda lakukan adalah untuk me-mount nyata /proc di dalam wadah:

docker run --rm --privileged -v /proc:/host-proc ubuntu:latest \  'echo 65535 > /host-proc/sys/net/core/somaxconn'

Ini bekerja untuk saya dengan Docker 1.5.0:

docker run --privileged --net=host --rm ubuntu:latest /bin/sh -c \   'echo 65535 > /proc/sys/net/core/somaxconn'   

Apakah saya perlu melakukan sesuatu yang konyol seperti mount /proc sebagai volume?

Mencoba pemasangan / proc: / proc tidak berhasil. Panggilan berikutnya ke sysctl-a mengembalikan nilai asli.

Sepertinya sekarang ini berfungsi di Docker 18.09