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: