Simplemente quiero limitar los recursos de algunos contenedores Docker en un archivo docker-compose. La razón es simple: hay múltiples aplicaciones/servicios ejecutándose en el host. Así que quiero evitar que un solo contenedor pueda usar, por ejemplo, toda la memoria, lo que daña a los otros contenedores.
De los documentos aprendí, que esto se puede hacer usando resources . Pero esto está más allá deploy . Así que tengo que escribir mi archivo docker-compose como el siguiente ejemplo:
php: image: php:7-fpm restart: always volumes: - ./www:/www deploy: resources: limits: memory: 512MEsto me dio la advertencia:
ADVERTENCIA: Algunos servicios (php) usan la tecla 'implementar', que será ignorada. Compose no es compatible con la configuración de implementación: use
docker stack deploypara implementar en un enjambre.
Y eso parece ser cierto: las docker stats confirman que el contenedor puede usar todo el RAM del host.
La documentación dice:
Especifique la configuración relacionada con la implementación y ejecución de servicios. Esto solo tiene efecto cuando se implementa en un enjambre con docker stack deployment, y se ignora mediante docker-compose up y docker-compose run.
Pero no necesito agrupar. Parece que no hay otra forma de limitar los recursos usando un archivo docker composer. ¿Por qué no es posible especificar algún tipo de etiqueta de memory como lo hace el parámetro de inicio en la docker run ?
Ejemplo: docker run --memory=1g $imageName
Esto funciona perfectamente para un solo contenedor. Pero no puedo usar esto (al menos sin violar una clara separación de preocupaciones), ya que necesito usar dos contenedores diferentes.
Descubrí que puedo usar mem_limit directamente después de pasar de la versión 3 a la versión 2 (colocando version: '2' en la parte superior). Pero actualmente estamos en la versión 3.1, por lo que esta no es una solución a largo plazo. Y los documentos dicen que deploy.resources es el nuevo reemplazo para las etiquetas v2 como mem_limit .
Algún día, la versión 2 quedará obsoleta. ¿Entonces la gestión de recursos ya no es posible con las últimas versiones, al menos sin tener un enjambre? Parece un empeoramiento para mí, no puedo creer esto...
Dado que muchos usuarios de Docker Compose se han quejado de esta incompatibilidad de compose v3 vs v2, el equipo ha desarrollado el modo de compatibilidad .
Puede conservar la misma estructura de implementación que proporcionó y no se ignorará, simplemente agregando el indicador --compatibility al comando docker-compose (docker-compose --compatibility up), como se explica aquí . Probé esto con la versión 3.5 y lo verifiqué con las estadísticas de Docker y puedo confirmar que funciona.
Puede ejecutar el demonio docker en modo enjambre en un solo host. Agregará funciones adicionales innecesarias como el descubrimiento del servicio etcd, pero eso es todo detrás de escena.
La documentación de Docker tiene una "nota" al respecto aquí https://docs.docker.com/engine/swarm/swarm-tutorial/#three-networked-host-machines