linux - puddletag - Actualice net.core.somaxcomm(o cualquier propiedad de sysctl) para contenedores docker
musicbrainz picard (6)
El subsistema "net / core" se registra por espacio de nombres de red . Y el valor inicial para somaxconn se establece en 128.
Cuando hace sysctl en el sistema host, establece los parámetros centrales para su espacio de nombres de red, que es el que pertenece a init . (Básicamente este es el espacio de nombres predeterminado). Esto no afecta a otros espacios de nombres de red.
Cuando se inicia un contenedor Docker, la interfaz de red virtual (que se muestra como vethXXX en el host) de ese contenedor se adjunta a su propio espacio de nombres , que aún tiene el valor de somaxconn inicial de 128. Por lo tanto, técnicamente, no puede propagar este valor en el contenedor, ya que los dos espacios de nombres de red no lo comparten.
Sin embargo, hay dos formas de ajustar este valor, además de ejecutar el contenedor en modo privilegiado.
use "--net host" cuando ejecute el contenedor, de modo que use la interfaz de red del host y, por lo tanto, comparta el mismo espacio de nombres de red.
puede montar el sistema de archivos proc como lectura-escritura utilizando el soporte de mapeo de volumen de Docker. el truco consiste en asignarlo a un volumen que NO se llame "/ proc", ya que Docker volverá a montar / proc / sys, entre otros, como de solo lectura para contenedores sin privilegios . Esto requiere que el host monte / proc como rw, que es el caso en la mayoría de los sistemas.
docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash root@edbee3de0761:/# echo 1024 > /writable-proc/sys/net/core/somaxconn root@edbee3de0761:/# sysctl net.core.somaxconn net.core.somaxconn = 1024
El método 2 debería funcionar en Elastic Beanstalk a través de su soporte de mapeo de volumen en Dockerrun.aws.json . También debería funcionar para otros parámetros ajustables bajo / proc que es por espacio de nombres. Pero lo más probable es que esto sea un descuido por parte de Docker, por lo que pueden agregar validación adicional en la asignación de volúmenes y este truco no funcionará en ese momento.
Estoy intentando cambiar net.core.somaxconn
para que el contenedor de la net.core.somaxconn
acoplable pueda tener una cola más grande de solicitudes para mi aplicación web.
En el sistema operativo, fuera de la ventana acoplable, primero modifico la propiedad con éxito:
$ cat /proc/sys/net/core/somaxconn
128
$ sudo sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
$ cat /proc/sys/net/core/somaxconn
1024
Pero entonces no sé cómo propagar ese cambio en la ventana acoplable. He intentado:
- También editando
/etc/sysctl.conf
(con la esperanza de que la ventana acoplable lea ese archivo en el lanzamiento del contenedor) - Reiniciando los contenedores
sudo docker stop
ysudo docker run
nuevamente - Reiniciando todo el servicio de la
sudo service docker restart
mediante elsudo service docker restart
Pero dentro del contenedor, cat /proc/sys/net/core/somaxconn
siempre muestra 128
.
Estoy ejecutando la ventana acoplable 1.2 (por lo que no puedo, por defecto, modificar los atributos /proc
dentro del contenedor) y en Elastic Beanstalk (por lo tanto, sin el modo --privileged
, eso me permitiría modificar /proc
).
¿Cómo puedo propagar los cambios de sysctl a la ventana acoplable?
En docker 3.1 hay soporte para especificar sysctl. nota la
sysctls:
- net.core.somaxconn = 1024
Mi ejemplo docker-compose file
version: ''3.1''
services:
my_redis_master:
image: redis
restart: always
command: redis-server /etc/redis/redis.conf
volumes:
- /data/my_dir/redis:/data
- /data/my_dir/logs/redis:/var/tmp/
- ./redis/redis-master.conf:/etc/redis/redis.conf
sysctls:
- net.core.somaxconn=1024
ports:
- "18379:6379"
Encontré una solución:
{
"AWSEBDockerrunVersion": "1",
"Command": "run COMMAND",
"Image": {
"Name": "crystalnix/omaha-server",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "80"
}
]
}
Más detalles aquí: /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh
Actualizar:
Añadir archivo .ebextensions/02-commands.config
container_commands:
00001-docker-privileged:
command: ''sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh''
Simplemente descubrí cómo resolver esto, ahora Elastic Beanstalk admite la ejecución de contenedores privilegiados y solo necesitas agregar "privileged": "true"
a tu Dockerrun.aws.json
como la siguiente muestra (por favor, echa un vistazo al container-1
):
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [{
"name": "container-0",
"essential": "false",
"image": "ubuntu",
"memory": "512"
}, {
"name": "container-1",
"essential": "false",
"image": "ubuntu",
"memory": "512",
"privileged": "true"
}]
}
Tenga en cuenta que he duplicado esta respuesta de otro hilo.
la ventana acoplable 1.12 agrega soporte para configurar sysctls con --sysctl.
docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis
Actualización: esta respuesta es obsoleta, ya que Docker ahora admite la opción de docker run --sysctl
.
La solución que utilizo para mi contenedor OpenVPN es ingresar al espacio de nombres del contenedor con todas las capacidades usando nsenter
, remontar temporalmente /proc/sys
lectura-escritura, configurar cosas y volver a montarlo de solo lectura nuevamente.
Aquí un ejemplo, habilitando el reenvío de IPv6 en el contenedor:
CONTAINER_NAME=openvpn
# enable ipv6 forwarding via nsenter
container_pid=`docker inspect -f ''{{.State.Pid}}'' $CONTAINER_NAME`
nsenter --target $container_pid --mount --uts --ipc --net --pid /
/bin/sh -c ''/usr/bin/mount /proc/sys -o remount,rw;
/usr/sbin/sysctl -q net.ipv6.conf.all.forwarding=1;
/usr/bin/mount /proc/sys -o remount,ro;
/usr/bin/mount /proc -o remount,rw # restore rw on /proc''
De esta manera el contenedor no necesita ejecutarse con privilegios.