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:
memlockilimitadonofilealto
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.confpode 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
-1indiscriminadamente - Garantir alinhamento entre host, daemon e container