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: