Cómo administrar nuestro ambiente?
Cómo limitar los recursos de un contenedor?
NOTA: OOMkilled es Out Of Memory killed.
Para eliminar contenedores parados.
# Elimina contenedores parados
$ docker container prune
# Elimina todos los contenedores
$ docker rm -f $(docker ps -aq)
Eliminar redes, volúmenes, imágenes, …
# Para borrar todos las redes, volumenes, ...
$ docker system prune
Eliminar imágenes:
# Elimina todas las imagenes
$ docker rmi -f `docker images -q`
# O en su defecto usa
$ docker system prune -a
Para limitar los recursos de un contenedor usamos.
# Limito el uso de memoria
$ docker run -d --name app --memory 1g platziapp
# Veo cuantos recursos consume docker en mi sistema
$ docker stats
$ docker inspect app
<aside> 📌 Resumen: Hay muchas formas de mantener el entorno, y los recursos, trata de mantener eliminadas las cosas que no este usando para ahorrar la memoria.
</aside>
Qué hace SHELL?
Qué hace EXEC?
Para entender esto, tenemos que ver que esto esta relacionado con el CMD del docker file, dependiendo de la nomenclatura este puede ser SHELL o EXEC.
Shell form: Ejecuta el proceso como hijo de un shell (osea que no es el proceso principal)
FROM ubuntu:trusty
COPY ["loop.sh", "/"]
CMD /loop.sh
$ docker run -it ubuntu bash
Exec form: Ejecuta el comando como principal.
FROM ubuntu:trusty
COPY ["loop.sh", "/"]
CMD ["/loop.sh"]
$ docker exec looper ps -ef
$ docker run -it ubuntu /loop.sh
<aside> 📌 Resumen: Siempre trata de usar el formato EXEC cuando escribas tus docker files, ya que SHELL tiene ciertas desventajas.
</aside>
Qué es ENTRYPOINT?
NOTA: Esto es para usar un binario al cual le podemos pasar parámetros desde el CLI.
Cuando escribimos un comando al correr un contenedor, esto hace un override al Dockerfile.
FROM ubuntu:trusty
CMD ["/bin/ping", "-c", "3","localhost"]
Entrypoint: Este es el comando por defecto que se va a correr siempre, a menos que se especifique lo contrario, usa CMD como parámetro del entrypoint.
FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping", "-c", "3"]
CMD ["localhost"]
Para probar esto hacemos un build y corremos un contenedor:
# Contruyo la imagen
$ docker buils -t ping .
# Corro un contenedor al cual puedo enviar parámetros
$ docker run --name pinger ping <hostname>
<aside> 📌 Resumen: Este es la forma más fácil de tener binarios autocontenido sin tener que instalarlos, solo recuerda usar siempre la forma EXEC.
</aside>