tag puddletag picard para musicbrainz mp3tag kid3 easytag linux docker elastic-beanstalk sysctl

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.

  1. 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.

  2. 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 y sudo docker run nuevamente
  • Reiniciando todo el servicio de la sudo service docker restart mediante el sudo 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.



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.