Ajuste do Kernel com Contêiner de Docker Privilegiado

9

Estou criando um contêiner para ajustar as configurações do kernel para um balanceador de carga. Eu prefiro 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

No teste, as alterações são efetivadas, mas apenas para esse contêiner. Fiquei com a impressão de que, com um contêiner totalmente privilegiado, alterações em / proc realmente alterariam o sistema operacional subjacente.

$docker run --rm --privileged ubuntu:latest \
    sysctl -w net.core.somaxconn=65535
net.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 funcionam?

Estou apenas fazendo algo bobo?

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

Informações da versão:

Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): linux/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8

Exemplo de comando com o / proc montado:

$ 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
    
por allingeek 03.02.2015 / 12:57

4 respostas

8

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

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

Observe que /proc/net é, na verdade, um link simbólico para /proc/self/net , pois realmente reflete as configurações do namespace no qual você está trabalhando.

    
por 03.02.2015 / 13:20
7

O Docker 1.12+ tem suporte nativo para ajustes de valores de sysctl dentro dos contêineres. Veja um trecho da documentação :

Configure namespaced kernel parameters (sysctls) at runtime

The --sysctl sets namespaced kernel parameters (sysctls) in the container. For example, to turn on IP forwarding in the containers network namespace, run this command:

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 ...
    
por 26.07.2016 / 15:40
3

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

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

Isso funciona para mim com o Docker 1.5.0:

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