Ajuste do Kernel com contêiner Docker privilegiado

Estou construindo um contêiner para ajustar as configurações do kernel para um balanceador de carga. Eu preferiria implantar essas alterações no host em uma imagem usando um único contêiner privilegiado. Por exemplo:

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

Ao testar as mudanças entram em vigor, mas apenas para esse contêiner. Eu estava com a impressão de que, com um contêiner totalmente privilegiado, as alterações em / proc realmente mudariam o sistema operacional subjacente.

$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

É assim que os contêineres privilegiados devem funcionar?

Estou apenas fazendo algo bobo?

Qual é a melhor maneira de fazer mudanças duradouras?

Informações Da Versão:

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

Comando de exemplo com montado / 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

Essa configuração específica está sob a influência do namespace de rede no qual o docker é executado.

Como regra geral /proc altera as configurações relevantes em todo o sistema, tecnicamente falando, mas você está alterando as configurações em /proc/net que retorna resultados em uma base de namespace por rede.

Notar /proc/net na verdade, é um link simbólico para /proc/self/net como realmente reflete as configurações do namespace em que você está fazendo o trabalho.

O Docker 1.12 + tem suporte nativo para ajustar os valores sysctl dentro dos contêineres. Aqui está um trecho do documentacao:

Configurar parâmetros do kernel namespaced (sysctls) em tempo de execução

O -- sysctl define parâmetros do kernel namespaced (sysctls) no contêiner. Por exemplo, para ativar o encaminhamento de IP no namespace de rede de contêineres, execute este comando:

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

Usando seu exemplo, a maneira correta de aumentar net.core.somaxconn seria:

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

O contêiner privilegiado ainda está usando seu próprio namespace de processo para /proc. O que você pode fazer é montar o real /proc dentro do recipiente:

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

Isso funciona para mim com Docker 1.5.0:

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

Preciso fazer algo bobo como mount / proc como um volume?

Tentei montar / proc: / proc sem sorte. Chamadas subsequentes para sysctl-a retornam os valores originais.

Parece que agora funciona no Docker 18.09