Conclusiones clave

  • Utilice imágenes oficiales de Docker para mejorar la seguridad y el rendimiento. Crear sus propias imágenes puede resultar en una configuración incorrecta y llevar más tiempo.
  • Utilice versiones específicas de imágenes de Docker para evitar comportamientos impredecibles y conflictos con dependencias. Extraiga y cree utilizando imágenes de una versión específica.
  • Escanee imágenes de Docker en busca de vulnerabilidades de seguridad utilizando el comando docker scan. Determine si una imagen es lo suficientemente segura para su aplicación.

Docker es el software de creación de contenedores más popular, pero no todo el mundo lo utiliza de forma eficiente. Si no sigue las mejores prácticas de Docker, puede dejar sus aplicaciones vulnerables a problemas de seguridad o de rendimiento.

A continuación se presentan algunas de las mejores prácticas que puede adoptar para utilizar las funciones de Docker de manera ingeniosa. Estas medidas mejoran la seguridad y garantizan la creación de archivos Docker que se puedan mantener.

instagram viewer

1. Utilice imágenes oficiales de Docker

Al contener su aplicación, debe utilizar una imagen de Docker. Puede crear una imagen con una configuración personalizada o utilizar las imágenes oficiales de Docker.

Crear sus propias imágenes requiere que usted mismo maneje toda la configuración. Por ejemplo, para crear una imagen para una aplicación node.js, debe descargar node.js y sus dependencias. El proceso lleva mucho tiempo y es posible que no resulte en la configuración correcta.

Docker recomienda utilizar una imagen oficial de node.js que venga con todas las dependencias correctas. Las imágenes de Docker tienen mejores medidas de seguridad, son livianas y se prueban para varios entornos. Puedes encontrar las imágenes oficiales en Imágenes oficiales de Docker página.

2. Utilice versiones específicas de la imagen de Docker

Por lo general, cuando extraes una imagen oficial, es la que tiene la etiqueta más reciente la que representa la última versión actualizada de esa imagen. Cada vez que construyes un contenedor a partir de esa imagen, es una versión diferente del último contenedor.

La compilación con diferentes versiones de imágenes de Docker puede provocar un comportamiento impredecible en su aplicación. Las versiones pueden chocar con otras dependencias y eventualmente provocar que su aplicación falle.

Docker recomienda extraer y compilar utilizando imágenes de una versión específica. Las imágenes oficiales también tienen documentación y cubren los casos de uso más comunes.

Por ejemplo, en lugar de docker tirar alpino, usar docker pull alpino: 3.18.3. Docker extraerá esa versión específica. Luego podrá usarlo en compilaciones sucesivas, reduciendo los errores en su aplicación. Puede encontrar las versiones particulares de las imágenes en la página oficial de imágenes de Docker, en Etiquetas admitidas y respectivos enlaces de Dockerfile:

3. Escanear imágenes en busca de vulnerabilidades de seguridad

¿Cómo puede determinar que una imagen que desea crear no tiene vulnerabilidades de seguridad? Escaneándolo. Puede escanear imágenes de Docker utilizando el comando de escaneo de Docker. La sintaxis es la siguiente:

docker scan [IMAGE]

Primero debe iniciar sesión en Docker para escanear una imagen.

docker login

Luego, escanee la imagen específica que desea verificar:

docker scan ubuntu: latest

una herramienta llamada sincronizar escanea la imagen y enumera las vulnerabilidades según su gravedad. Puede ver el tipo de vulnerabilidad y enlaces a información al respecto, incluido cómo solucionarla. Puede saber a partir del escaneo si la imagen es lo suficientemente segura para su aplicación.

4. Utilice imágenes de Docker de tamaño pequeño

Cuando extraes una imagen de Docker, viene con todas las utilidades del sistema. Esto aumenta el tamaño de la imagen con herramientas que no necesita.

Las imágenes grandes de Docker ocupan espacio de almacenamiento y pueden ralentizar el tiempo de ejecución de los contenedores. También tienen una mayor posibilidad de sufrir vulnerabilidades de seguridad.

