2014-10-16 14 views
13

Używam serwera WWW, który obsługuje wiele tysięcy jednoczesnych połączeń z gniazdami sieciowymi. Aby było to możliwe, na Linuxie Debiana (mój podstawowy obraz to google/debian: wheezy, działający na GCE), gdzie domyślna liczba otwartych plików jest ustawiona na 1000, zwykle ustawię ulimit na pożądaną liczbę (64 000) .Docker Ignoruje limits.conf (próbuje rozwiązać błąd "zbyt wielu otwartych plików")

To działa świetnie, z wyjątkiem tego, że po dokowaniu mojej aplikacji i wdrożeniu jej - dowiedziałem się, że rodzaj dokera ignoruje definicje limitów. Próbowałem następujące (wszystko na komputerze hosta, a nie od samego pojemnika):

MAX=64000 
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile" 
ulimit -c $MAX 

Po wykonaniu kilku badań okazało się, że ludzie byli w stanie rozwiązać podobny problem, wykonując to:

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf" 

i ponowne uruchamianie/ponowne uruchamianie usługi dokowania.

Jednak wszystkie powyższe błędy nie powiodą się: Otrzymuję komunikat "zbyt wiele otwartych plików", gdy moja aplikacja działa w kontenerze (wykonanie następujących czynności bez dokowania rozwiązuje problem).

Próbowałem uruchomić ulimit -a wewnątrz kontenera, aby uzyskać wskazanie, czy konfiguracja ulimit działała, ale powoduje to błąd powodujący, że ulimit nie jest plikiem wykonywalnym, który jest częścią zmiennej PATH.

Ktoś wpadł na to i/lub może zasugerować sposób, aby uzyskać dokowanie, aby rozpoznać ograniczenia?

Odpowiedz

9

Mogłem mitgiate ten problem z następującej konfiguracji:

używałem Ubuntu 14.04 Linux na maszynie Döcker i komputera hosta.

na hoście maszynie musisz:

  • aktualizacji /etc/security/limits.conf obejmuje: * - nofile 64000
  • dodać do /etc/sysctl.conf: fs.file-max = 64000
  • restart sysctl: sudo sysctl -p
+4

Pamiętaj, aby ponownie uruchomić usługę demona Docker! – cgp

1

Dzięki funkcji dokowania można skonfigurować ulimity.

https://docs.docker.com/compose/compose-file/#ulimits

Możesz dodać miękki/twardy limitów odwzorowania.

ulimits: 
    nproc: 65535 
    nofile: 
    soft: 20000 
    hard: 40000 

Chociaż nie można uruchomić idealny pojemnik z uprzywilejowanej opcji (głównie na szybki non-optymalne rozwiązanie dla środowiska Dev nie jest zalecane, jeśli bezpieczeństwo jest problemem).

docker run --privileged 

proszę zobaczyć:

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

+0

To jest okropny pomysł. –

2

Możesz przekazać limit jako argument podczas uruchamiania kontenera. W ten sposób nie trzeba modyfikować limitów hosta i przekazywać zbyt wiele energii do kontenera.Oto, jak:

docker run --ulimit nofile=5000:5000 <image-tag> 
Powiązane problemy