Usualmente uso una imagen de Ubuntu o Arch Linux, pero recientemente descubrí que hay un sistema operativo llamado CoreOS específicamente para contenedores docker.
Como soy nuevo en Docker, no estoy seguro de cuál sería la mejor imagen base para construir mi Dockerfile. Parece una pregunta tonta, pero en caso de que ejecute muchos microservicios en varios contenedores, el contenedor debería ser lo más liviano posible.
Esto realmente depende de sus requisitos:
FROM scratch : si puede compilar estáticamente su aplicación y no necesita ningún otro binario (bibliotecas, shells o cualquier otro período de comando), entonces está usando el "cero" completamente vacío. Verá que esto se usa como punto de partida para las otras imágenes base, y también se encuentra en muchos comandos Go precompilados.
Busybox: Considero esto menos como una imagen base y más como un contenedor de utilidad conveniente. Obtiene muchos comandos comunes en un tamaño muy pequeño. Sin embargo, lo que no obtiene es el administrador general de paquetes para instalar fácilmente otros componentes. El tamaño actual de esto es inferior a 1M.
Alpine: esta es la versión de Docker de una imagen simplificada y hace un buen trabajo y es pequeño, pero también le brinda un administrador de paquetes. Sin embargo, ese tamaño pequeño tiene un costo, cosas como glibc no están incluidas. Descubrirá que muchas de las imágenes oficiales se basan en Alpine, por lo que dentro del ecosistema de contenedores, esta es una opción muy popular. El tamaño actual de esto es de alrededor de 2 millones antes de comenzar a agregar paquetes.
Debian, Ubuntu y CentOS: estas son menos de las imágenes base livianas, cada una viene en alrededor de 50 millones más o menos. Pero lo que pierden con el tamaño lo ganan con una gran colección de paquetes de los que puede extraer y muchas personas que están probando, solucionando errores y contribuyendo a las cosas en sentido ascendente. También vienen con una colección de bibliotecas que algunas aplicaciones pueden esperar que estén preinstaladas.
Si bien la última opción es un poco más grande, tenga en cuenta que las imágenes base solo deben pasar por el cable y almacenarse en el disco una vez. Después de eso, a menos que las cambie, las imágenes creadas sobre ellas solo necesitan enviar el manifiesto que hace referencia a las capas en esa imagen base y el motor acoplable verá que ya tiene esas capas descargadas. Y con union fs, esas capas nunca necesitan copiarse incluso si ejecuta 100 contenedores, todos apuntando hacia esa imagen, cada uno usa la misma capa de solo lectura en el disco para todas las capas de imagen y escribe sus cambios en su contenedor. capa RW específica.
Pruebe la imagen base de alpine linux , es realmente pequeña (5M) y tiene acceso a un repositorio de paquetes. Lo estamos usando para construir nuestra imagen base de JDK en nuestro entorno de producción y hasta ahora funciona bien.