
Los hosts Docker pueden funcionar de manera confiable durante meses y aun así llenar sus discos durante la noche o exponer puertos a firewalls que deberían bloquearse. Estos 12 consejos prácticos utilizan la poda del sistema Docker, daemon.json, políticas de reinicio y comprobaciones de estado para ayudar a prevenir estos problemas.
Imagine recibir una alerta de espacio en disco de un servidor que ha estado ejecutando el mismo contenedor durante meses. Aún no se ha implementado ningún contenido nuevo /var/lib/docker Está creciendo de manera constante a medida que las imágenes, contenedores, volúmenes y registros de contenedores no utilizados nunca se limpian ni rotan.
La solución es sencilla. Los siguientes consejos muestran cómo usar la CLI para administrar los recursos de Docker y configurar el demonio de Docker de las siguientes maneras /etc/docker/daemon.jsonun perfil que normalmente se utiliza para controlar la configuración del nivel de demonio (como el registro).
Cómo se eligieron estos consejos de Docker
Cada consejo aborda problemas comunes en hosts Docker del mundo real, desde configuraciones de todo el host hasta políticas por contenedor y, finalmente, comandos de solución de problemas. se aplican a ubuntu, Durban, LokiLinux, AlmaLinuxy RHEL Cuando se utiliza Docker Engine desde el repositorio oficial de Docker. Sólo los comandos del editor pueden diferir entre versiones.
1. Utilice Docker Group para ejecutar comandos de Docker sin sudo
El primer consejo es evitar escribir sudo Antes de cada comando de Docker, debido a que los usuarios agregados al grupo de Docker pueden comunicarse directamente con el demonio de Docker de las siguientes maneras /var/run/docker.sock:
sudo usermod -aG docker $USER newgrp docker
este newgrp El comando aplica la nueva membresía del grupo sin necesidad de cerrar sesión. Sin embargo, la membresía docker El grupo otorga efectivamente acceso de nivel raíz al host.
Por ejemplo, un usuario con acceso a Docker puede montar el host / El sistema de archivos dentro del contenedor. Por lo tanto, agregue únicamente administradores de confianza a este grupo.
2. Utilice Docker System df y Docker System Prune para liberar espacio en el disco.
Ahora abordemos el problema del espacio en disco en la introducción. Primero verifique cuánto espacio está usando Docker y qué espacio se puede recuperar:
docker system df
producción:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 14 3 6.42GB 5.1GB (79%) Containers 5 3 12.3MB 1.2MB (9%) Local Volumes 8 2 2.31GB 1.9GB (82%) Build Cache 41 0 1.75GB 1.75GB
este reciclable Esta columna muestra cuánto espacio puede recuperar Docker. Para eliminar contenedores detenidos, redes no utilizadas, cachés de compilación no utilizadas e imágenes colgantes, ejecute:
docker system prune
Para una limpieza más agresiva, agregue -a Elimine todas las imágenes que el contenedor no esté utilizando actualmente:
docker system prune -a
Esto libera más espacio, pero requiere que las imágenes no utilizadas se vuelvan a extraer si es necesario. El volumen no se eliminará de forma predeterminada. añadir --volumes Solo si está seguro de que puede eliminar los volúmenes no utilizados.
3. Utilice max-size en daemon.json para rotar los registros del contenedor
La poda restaurará el espacio en disco una vez, pero el registro del contenedor puede seguir creciendo. Con ventana acoplable json-file Con el controlador de registro, el registro puede crecer indefinidamente a menos que configure la rotación.
existir ubuntu y Durbanhabilite la configuración del demonio Docker nano:
sudo nano /etc/docker/daemon.json
existir LokiLinux, AlmaLinuxy RHELuna instalación mínima puede incluir vi en lugar de nano:
sudo vi /etc/docker/daemon.json
Luego agregue la siguiente configuración sin comentarios de ruta, porque Docker se negará a iniciarse si este archivo JSON contiene:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
aquí:
"log-driver": "json-file"Conserva el controlador predeterminado para que el registro de la ventana acoplable siga siendo válido."max-size": "10m"Una vez que el archivo de registro actual alcance los 10 MB, se iniciará un nuevo archivo de registro."max-file": "3"Cada contenedor guarda tres archivos, lo que limita su registro a aproximadamente 30 MB.
Guarde el archivo y salga del editor, luego reinicie Docker. Esto también reiniciará el contenedor en ejecución:
sudo systemctl restart docker
Esta configuración se aplica a los contenedores recién creados. Los contenedores existentes conservan su configuración de registro actual, por lo que si desea que se apliquen las nuevas restricciones, vuelva a crearlos después de cambiar la configuración del demonio.
Si esto impide que Docker complete su partición raíz, compártalo con cualquiera que todavía elimine registros de contenedores manualmente.
4. Utilice –restart excepto-stopped para mantener el contenedor en ejecución después de reiniciar
Una vez implementadas las configuraciones para todo el host, los siguientes consejos se refieren a un solo contenedor, comenzando con un reinicio. De forma predeterminada, los contenedores permanecen detenidos durante los reinicios o fallas, por lo que una actualización principal puede desconectar un servicio:
docker run -d --name web --restart unless-stopped nginx
La política de detención excepto reiniciará el contenedor después de una falla y se reiniciará, pero si Docker lo detiene usted mismo, lo detendrá y Docker Update –restart cambiará la política en los contenedores existentes.
5. Utilice –memory y –cpus para limitar la memoria del contenedor y la CPU
La política de reinicio puede mantener vivo el contenedor, pero un contenedor filtrado aún puede usar toda la memoria del host y desencadenar el problema de falta de memoria (OOM) del kernel para procesos no relacionados:
docker run -d --name app --memory 512m --cpus 1.5 --restart unless-stopped nginx
--memory 512mEstablecer duro 512MB límite, por lo que cuando un contenedor lo excede, el núcleo solo elimina los procesos dentro de ese contenedor.--cpus 1.5 capsEl contenedor ocupaba un núcleo y medio de CPU.
6. Utilice -p 127.0.0.1 para vincular el puerto publicado al host local
Los puertos Docker publicados pueden exponer servicios más allá del propio host. Docker instala sus propias reglas de firewall para los puertos publicados y, según la configuración del firewall del host, utiliza -p 5432:5432 Incluso con un firewall (p. ej. UFW Parece negar esto.
Cuando un proxy inverso nativo, una herramienta de monitoreo u otro servicio en el mismo host solo requiere un puerto determinado, vincúlelo explícitamente a la dirección de loopback:
docker run -d --name db -e POSTGRES_PASSWORD=changeme -p 127.0.0.1:5432:5432 postgres:16
esto publica PostgreSQL Sólo en la interfaz loopback del host, no en todas las interfaces del host.
Consulta la dirección de escucha:
sudo ss -tlnp | grep 5432
deberías ver 127.0.0.1:5432 en lugar de 0.0.0.0:5432 Cuando el puerto está vinculado únicamente al host local.
Si el puerto de su base de datos está abierto a la red, compártalo con su equipo para que puedan verificar sus hosts.
7. Utilice –health-cmd para detectar servicios que no responden
Los contenedores pueden aparecer como arriba Incluso si la aplicación que contiene ya no responde correctamente. Las comprobaciones de estado de Docker le permiten ejecutar comandos periódicamente dentro de un contenedor y registrar si su aplicación está en buen estado.
vamos a recrear db Utiliza el recipiente del consejo anterior. pg_isreadyque se incluye en la imagen oficial de PostgreSQL:
docker rm -f db docker run -d --name db -e POSTGRES_PASSWORD=changeme \ -p 127.0.0.1:5432:5432 \ --health-cmd "pg_isready -U postgres" \ --health-interval 30s --health-retries 3 \ postgres:16
Las opciones de verificación de estado controlan cómo Docker evalúa los servicios:
--health-cmdes un comando que Docker ejecuta dentro de un contenedor, donde el código de salida 0 indica estado.--health-interval 30sLas comprobaciones se realizan cada 30 segundos.--health-retries 3Marque un contenedor como en mal estado solo después de 3 fallas consecutivas para evitar falsos positivos.
Una vez que se ejecuta la verificación de estado y la verificación es exitosa, el estado del contenedor mostrará Docker ps (en buen estado). Tenga en cuenta que la verificación de estado integrada de Docker solo registra el estado del contenedor; no reinicia automáticamente los contenedores en mal estado.
Combine comprobaciones de estado con mecanismos de supervisión u orquestación adecuados cuando los servicios en mal estado requieran una recuperación automática.
8. Utilice Docker Log –since y –tail para leer los registros más recientes.
Cuando falla una verificación de estado, el registro del contenedor suele ser el primer lugar para investigar; limite la salida al número de ciclos y filas que necesita:
docker logs --since 30m --tail 100 -f db
Esto se muestra hasta el último 100 líneas de registro pasadas 30 minutos y luego realice un seguimiento de las nuevas entradas del registro a medida que aparecen. de acuerdo a Ctrl+C Deje de rastrear registros.
9. Utilice las estadísticas de Docker para ver el uso de recursos en tiempo real.
Los registros muestran lo que está haciendo la aplicación y las estadísticas de Docker muestran cuánta CPU, memoria, red y E/S de disco está utilizando el contenedor en ejecución. Esto es útil para verificar los límites de recursos en el Consejo 5:
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
producción:
NAME CPU % MEM USAGE / LIMIT db 0.02% 38.4MiB / 7.75GiB app 0.00% 9.1MiB / 512MiB web 0.00% 8.9MiB / 7.75GiB
Aquí, los informes de la aplicación. Capítulo 512 El límite de memoria de MB se configura en el consejo 5, otros contenedores muestran la memoria disponible del host ya que no tienen un límite de memoria explícito.
10. Utilice el formato dockerspect para extraer los detalles del contenedor.
este --format Uso de opciones Go La plantilla extrae valores específicos de la inspección de la ventana acoplable sin mostrar su salida JSON completa.
Por ejemplo, después de que el contenedor se reinicie inesperadamente, verifique si Docker registra un OOMkill:
docker inspect --format '{{.State.OOMKilled}}' app
apagar true Significa que el contenedor fue cancelado debido a memoria insuficiente. Esta es una señal de diagnóstico útil, pero por sí sola no prueba que el contenedor haya excedido su límite de memoria Docker configurado.
También puede verificar el límite de memoria configurado usando el siguiente comando:
docker inspect --format '{{.HostConfig.Memory}}' app
El valor se devuelve en bytes, 0 significa que no hay límite de memoria del contenedor configurado.
11. Utilice Docker CP para copiar archivos dentro o fuera del contenedor.
Antes de cambiar la configuración del contenedor, utilice docker cp Hacer una copia de seguridad en el host funcionará incluso en contenedores detenidos:
docker cp web:/etc/nginx/nginx.conf ./nginx.conf.bak
Esto copiará archivos de web contenedor al directorio actual, brindándole una copia de seguridad local que puede verificar o restaurar más tarde.
12. Utilice nicolaka/netshoot para depurar contenedores mínimos
El último consejo es útil cuando necesitas solucionar problemas de red desde dentro de un contenedor (cuya imagen no incluye herramientas como esta) departamento, onduladoo SS. este nicolaka/netshoot La imagen proporciona una colección de utilidades de solución de problemas de red y se puede agregar al espacio de nombres de red del contenedor de destino:
docker run --rm -it --network container:web nicolaka/netshoot
Desde el shell generado, curl localhost:80 Pruebe el servicio desde el mismo espacio de nombres de red que el contenedor web. este --rm La opción eliminará automáticamente el contenedor de depuración temporal al salir.
Si netshoot te evita reconstruir la imagen solo para agregar curlcompártelo con colegas que todavía están depurando contenedores de esta manera.
Por dónde empezar en un host Docker existente
Si desea reforzar un host Docker de producción existente, comience con los cambios que abordan el mayor riesgo operativo: configure la rotación de registros para evitar el registro ilimitado de contenedores y vincule servicios internos a la máquina cuando no se requiera acceso externo.
A continuación, agregue políticas de reinicio, límites de CPU y memoria y comprobaciones del estado de ejecución al reconstruir o actualizar contenedores. usar docker logs, docker statsy docker inspect Y mantenga disponibles tomas de red para solucionar problemas de red cuando surjan problemas.
Docker Compose proporciona configuraciones equivalentes para la mayoría de estos controles, incluidos restartlimitaciones de recursos y healthchecklo que facilita el mantenimiento de las mismas prácticas en aplicaciones de múltiples contenedores.
en conclusión
Estos 12 consejos cubren problemas comunes del host Docker, desde el uso del disco y registros infinitos hasta puertos expuestos, límites de recursos y contenedores difíciles de depurar. La mayoría solo requiere una bandera de Docker o unas pocas líneas. daemon.json.
Cual estibador Al configurar un nuevo servidor, ¿cambia primero los valores predeterminados? ¿Sigues usando grupos de Docker o te has mudado a Docker sin raíz? comparte tu daemon.json configuración o cualquier error de Docker que solucione en los comentarios a continuación.
Si este artículo fue útil, Con alguien de tu equipo.









