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
No teste, as alterações entram em vigor, mas apenas para esse contêiner. Fiquei com a impressão de que, com um contêiner totalmente privilegiado, as alterações em / proc realmente alterariam o SO 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 recipientes privilegiados devem funcionar?
Estou apenas fazendo algo bobo?
Qual é a melhor maneira de fazer mudanças duradouras?
Informação 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 / 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
Respostas:
Essa configuração específica está sob a influência do namespace de rede em que o docker é executado.
Como regra geral
/proc
, as configurações são relevantes para todo o sistema; tecnicamente, porém, você está alterando as configurações nas/proc/net
quais retorna resultados com base no namespace da rede.Observe que,
/proc/net
na verdade, é um link simbólico/proc/self/net
, pois realmente reflete as configurações do espaço para nome em que você está realizando o trabalho.fonte
O Docker 1.12+ tem suporte nativo para ajustar valores sysctl dentro dos contêineres. Aqui está um trecho da documentação :
Usando seu exemplo, a maneira correta de aumentar
net.core.somaxconn
seria:fonte
O contêiner privilegiado ainda está usando seu próprio espaço para nome de processo
/proc
. O que você pode fazer é montar o real/proc
dentro do contêiner:fonte
Isso funciona para mim com o Docker 1.5.0:
fonte