Puede reducir el tamaño de las imágenes de Docker usando imágenes de Alpine. Las imágenes alpinas son livianas y vienen solo con las herramientas necesarias. Reducen el espacio de almacenamiento, lo que hace que su aplicación se ejecute más rápido y de manera más eficiente.

Encontrará una versión Alpine para la mayoría de las imágenes oficiales en Docker. A continuación se muestra un ejemplo de versiones de Alpine para PostgreSQL:

5. Optimice las capas de imágenes de almacenamiento en caché

Cada comando en un Dockerfile representa una capa de la imagen. Las capas tienen diferentes utilidades y realizan diversas funciones. Si observa las imágenes oficiales en Docker Hub, verá las instrucciones utilizadas para crearlas.

El Dockerfile incluye todo lo que necesitas para crear la imagen. Es una de las razones por las que muchos los desarrolladores prefieren Docker a las máquinas virtuales.

Aquí está la estructura de una imagen alpina de ejemplo:

Cuando crea su aplicación basada en una imagen, agrega más capas a la imagen. Docker ejecuta instrucciones en un Dockerfile de arriba a abajo y, si una capa cambia, Docker tiene que reconstruir las capas siguientes.

La mejor práctica es organizar su Dockerfile desde los archivos que cambian menos hasta los que cambian con más frecuencia. Las instrucciones que no cambian, como la instalación, pueden estar en la parte superior del archivo.

Cuando cambia un archivo, Docker construye a partir de los archivos modificados y almacena en caché los archivos no modificados que se encuentran encima de él. Por tanto, el proceso se ejecuta más rápido.

Mire el ejemplo ilustrado en la imagen de arriba. Si hay un cambio en los archivos de la aplicación, Docker compila desde allí; No es necesario volver a instalar los paquetes npm.

Si construye a partir de la imagen, el proceso se ejecutará más rápido que reconstruir todas las demás capas nuevamente. El almacenamiento en caché también acelera la extracción y envío de imágenes desde Docker Hub.

7. Utilice un archivo .dockerignore

Al crear una imagen utilizando un Dockerfile, es posible que desee mantener cierta información privada. Algunos archivos y carpetas pueden ser parte del proyecto, pero no deseas incluirlos en el proceso de compilación.

El uso de un archivo .dockerignore reduce considerablemente el tamaño de la imagen. Esto se debe a que el proceso de construcción sólo incluye los archivos necesarios. También ayuda a mantener la privacidad de los archivos y evitar exponer claves o contraseñas secretas.

El archivo .dockerignore es un archivo que crea en la misma carpeta que su Dockerfile. Es un archivo de texto, muy parecido un archivo .gitignore, que contiene los nombres de los archivos que no desea incluir en el proceso de compilación.

He aquí un ejemplo:

8. Utilice el principio del usuario menos privilegiado

De forma predeterminada, Docker utiliza el usuario root como administrador para obtener permiso para ejecutar comandos, pero esto es una mala práctica. Si hay una vulnerabilidad en uno de los contenedores, los piratas informáticos pueden acceder al host de Docker.

Para evitar este escenario, cree un usuario y un grupo dedicados. Puede configurar los permisos necesarios para que el grupo proteja la información confidencial. Si un usuario se ve comprometido, puede eliminarlo sin exponer todo el proyecto.

A continuación se muestra un ejemplo que muestra cómo crear un usuario y establecer sus permisos:

Algunas imágenes base tienen pseudousuarios creados en ellas. Puede utilizar los usuarios instalados en lugar de los permisos del usuario root.

Por qué debería adoptar las mejores prácticas de Docker

Las mejores prácticas son una excelente manera de reducir las vulnerabilidades y escribir código más limpio. Existen muchas prácticas recomendadas que puede aplicar a cada función de Docker que utilice.

Un proyecto bien organizado facilita la sincronización con otras herramientas de orquestación como Kubernetes. Puede comenzar con los que se describen en el artículo y adoptar más a medida que aprenda Docker.