GNU/Linux >> Linux Esercitazione >  >> Linux

Aggiorna net.core.somaxcomm (o qualsiasi proprietà sysctl) per i contenitori docker

Il sottosistema "net/core" è registrato per spazio dei nomi di rete. E il valore iniziale per somaxconn è impostato su 128.

Quando esegui sysctl sul sistema host, imposta i parametri principali per its spazio dei nomi di rete, che è quello di proprietà di init . (in pratica questo è lo spazio dei nomi predefinito). Ciò non influisce sugli altri spazi dei nomi di rete.

Quando viene avviato un contenitore Docker, l'interfaccia di rete virtuale (visualizzata come vethXXX sull'host) di quel contenitore è collegato al proprio spazio dei nomi, che ha ancora il valore iniziale somaxconn di 128. Quindi, tecnicamente, non puoi propagare questo valore nel contenitore, poiché i due spazi dei nomi di rete non lo condividono.

Esistono, tuttavia, due modi per regolare questo valore, oltre all'esecuzione del contenitore in modalità privilegiata.

  1. usa "--net host" durante l'esecuzione del contenitore, in modo che utilizzi l'interfaccia di rete dell'host e quindi condivida lo stesso spazio dei nomi di rete.

  2. puoi montare il file system proc come lettura-scrittura utilizzando il supporto per la mappatura del volume di Docker. il trucco è mapparlo su un volume NON denominato "/proc", poiché Docker rimonterà /proc/sys, tra gli altri, come di sola lettura per i contenitori non privilegiati. Ciò richiede che l'host monti /proc come rw, come accade nella maggior parte dei sistemi.

    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
    

Il metodo 2 dovrebbe funzionare su Elastic Beanstalk tramite il supporto per la mappatura dei volumi in Dockerrun.aws.json. Inoltre dovrebbe funzionare per altri parametri sintonizzabili in /proc che è per spazio dei nomi. Ma questa è molto probabilmente una svista da parte di Docker, quindi potrebbero aggiungere ulteriore convalida sulla mappatura del volume e questo trucco non funzionerà.


Aggiornamento:questa risposta è obsoleta poiché Docker ora supporta docker run --sysctl opzione!

La soluzione che utilizzo per il mio contenitore OpenVPN è inserire lo spazio dei nomi del contenitore con tutte le funzionalità utilizzando nsenter , rimontando /proc/sys read-write temporaneamente, impostando cose e rimontandole di nuovo in sola lettura.

Ecco un esempio, abilitando l'inoltro IPv6 nel contenitore:

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'

In questo modo il contenitore non deve essere eseguito con privilegi.


docker 1.12 aggiunge il supporto per l'impostazione di sysctls con --sysctl.

docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis

documenti:https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime


Ho trovato una soluzione:

{
    "AWSEBDockerrunVersion": "1",
    "Command": "run COMMAND",
    "Image": {
        "Name": "crystalnix/omaha-server",
        "Update": "true"
    },
    "Ports": [
        {
            "ContainerPort": "80"
        }
    ]
}

maggiori dettagli qui:/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh

Aggiornamento:

Aggiungi il 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. Che cos'è un contenitore Docker:una guida introduttiva per principianti

  2. 10 guide ai contenitori per gli amministratori di sistema

  3. Come elencare i contenitori Docker

  4. NuGet per .NET Core in Linux

  5. La compilazione di .NET Core nel contenitore linux docker non riesce a causa dell'autenticazione SSL a Nuget

Procedura:Introduzione a Windows Containers e Docker

Come gestire i container Docker

Introduzione a .NET Core e Docker e al registro dei contenitori Microsoft

.NET Core e Docker

.NET e Docker

Esplorazione di ASP.NET Core con Docker in entrambi i contenitori Linux e Windows