Containerizar una aplicación Deno
Requisitos previos
- Tienes un cliente git. Los ejemplos de esta sección usan git por línea de comandos, pero puedes usar cualquier cliente.
Descripción general
Durante mucho tiempo, Node.js ha sido el runtime de referencia para aplicaciones JavaScript del lado del servidor. Sin embargo, en los últimos años han surgido runtimes alternativos, incluido Deno. Al igual que Node.js, Deno es un runtime de JavaScript y TypeScript, pero adopta un enfoque moderno con funciones de seguridad actuales, una biblioteca estándar integrada y soporte nativo para TypeScript.
¿Por qué desarrollar aplicaciones Deno con Docker? Tener varios runtimes para elegir es interesante, pero gestionar varios runtimes y sus dependencias de forma coherente en todos los entornos puede ser complicado. Ahí Docker resulta invaluable. Usar contenedores para crear y destruir entornos bajo demanda simplifica la gestión de runtimes y garantiza consistencia. Además, a medida que Deno sigue creciendo y evolucionando, Docker ayuda a establecer un entorno de desarrollo fiable y reproducible, reduciendo problemas de configuración y agilizando el flujo de trabajo.
Obtener la aplicación de ejemplo
Clona la aplicación de ejemplo para usarla en esta guía. Abre una terminal, ve al directorio donde quieras trabajar y ejecuta el siguiente comando para clonar el repositorio:
$ git clone https://github.com/dockersamples/docker-deno.git && cd docker-deno
Ahora deberías tener el siguiente contenido en tu directorio deno-docker.
├── deno-docker/
│ ├── compose.yml
│ ├── Dockerfile
│ ├── LICENSE
│ ├── server.ts
│ └── README.mdEntender la aplicación de ejemplo
La aplicación de ejemplo es una aplicación Deno sencilla que usa el framework Oak para crear una API simple que devuelve una respuesta JSON. La aplicación escucha en el puerto 8000 y devuelve el mensaje {"Status" : "OK"} cuando accedes a la aplicación en un navegador.
// server.ts
import { Application, Router } from "https://deno.land/x/[email protected]/mod.ts";
const app = new Application();
const router = new Router();
// Define a route that returns JSON
router.get("/", (context) => {
context.response.body = { Status: "OK" };
context.response.type = "application/json";
});
app.use(router.routes());
app.use(router.allowedMethods());
console.log("Server running on http://localhost:8000");
await app.listen({ port: 8000 });Crear un Dockerfile
Antes de crear un Dockerfile, debes elegir una imagen base. Puedes usar la imagen oficial de Docker para Deno o una Docker Hardened Image (DHI) del catálogo de imágenes endurecidas.
Elegir DHI ofrece una imagen lista para producción, ligera y segura. Para más información, consulta Docker Hardened Images.
Las Docker Hardened Images (DHI) están disponibles para Deno en el catálogo de Docker Hardened Images. Puedes hacer pull de las DHI directamente desde el registro dhi.io.
Inicia sesión en el registro DHI:
$ docker login dhi.ioHaz pull de la DHI de Deno como
dhi.io/deno:2. La etiqueta (2) en este ejemplo se refiere a la última versión 2.x de Deno.$ docker pull dhi.io/deno:2
Para otras versiones disponibles, consulta el catálogo.
# Use the DHI Deno image as the base image
FROM dhi.io/deno:2
# Set the working directory
WORKDIR /app
# Copy server code into the container
COPY server.ts .
# Set permissions (optional but recommended for security)
USER deno
# Expose port 8000
EXPOSE 8000
# Run the Deno server
CMD ["run", "--allow-net", "server.ts"]Usar la imagen oficial de Docker es sencillo. En el siguiente Dockerfile verás que la instrucción FROM usa denoland/deno:latest como imagen base.
Es la imagen oficial de Deno. Está disponible en Docker Hub.
# Use the official Deno image
FROM denoland/deno:latest
# Set the working directory
WORKDIR /app
# Copy server code into the container
COPY server.ts .
# Set permissions (optional but recommended for security)
USER deno
# Expose port 8000
EXPOSE 8000
# Run the Deno server
CMD ["run", "--allow-net", "server.ts"]Además de especificar la imagen base, el Dockerfile también:
- Establece el directorio de trabajo del contenedor en
/app. - Copia
server.tsal contenedor. - Establece el usuario
denopara ejecutar la aplicación como usuario no root. - Expone el puerto 8000 para permitir tráfico a la aplicación.
- Ejecuta el servidor Deno con la instrucción
CMD. - Usa la opción
--allow-netpara permitir acceso de red a la aplicación. El archivoserver.tsusa el framework Oak para crear una API simple que escucha en el puerto 8000.
Ejecutar la aplicación
Asegúrate de estar en el directorio deno-docker. Ejecuta el siguiente comando en una terminal para compilar y ejecutar la aplicación.
$ docker compose up --build
Abre un navegador y visita la aplicación en http://localhost:8000. Verás el mensaje {"Status" : "OK"} en el navegador.
En la terminal, pulsa ctrl+c para detener la aplicación.
Ejecutar la aplicación en segundo plano
Puedes ejecutar la aplicación desacoplada de la terminal añadiendo la opción -d.
Dentro del directorio deno-docker, ejecuta el siguiente comando
en una terminal.
$ docker compose up --build -d
Abre un navegador y visita la aplicación en http://localhost:8000.
En la terminal, ejecuta el siguiente comando para detener la aplicación.
$ docker compose down
Resumen
En esta sección aprendiste a containerizar y ejecutar tu aplicación Deno con Docker.
Información relacionada:
- Referencia de Dockerfile
- Archivo
.dockerignore - Descripción general de Docker Compose
- Referencia del archivo Compose
- Docker Hardened Images
Próximos pasos
En la siguiente sección aprenderás a desarrollar tu aplicación con contenedores.