Subsys "net/core" didaftarkan per ruang nama jaringan. Dan nilai awal untuk somaxconn disetel ke 128.
Saat Anda melakukan sysctl pada sistem host, sistem ini menetapkan parameter inti untuk nya ruang nama jaringan, yang dimiliki oleh init . (pada dasarnya ini adalah namespace default). Ini tidak memengaruhi ruang nama jaringan lain.
Saat wadah Docker dimulai, antarmuka jaringan virtual (muncul sebagai vethXXX pada host) wadah itu dilampirkan ke ruang namanya sendiri, yang masih memiliki nilai somaxconn awal 128. Jadi secara teknis, Anda tidak dapat menyebarkan nilai ini ke dalam penampung, karena dua ruang nama jaringan tidak membagikannya.
Namun, ada dua cara untuk menyesuaikan nilai ini, selain menjalankan penampung dalam mode istimewa.
-
gunakan "--net host" saat menjalankan penampung, sehingga menggunakan antarmuka jaringan host dan karenanya berbagi ruang nama jaringan yang sama.
-
Anda dapat memasang sistem file proc sebagai baca-tulis menggunakan dukungan pemetaan volume Docker. triknya adalah dengan memetakannya ke volume yang TIDAK bernama "/proc", karena Docker akan me-remount /proc/sys, antara lain, sebagai read-only untuk kontainer yang tidak memiliki hak istimewa. Ini mengharuskan host untuk me-mount /proc sebagai rw, yang merupakan kasus pada sebagian besar sistem.
docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash [email protected]:/# echo 1024 > /writable-proc/sys/net/core/somaxconn [email protected]:/# sysctl net.core.somaxconn net.core.somaxconn = 1024
Metode 2 harus bekerja pada Elastic Beanstalk melalui dukungan pemetaan volumenya di Dockerrun.aws.json. Juga harus bekerja untuk parameter merdu lainnya di bawah /proc itu per-namespace. Tapi ini kemungkinan besar merupakan kekeliruan di pihak Docker sehingga mereka dapat menambahkan validasi tambahan pada pemetaan volume dan trik ini tidak akan berfungsi.
Pembaruan:Jawaban ini sudah usang karena Docker sekarang mendukung docker run --sysctl
opsi!
Solusi yang saya gunakan untuk container OpenVPN saya adalah dengan memasukkan namespace container dengan kemampuan penuh menggunakan nsenter
, memasang ulang /proc/sys
baca-tulis sementara, menyiapkan barang dan memasangnya kembali hanya-baca.
Berikut contohnya, mengaktifkan penerusan IPv6 dalam wadah:
CONTAINER_NAME=openvpn
# enable ipv6 forwarding via nsenter
container_pid=`docker inspect -f '{{.State.Pid}}' $CONTAINER_NAME`
nsenter --target $container_pid --mount --uts --ipc --net --pid \
/bin/sh -c '/usr/bin/mount /proc/sys -o remount,rw;
/usr/sbin/sysctl -q net.ipv6.conf.all.forwarding=1;
/usr/bin/mount /proc/sys -o remount,ro;
/usr/bin/mount /proc -o remount,rw # restore rw on /proc'
Dengan cara ini penampung tidak perlu dijalankan dengan hak istimewa.
docker 1.12 menambahkan dukungan untuk menyetel sysctl dengan --sysctl.
docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis
dokumen:https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime
Saya menemukan solusinya:
{
"AWSEBDockerrunVersion": "1",
"Command": "run COMMAND",
"Image": {
"Name": "crystalnix/omaha-server",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "80"
}
]
}
detail lebih lanjut di sini:/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh
Perbarui:
Tambahkan file .ebextensions/02-commands.config
container_commands:
00001-docker-privileged:
command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh'