Skip to main content

Nueve consejos avanzados de Docker para desarrolladores de Node.js

Escrito por
blog feature snyk container custom base recommendations

11 de abril de 2024

0 minutos de lectura
9 Docker Pro Tips that will LEVEL UP your Skills

Si pasas bastante tiempo en la línea de comandos y trabajas localmente con imágenes y contenedores de Docker para crearlos y probarlos, quizá quieras conocer algunos comandos avanzados de Docker.

Nos saltaremos lo básico e iremos directo a los comandos menos conocidos, pero muy eficaces, que pueden mejorar significativamente tu experiencia con Docker.

¿Te preocupa la seguridad de tus contenedores de Docker? Antes de entrar en los detalles de los comandos de Docker, es fundamental reconocer la importancia de la seguridad de los contenedores. Aquí es donde entra en juego Snyk. Snyk ofrece soluciones de seguridad sólidas, diseñadas para aplicaciones en contenedores, que te ayudan a identificar y corregir vulnerabilidades en tus contenedores y sus dependencias. Empieza por integrar Snyk en tu flujo de trabajo para reforzar la seguridad.

¿Cómo acceder a la shell de un contenedor Docker?

A menudo es necesario depurar problemas en el contenedor, por ejemplo, revisar los registros o la estructura del sistema de archivos, o cumplir otros requisitos para validar o confirmar una hipótesis. En otras ocasiones, quizás quieras explorar el interior de una imagen de Docker que compilaste localmente.

Puedes hacerlo con los argumentos de línea de comandos de Docker run interactive shell. Primero, debes iniciar un contenedor, ejecutar una shell y vincular tu terminal para interactuar con él.

Así puedes abrir una shell para una imagen de Docker de Node.js con el comando run de Docker:

$ docker run -it --rm [docker-image-name-goes-here] /bin/bash

Puedes hacer lo anterior si el `Dockerfile` de la imagen de Docker no especificó un `ENTRYPOINT`.

¿Cómo encontrar la versión de una imagen de Docker para Node.js?

Aquí tienes un truco útil para saber qué versión del entorno de ejecución de Node.js tienes instalada en tu imagen de Docker. Este dato es fundamental para verificar la compatibilidad, depurar y garantizar un comportamiento uniforme en distintos entornos.

Ejecuta el siguiente comando (suponiendo que tienes instalado el programa de análisis de JSON `jq`):

$ docker image inspect [image-name] | jq '.[0].Config.Env'

El comando muestra las variables de entorno de la imagen de Docker, incluida la versión de Node.js. Por ejemplo, podrías ver lo siguiente:

[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "NODE_VERSION=18.2.0",
  "YARN_VERSION=1.22.19"
]

¿Cómo usar imágenes de Docker optimizadas para Apple M1?

Docker ha evolucionado para admitir la arquitectura ARM, en la que se basa el chip M1, y ofrece imágenes de contenedor especializadas y optimizadas para esta arquitectura. Estas imágenes garantizan una mejor compatibilidad y un rendimiento más rápido en equipos M1, algo útil ya que hoy en día muchos desarrolladores usan laptops Apple.

Primero, quizá quieras verificar la arquitectura de la imagen. Antes de ejecutar un contenedor, confirma que su arquitectura sea compatible. Este comando te ayuda a verificar que usas una imagen optimizada para M1:

docker image inspect --format '{{ .Architecture }}' <image_name>

Cuando descargues imágenes del registro de Docker Hub, asegúrate de obtener imágenes optimizadas para M1:

docker pull --platform linux/arm64/v8 node:lts-bullseye-slim

Si también formas parte de un equipo que crea imágenes de Docker y las publica en un registro privado o público, asegúrate de crear imágenes de contenedores específicas para M1. Así funcionarán sin problemas en distintas arquitecturas de CPU y tendrán mayor compatibilidad:

docker buildx build --platform linux/amd64,linux/arm64 -t <your_username>/<image_name>:<tag> .

Detecta cambios en un contenedor con Docker diff

El comando `docker diff` muestra los cambios realizados en el sistema de archivos de un contenedor de Docker desde que se creó. Revela los archivos o directorios que se agregaron, modificaron o eliminaron.

Así se ve el comando:

docker diff <container_id>

Este comando devuelve una lista de los cambios realizados en el contenedor de Docker. Para cada cambio, Docker indica si el archivo o directorio se agregó (A), modificó (C) o eliminó (D).

Usar `docker diff` con un contenedor de Docker de Node.js puede ser útil si actualizaste algunas dependencias en tu archivo `package.json` y quieres verificar qué cambió exactamente en el directorio `node_modules`. Puedes ejecutar el comando `docker diff` para identificar los cambios.

Ventajas de `docker diff` para identificar vulnerabilidades de seguridad

El comando `docker diff` también puede ser una herramienta poderosa para tu kit de seguridad. Ofrece una vista rápida de los cambios realizados en el sistema de archivos del contenedor de Docker, lo que podría revelar cambios no autorizados o actividad sospechosa.

Por ejemplo, si notas cambios inesperados en los archivos de tu aplicación Node.js, podrían indicar una brecha de seguridad o la explotación de una vulnerabilidad. Si integras `docker diff` en tus revisiones habituales o incluso en tu proceso de CI/CD, puedes mejorar la seguridad de las aplicaciones y asegurarte de que tus contenedores de Docker funcionen según lo previsto.

Por eso, quizá quieras usar el comando `docker diff` para realizar una auditoría de seguridad de tus contenedores de Docker. Al comparar el estado actual del contenedor con la imagen original, puedes identificar desviaciones que podrían representar un riesgo de seguridad.

Analiza tus imágenes de contenedores de Docker en busca de vulnerabilidades y genera un SBOM

Snyk es una plataforma de seguridad con un plan gratuito permanente, diseñada para ayudar a los desarrolladores con la seguridad de las aplicaciones. En el caso de Docker, Snyk puede analizar tus imágenes de Docker en busca de vulnerabilidades y ofrecerte un informe completo con recomendaciones prácticas para corregirlas.

Para analizar una imagen de Docker de un proyecto de Node.js, primero asegúrate de tener instalada la CLI de Snyk (interfaz de línea de comandos). Si no la tienes, puedes instalarla con npm ejecutando:

npm install -g snyk

Ahora supongamos que tienes una imagen de Docker de tu aplicación Node.js llamada `my-nodejs-app`. Puedes analizarla con Snyk mediante el siguiente comando:

snyk container test my-nodejs-app

Este comando le indica a Snyk que analice la imagen de Docker llamada `my-nodejs-app` en busca de vulnerabilidades conocidas. Una vez finalizado el análisis, Snyk te mostrará una lista de las vulnerabilidades encontradas en la imagen de Docker, ordenadas por nivel de gravedad:

✗ High severity vulnerability found in lodash
  Description: Prototype Pollution
  Info: https://snyk.io/vuln/SNYK-JS-LODASH-567746
  Introduced through: lodash@4.17.15
  From: lodash@4.17.15

Otra gran función de Snyk es que puede generar una lista de materiales de software (SBOM) para tu imagen de Docker. Un SBOM enumera todos los componentes de la imagen de Docker, incluidas todas las dependencias y sus versiones. Es muy útil para hacer un seguimiento del contenido de la imagen e identificar posibles vulnerabilidades.

Así puedes generar un SBOM para tu imagen de Docker con Snyk:

snyk container test <image-name> --json | jq .packageManager

¿Cómo obtener el ID SHA de una imagen de Docker?

Es fundamental usar el ID SHA de la imagen de Docker para hacer referencia a tus imágenes con precisión, especialmente en scripts automatizados o para garantizar la consistencia entre entornos. Este identificador es único para cada imagen y versión, y ofrece más precisión que las etiquetas.

Este comando muestra todas tus imágenes de Docker con sus resúmenes SHA256 completos. El ID SHA aparece en la columna «IMAGE ID»:

docker images --no-trunc

