Javascript - Despliegue - Docker

Creación de los ficheros necesarios

Fichero Dockerfile

Crear el fichero Dockerfile con lo necesario para el funcionamiento de nuestra app.

# Imagen NodeJS
FROM node:20.16
# Utilizar un usuario
RUN groupadd -r usuariocontenedor && useradd -r -g usuariocontenedor usuariocontenedor
USER usuariocontenedor
# Direcotrio APP
RUN mkdir -p /usr/src/nombreapp
WORKDIR /usr/src/nombreapp
# Instalar dependencias, compilar app, etc
COPY package*.json ./
RUN npm ci
# Código de la APP
COPY . .
# Puerto en el que se inicia la APP
EXPOSE 80
# Comando que inicia la aplicación
CMD [ "npm", "start" ]

En este caso en el fichero package.json debemos tener el script llamado start para iniciar nuestra APP.

Fichero .dockerignore

Crear el fichero .dockerignore en los que incluiremos los directorio y ficheros que debe ignorar docker como: repositorio git, directorios dist/build, node_modules, ficheros de logs, etc. En nuestro caso también incluiremos el fichero .env para evitar que la configuración de las variables de entorno quede dentro de la imagen que generaremos.

.git
dist/
node_modules/
.vscode
logs/
*.log
.env
Dockerfile
.dockerignore

Lanzar aplicacción

Usando docker-compose

Crear fichero docker-compose.yml

services:
  nombreapp:
    build:
      context: .
      dockerfile: Dockerfile
    image: nombreapp
    read_only: true
    security_opt:
     - no-new-privileges:true
    container_name: nombreapp
    restart: unless-stopped
    env_file: .env
    ports:
      - 8081:80
# Construir imagen
docker-compose build

# Reconstruir el contenedor
docker-compose up --force-recreate

# Lanzar existente
docker-compose up -d

# Para contenedor
docker-compose stop

# Borrar contenedor
docker-compose down

# Ver log app
docker logs -f nombreapp

Creando la imagen de docker

docker build -t nombreapp:0.0.1 .
docker build -t nombreapp:latest .
docker build -t nombreapp/nombretag:0.0.1 .
docker build -t nombreapp/nombretag:latest .

Usando comando run

docker run -d --name nombreapp -p 8080:80 nombreapp:latest