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 usando un solo contenedor privilegiado. Por ejemplo:
docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535
En la prueba, los cambios surten efecto pero solo para ese contenedor. Tenía la impresión de que con un contenedor totalmente privilegiado, los cambios en / proc cambiarían el SO subyacente.
$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
¿Es así como se supone que funcionan los contenedores privilegiados?
¿Estoy haciendo algo tonto?
¿Cuál es la mejor manera de hacer cambios duraderos?
Información de la versión:
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
Comando de ejemplo con 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
Respuestas:
Esta configuración particular cae 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 la/proc/net
que se obtienen resultados en función del espacio de nombres por red.Tenga en cuenta que en
/proc/net
realidad es un enlace simbólico,/proc/self/net
ya que realmente refleja la configuración del espacio de nombres en el que está haciendo el trabajo.fuente
Docker 1.12+ tiene soporte nativo para ajustar los valores de sysctl dentro de los contenedores. Aquí hay un extracto de la documentación :
Usando su ejemplo, la forma correcta de subir
net.core.somaxconn
sería:fuente
El contenedor privilegiado todavía está utilizando su propio espacio de nombres de proceso
/proc
. Lo que puedes hacer es montar lo real/proc
dentro del contenedor:fuente
Esto funciona para mí con Docker 1.5.0:
fuente