Caso de uso: fijar una imagen en Docker Compose

Al especificar una imagen en un archivo de Docker Compose, puedes usar el ID SHA en lugar de la etiqueta para fijar la imagen en una versión específica. Así te aseguras de usar siempre la versión exacta de la imagen con la que probaste tu aplicación y evitas cambios inesperados si se actualiza la etiqueta de la imagen.

services:
  your_service:
    image: your_image@sha256:<SHA_ID>

Usar el ID SHA en los comandos de Docker aporta consistencia y confiabilidad, algo esencial en entornos de producción y pipelines de CI/CD.

¿Cómo obtener la dirección IP del contenedor de Docker?

Cuando ejecutas aplicaciones de Node.js con frameworks como NestJS, Express o Fastify en contenedores de Docker, a menudo necesitas conocer la dirección IP del contenedor.

Esta información puede ser fundamental para depurar, analizar registros o conectarte al servidor web que se ejecuta dentro del contenedor.

docker inspect --format '{{ .NetworkSettings.IPAddress }}' [container_name_or_id]

¿Cómo inspeccionar los procesos secundarios de Node.js dentro de un contenedor Docker?

¿Cómo pueden los desarrolladores de Node.js obtener información más detallada sobre sus aplicaciones en contenedores para monitorearlas y solucionar problemas con mayor eficacia, y así determinar si el proceso usa más memoria o recursos de CPU de lo esperado?

Usa este comando de Docker:

docker top node

Al trabajar con aplicaciones Node.js en contenedores de Docker, especialmente las que usan procesos secundarios (habituales en aplicaciones que utilizan clústeres, workers o generan subprocesos para realizar tareas), es esencial poder inspeccionarlos para depurar y supervisar.

Consulta los metadatos de imágenes de contenedores de Node.js en la API de Docker Registry

A veces necesitas información detallada sobre la imagen de contenedor de Node.js, y consultar directamente la API de Docker Hub es una forma eficaz de obtenerla.

Este enfoque proporciona metadatos completos sobre la imagen, que pueden ser cruciales para entender detalles de la versión, dependencias y otros atributos clave.

Usa el siguiente comando, que utiliza el programa `curl` para realizar la solicitud HTTP y el programa `jq` para dar formato a la respuesta como JSON con una presentación legible:

curl https://hub.docker.com/v2/repositories/library/node/tags/latest | jq

Esto es lo que puedes esperar en la respuesta:

  • Detalles de la imagen: Información como el tamaño, el resumen, la arquitectura y mucho más.

  • Información de las capas: Comprende cómo está construida la imagen.

  • Detalles de la etiqueta: Datos específicos sobre la etiqueta «latest».

Algunos casos útiles incluyen los scripts automatizados que integran este comando en pipelines de CI/CD para realizar verificaciones y actualizaciones automáticas, así como el seguimiento de versiones para asegurarte de usar la versión correcta de la imagen de Node.js según los requisitos de tu proyecto.

¡Llegaste al final!

Exploramos distintos escenarios, desde resolver inconsistencias de versiones y cuellos de botella de rendimiento hasta optimizar las operaciones cotidianas en tu ecosistema de Docker.

Para cerrar, esta publicación buscó darte un conjunto de comandos avanzados de Docker que van más allá de los habituales docker run y docker ps. Estos consejos profesionales para especialistas de DevOps y desarrollo buscan agilizar tus procesos de solución de problemas, depuración y administración de contenedores.

Al integrar estos conocimientos y comandos en tu flujo de trabajo, recuerda que dominar Docker es un proceso continuo. Si desarrollas en Node.js, sigue aprendiendo con estas 10 prácticas recomendadas para crear aplicaciones web de Node.js en contenedores con Docker; o, si desarrollas en Java, te gustará el artículo de Brian Vermeer: 10 prácticas recomendadas para crear contenedores de Java con Docker.

Seguridad de contenedores centrada en los desarrolladores

Snyk encuentra y corrige automáticamente vulnerabilidades en imágenes de contenedores y cargas de trabajo de Kubernetes.