GNU/Linux >> Znalost Linux >  >> Linux

Obnovte net.core.somaxcomm (nebo jakoukoli vlastnost sysctl) pro kontejnery dokovacích stanic

Subsystém "net/core" je registrován pro síťový jmenný prostor. A počáteční hodnota pro somaxconn je nastavena na 128.

Když na hostitelském systému provedete sysctl, nastaví základní parametry pro jeho jmenný prostor sítě, který vlastní init . (v podstatě se jedná o výchozí jmenný prostor). Toto neovlivní ostatní síťové jmenné prostory.

Po spuštění kontejneru Docker se rozhraní virtuální sítě (zobrazí se jako vethXXX na hostiteli) tohoto kontejneru je připojen ke svému vlastnímu jmennému prostoru, který má stále počáteční hodnotu somaxconn 128. Technicky tedy nemůžete propagovat tuto hodnotu do kontejneru, protože ji dva síťové jmenné prostory nesdílejí.

Existují však dva způsoby, jak můžete tuto hodnotu upravit, kromě spuštění kontejneru v privilegovaném režimu.

  1. při spouštění kontejneru použijte "--net host", takže používá síťové rozhraní hostitele a sdílí tedy stejný síťový jmenný prostor.

  2. můžete připojit systém souborů proc jako čtení a zápis pomocí podpory mapování svazků Docker. trik je namapovat jej na svazek, který NENÍ pojmenován "/proc", protože Docker mimo jiné znovu připojí /proc/sys jako pouze pro čtení pro neprivilegované kontejnery. To vyžaduje, aby hostitel připojil /proc jako rw, což je případ většiny systémů.

    docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash
    [email protected]:/# echo 1024 > /writable-proc/sys/net/core/somaxconn
    [email protected]:/# sysctl net.core.somaxconn
    net.core.somaxconn = 1024
    

Metoda 2 by měla fungovat na Elastic Beanstalk prostřednictvím podpory mapování svazků v Dockerrun.aws.json. Také by to mělo fungovat pro další laditelné parametry pod /proc, což je pro jmenný prostor. Ale to je s největší pravděpodobností přehlédnutí ze strany Dockera, takže mohou přidat další ověření na mapování objemu a tento trik pak nebude fungovat.


Aktualizace:Tato odpověď je zastaralá, protože Docker nyní podporuje docker run --sysctl možnost!

Řešení, které používám pro svůj kontejner OpenVPN, je zadat jmenný prostor kontejneru s plnými možnostmi pomocí nsenter , opětovná montáž /proc/sys dočasně čtení a zápis, nastavení a opětovné připojení pouze pro čtení.

Zde je příklad povolení předávání IPv6 v kontejneru:

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'

Tímto způsobem kontejner nemusí běžet privilegovaně.


docker 1.12 přidává podporu pro nastavení sysctls pomocí --sysctl.

docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis

dokumenty:https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime


Našel jsem řešení:

{
    "AWSEBDockerrunVersion": "1",
    "Command": "run COMMAND",
    "Image": {
        "Name": "crystalnix/omaha-server",
        "Update": "true"
    },
    "Ports": [
        {
            "ContainerPort": "80"
        }
    ]
}

více podrobností zde:/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh

Aktualizace:

Přidejte soubor .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'

Linux
  1. nastavení sysctl pro vysokou zátěž a zabránění DDoS

  2. NuGet pro .NET Core na Linuxu

  3. Jak zadat název hostitele pro běžící kontejner?

  1. Co je Docker Container:Úvodní příručka pro začátečníky

  2. 10 průvodců kontejnerů pro systémové správce

  3. 7 zábavných funkcí pro přenos kontejnerů/obrázků v Linuxu

  1. Traefik pro Docker Containers na Ubuntu

  2. Jak vypsat Docker kontejnery

  3. Sestavení .NET Core v linuxovém kontejneru dockeru se nezdaří kvůli ověření SSL pro Nuget