# Containerizar una aplicación Bun


## Requisitos previos

- Tienes un [cliente git](https://git-scm.com/downloads). 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 facto para aplicaciones JavaScript del lado del servidor. En los últimos años han surgido runtimes alternativos en el ecosistema, incluido [Bun](https://bun.sh/). Al igual que Node.js, Bun es un runtime de JavaScript. Bun es un runtime comparativamente ligero diseñado para ser rápido y eficiente.

¿Por qué desarrollar aplicaciones Bun con Docker? Tener varios runtimes para elegir es genial. Pero a medida que aumenta el número de runtimes, resulta difícil gestionar los distintos runtimes y sus dependencias de forma coherente en todos los entornos. Ahí entra Docker. Crear y destruir contenedores bajo demanda es una buena forma de gestionar los distintos runtimes y sus dependencias. Además, al ser un runtime bastante nuevo, conseguir un entorno de desarrollo consistente para Bun puede ser complicado. Docker puede ayudarte a configurar un entorno de desarrollo consistente para Bun.

## 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:

```console
$ git clone https://github.com/dockersamples/bun-docker.git && cd bun-docker
```

Ahora deberías tener el siguiente contenido en tu directorio `bun-docker`.

```text
├── bun-docker/
│ ├── compose.yml
│ ├── Dockerfile
│ ├── LICENSE
│ ├── server.js
│ └── README.md
```

## Crear un Dockerfile

Antes de crear un Dockerfile, debes elegir una imagen base. Puedes usar la [imagen oficial de Docker para Bun](https://hub.docker.com/r/oven/bun) o una Docker Hardened Image (DHI) del [catálogo de imágenes endurecidas](https://hub.docker.com/hardened-images/catalog).

Elegir DHI ofrece una imagen lista para producción, ligera y segura. Para más información, consulta [Docker Hardened Images](https://docs-docker.esdocu.com/dhi/).

**Uso de Docker Hardened Images**



Las Docker Hardened Images (DHI) están disponibles para Bun en el [catálogo de Docker Hardened Images](https://hub.docker.com/hardened-images/catalog/dhi/bun). Puedes hacer pull de las DHI directamente desde el registro `dhi.io`.

1. Inicia sesión en el registro DHI:

   ```console
   $ docker login dhi.io
   ```

2. Haz pull de la DHI de Bun como `dhi.io/bun:1`. La etiqueta (`1`) en este ejemplo se refiere a la última versión 1.x de Bun.

   ```console
   $ docker pull dhi.io/bun:1
   ```

Para otras versiones disponibles, consulta el [catálogo](https://hub.docker.com/hardened-images/catalog/dhi/bun).

```dockerfile
# Use the DHI Bun image as the base image
FROM dhi.io/bun:1

# Set the working directory in the container
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . .

# Expose the port on which the API will listen
EXPOSE 3000

# Run the server when the container launches
CMD ["bun", "server.js"]
```

**Uso de la imagen oficial**



Usar la imagen oficial de Docker es sencillo. En el siguiente Dockerfile verás que la instrucción `FROM` usa `oven/bun` como imagen base.

Puedes encontrar la imagen en [Docker Hub](https://hub.docker.com/r/oven/bun). Es la imagen oficial de Docker para Bun, creada por Oven, la empresa detrás de Bun, y está disponible en Docker Hub.

```dockerfile
# Use the official Bun image
FROM oven/bun:latest

# Set the working directory in the container
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . .

# Expose the port on which the API will listen
EXPOSE 3000

# Run the server when the container launches
CMD ["bun", "server.js"]
```



Además de especificar la imagen base, el Dockerfile también:

- Establece el directorio de trabajo del contenedor en `/app`.
- Copia el contenido del directorio actual al directorio `/app` del contenedor.
- Expone el puerto 3000, donde la API escucha peticiones.
- Y por último, inicia el servidor al lanzar el contenedor con el comando `bun server.js`.

## Ejecutar la aplicación

Dentro del directorio `bun-docker`, ejecuta el siguiente comando en una terminal.

```console
$ docker compose up --build
```

Abre un navegador y visita la aplicación en [http://localhost:3000](http://localhost:3000). 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 `bun-docker`, ejecuta el siguiente comando
en una terminal.

```console
$ docker compose up --build -d
```

Abre un navegador y visita la aplicación en [http://localhost:3000](http://localhost:3000).

En la terminal, ejecuta el siguiente comando para detener la aplicación.

```console
$ docker compose down
```

## Resumen

En esta sección aprendiste a containerizar y ejecutar tu aplicación Bun
con Docker.

Información relacionada:

- [Referencia de Dockerfile](/reference/dockerfile/)
- [Archivo `.dockerignore`](/reference/dockerfile/#dockerignore-file)
- [Descripción general de Docker Compose](/compose/)
- [Referencia del archivo Compose](/reference/compose-file/)
- [Docker Hardened Images](/dhi/)

## Próximos pasos

En la siguiente sección aprenderás a desarrollar tu aplicación con
contenedores.

