Ajuste del Kernel con Contenedor Docker Privilegiado

Estoy construyendo un contenedor para ajustar la configuración del kernel para un equilibrador de carga. Prefiero implementar esos cambios en el host en una imagen utilizando un único contenedor privilegiado. Por ejemplo:

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

En las pruebas, los cambios surten efecto, pero solo para ese contenedor. Tenía la impresión de que con un contenedor con privilegios completos, los cambios en /proc realmente cambiarían el sistema operativo subyacente.

$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

¿Es así como se supone que funcionan los contenedores con privilegios?

¿Estoy haciendo algo tonto?

¿Cuál es la mejor manera de hacer cambios duraderos?

Información de la Versión:

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

Ejemplo de comando con mounted /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

Esta configuración en particular está bajo la influencia del espacio de nombres de red en el que se ejecuta Docker.

Como regla general /proc altera la configuración que es relevante en todo el sistema, técnicamente hablando, sin embargo, está alterando la configuración en /proc/net que devuelve resultados por espacio de nombres de red.

Tenga en cuenta que /proc/net es en realidad un enlace simbólico a /proc/self/net ya que realmente refleja la configuración del espacio de nombres en el que está realizando el trabajo.

Docker 1.12+ tiene soporte nativo para ajustar los valores de sysctl dentro de los contenedores. Aquí hay un extracto de la documentación:

Configurar parámetros de kernel con espacio de nombres (sysctls) en tiempo de ejecución

El --sysctl establece parámetros de kernel con espacio de nombres (sysctls) en el contenedor. Por ejemplo, para activar el reenvío de IP en el espacio de nombres de red de contenedores, ejecute este comando:

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

Usando su ejemplo, la forma correcta de aumentar net.core.somaxconn sería:

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

El contenedor con privilegios sigue utilizando su propio espacio de nombres de proceso para /proc. Lo que puedes hacer es montar lo real /proc dentro del contenedor:

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

Esto funciona para mí con Docker 1.5.0:

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

¿Necesito hacer algo tonto como mount / proc como un volumen?

Intenté montar /proc:/proc sin suerte. Las llamadas posteriores a sysctl-a devuelven los valores originales.

Parece que ahora funciona en Docker 18.09