Estructura Dockerfile¶
FROM imagen:tag #imagen base
WORKDIR /ruta # dentro del contenedor carpeta de trabajo
COPY origin destino #Copiar del host al contenedor
RUN comando # Ejecutar una orden
ENV CLAVE=valor #Variables de enterono
EXPOSE puerto #Puerto abierto en el contenedor
USER nbombre #Cambia el usuario (root por defecto)
CMD ["bin","arg"] #comando por defecto
ENTRYPOINT ["bin"] # ejecutable
Los CMD despues de entrypoint son los parametros de entrada
ENTRYPOINT ["python", "app.py"]
CMD ["--puerto", "5000"]
CMD ["--output", "salida.log"]
Por preferencia Entrypoint porque nos permite conocer el estado actual del comando
Buenas practicas¶
- From evitar latest
- Evitar Correr el app como root
- Evitar USar ENV para contraseñas o tokens
- Evitar COPY . /app antes de instalar depenencias
- Evitar Mezclar app-get update y apt-get install (usarlos de forma separada)
- No limpiar caches de paquetes
- Usar .dockerignore permite excluir archivos del comando COPY
- Usar imagenes pequeñas pequeña como alpine (pero entender que tienen limitaciones)
ARG vs ENV¶
Arg solo usa en el build y ENV es permanente para el contendedor
Limites al contenedor¶
Se recomienda
- --cpu=N fraccion de CPU del host utilizad
- --memory=N limite para la RAM
- --memory-swap limite para el SWAP
Almacenamiento¶
Cuando se borra un contenedor se pierde todo lo que tiene, para eso contamos con 3 mecanismos:
- bind mount: Es un directorio host (usar solo en desarrollo)
- volumen nombrado Administrado por docker (carpeta logica), podemos gestionarlos como si fuera un disco extraible para los contenedores y el host
- tempfs (secrets)
Volumenes¶
Los pdoemos gestionar docker volume, ahora tambien en el dockerfile podemos utilizar la instrucciones VOLUME por crear o conectarnos a volumenes disponibles.
Por ejemplo en una base de datos es altamente recomendable que la BD (archivos) estén en un volumen.
Limitaciones¶
Las redes de docker nos permiten manejar como se ven los contenderos, pero cuando son muchos, ya se torna complicado. Cuando necesitamos que varios contenedores interactuen entre sí, a esto se le conoce como orquestación.
- Docker compose
- Kubernetes