Skip to main content

Ulimit | Docker

  • Ulimit | Docker

Ulimit no Docker

O ulimit define limites de recursos no nível do sistema operacional para processos em execução (ex: número máximo de arquivos abertos, processos, memória travada, etc). No Docker, esses limites podem ser configurados para containers, garantindo controle de consumo de recursos e evitando impactos no host.


O que é ulimit

O ulimit é um mecanismo do Linux baseado em RLIMIT, que controla recursos por processo.

Alguns limites comuns:

| Limite | Descrição | |--------|-----------| nofile | Número máximo de arquivos abertos | | nproc | Número máximo de processos | | core | Tamanho máximo de arquivo core dump | | memlock| Memória que pode ser bloqueada (útil para Elasticsearch) | | stack | Tamanho máximo da stack | | fsize | Tamanho máximo de arquivos criados |

Para visualizar no sistema:

ulimit -a

Por que configurar ulimit no Docker

Containers herdam limites padrão do host. Em aplicações de alta carga isso pode causar:

  • Erro Too many open files
  • Falha ao criar threads
  • Problemas com bancos de dados
  • Problemas com Elasticsearch ou Kafka
  • Limitações em servidores de alta concorrência

Exemplo comum de erro:

EMFILE: too many open files

Configurando ulimit ao executar container

Usando docker run

docker run --ulimit nofile=65535:65535 \
--ulimit nproc=65535:65535 \
nginx

Formato:

--ulimit type=soft_limit:hard_limit

Onde:

  • soft limit → limite aplicável em runtime
  • hard limit → limite máximo permitido

Configurando ulimit no docker-compose

docker-compose.yml

version: "3.9"

services:
app:
image: nginx
ulimits:
nofile:
soft: 65535
hard: 65535
nproc: 65535

Observações:

  • Pode usar apenas um número (aplica soft/hard iguais)
  • Pode definir soft e hard separadamente

Configuração global no Docker Daemon

É possível definir valores padrão no daemon.

Arquivo:

/etc/docker/daemon.json

Exemplo:

{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
}
}

Depois reinicie:

sudo systemctl restart docker

Verificando o ulimit dentro do container

Para validar:

docker exec -it <container> bash
ulimit -n

Ou:

cat /proc/self/limits

Saída típica:

Max open files            65535                65535                files

Caso prático: Aplicação Node.js

Problema:

Error: EMFILE: too many open files

Solução:

docker run --ulimit nofile=65535:65535 node-app

Ou no docker-compose:

services:
api:
image: node-app
ulimits:
nofile:
soft: 65535
hard: 65535

Caso prático: Elasticsearch

O Elasticsearch exige:

  • memlock ilimitado
  • nofile alto

Exemplo:

docker run --ulimit memlock=-1:-1 \
--ulimit nofile=65535:65535 \
elasticsearch:8

Ou no docker-compose:

services:
elasticsearch:
image: elasticsearch:8
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65535
hard: 65535

Diferença entre limite do Host e do Container

Mesmo configurando no container:

  • O host precisa permitir valores iguais ou maiores
  • /etc/security/limits.conf pode influenciar
  • systemd pode limitar processos

Verificar no host:

ulimit -n

Se necessário, alterar:

sudo nano /etc/security/limits.conf

Exemplo:

* soft nofile 65535
* hard nofile 65535

Boas práticas

  • Ajustar apenas o necessário
  • Monitorar uso real antes de aumentar limites
  • Usar valores recomendados pelo fornecedor da aplicação
  • Não usar -1 indiscriminadamente
  • Garantir alinhamento entre host, daemon e container