GNU/Linux >> Belajar Linux >  >> Linux

Segarkan net.core.somaxcomm (atau properti sysctl apa pun) untuk wadah buruh pelabuhan

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.

  1. gunakan "--net host" saat menjalankan penampung, sehingga menggunakan antarmuka jaringan host dan karenanya berbagi ruang nama jaringan yang sama.

  2. 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'

Linux
  1. 10 panduan kontainer untuk sysadmin

  2. pengaturan sysctl untuk beban tinggi dan mencegah DDoS

  3. Bagaimana cara menentukan nama host untuk wadah yang sedang berjalan?

  1. Apa itu Docker Container:Panduan Pengantar untuk Pemula

  2. 7 fitur wadah/transportasi gambar Linux yang menyenangkan

  3. Cara Mendaftar Kontainer Docker

  1. Traefik untuk Wadah Docker di Ubuntu

  2. NuGet untuk .NET Core di Linux

  3. .NET Core build in docker linux container gagal karena autentikasi SSL ke Nuget