En un artículo anterior, mostramos como levantar un servidor OCP UA en cuestión de minutos usando Co pilot y Visual Code. Este tipo de aplicaciones o microservicios, puede ser interesante aislarlos del sistema operativo y tener la capacidad de ejecutarlos de forma independiente.

Aquí es donde entra la tecnología Docker con sus contenedores. Pero, ¿Qué es un Docker?

Docker es una herramienta que permite empaquetar una aplicación con todas sus dependencias en un contenedor, asegurando que se ejecute igual en cualquier entorno. Es como una caja portátil que lleva tu software listo para funcionar donde quieras.


A continuación veamos los pasos a seguir para disponer de Docker y veamos el ejemplo concreto de Dockerizar el Servidor OPC UA del artículo anterior.


Contenido


Instalación Docker

Lo primero será descargar la aplicación Docker Desktop. Con ella, gestionaremos las imágenes y contenedores en nuestra máquina, es decir, que podremos ejecutar cualquier aplicación que previamente se haya embebido en un Docker. Docker es gratis para uso personal.

Una vez instalado, veremos algo como esto:


Y ya tenemos preparada la aplicación para meter dentro las imágenes que queramos.


Generación imagen y contenedor Docker

Este apartado tiene algo mas de miga, porque es donde vamos a convertir la aplicación que tenemos en Visual Code, en una imagen apta para Docker.

Como ayuda, Docker no deja de ser un “mini-PC”, por tanto habrá que instalarle las dependencias o requerimientos que necesite, según la funcionalidad que vaya a ejercer.

Paso 1: Crear archivo Dockerfile en la raíz del proyecto. Veréis como se le pone el icono de la ballena, lo que indica que es correcto el nombre.


El contenido del Dockerfile debe contener la información para construir la aplicación, os sugiero que le pidáis ayuda al ChatGPT para ello. El código en este caso:

# Imagen base actualizada
FROM python:3.12-slim-bookworm

# Prevenir problemas interactivos
ENV DEBIAN_FRONTEND=noninteractive

# Carpeta de trabajo dentro del contenedor
WORKDIR /app

# Copiar e instalar dependencias
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copiar el código del proyecto
COPY . .

# Exponer el puerto que usará el servidor OPC UA o el servidor web
EXPOSE 4840
EXPOSE 5000

# Este CMD se ignora si usas docker-compose con "command"
CMD ["python", "opc_server.py"]

Paso 2: Crear docker-compose.yml para configurar los servicios.

version: '3.9'

services:
  opcua-server:
    build:
      context: .
    container_name: opcua-server
    ports:
      - "4840:4840"
    restart: unless-stopped
    command: python opc_server.py

  opcua-web:
    build:
      context: .
    container_name: opcua-client-web
    ports:
      - "5000:5000"
    restart: unless-stopped
    command: python opc_client_web.py

Paso 3: Docker ignore. Mediante un archivo llamado “.dockerignore” hacemos que cuando se empaquete la aplicación, no empaquete cosas innecesarias, como el caché u otros.

venv/
__pycache__/
*.pyc
.DS_Store
.git/


Paso 4: Librerías. Comprobar requirements.txt contenga todas las librerías usadas en el proyecto. Para ello, ejecutamos el código siguiente en al terminal, que meterá todas las librerías en nuestro fichero.

pip freeze > requirements.txt

Y tras ejecutar, todas las librerias de mi entorno venv, pasan a mi archivo de requirtements.txt

Paso 5: Construir la imagen Docker y levanta el contenedor. Para ello abrimos la terminal y ejecutamos

docker-compose up --build

Una vez se ejecute este comando, se empezará a montar nuestra aplicación, construyendola con todas las dependencias y librerías. Además generará un contenedor y lo arrancará. Con esta instrucción nos ahorramos más pasos.

Si todo ha ido bien, la imagen ya debe estar disponible en Docker Desktop:


Y los contenedores arrancados cada uno en su puerto:


Resultados

Ahora ya tenemos corriendo el servidor OPC UA, por un lado, el cual podemos comprobar mediante UA Expert de nuevo:


Y nuestro cliente Web recogiendo valores:


Exportación

Si queremos exportar la imagen para que pueda ser usada en otros dispositivos. Primero ejecutamos un comando para verificar cuales son nuestras iamgenes

docker images

Y tendremos algo como esto:


Entonces pasamos a crear los archivos .tar que son los comprimidos de nuestras imagenes en el formato que acepta Docker.

Para guardar las imágenes conjuntamente:

docker save -o full_backup.tar opcserver-opcua-server opcserver-opcua-web


Y para importarlo en otro PC con docker:

docker load -i full_backup.tar


Conclusiones

  • Docker es una tecnología muy interesante para empaquetar aplicaciones y hacerlas independientes del Sistema Operativo donde queramos correrlas.
  • Tiene un entorno muy intuitivo y mucha documentación , lo que hace muy fácil su implementación.
  • Para aplicaciones como un servidor OPC UA, puede ser muy útil en entornos de pruebas, donde necesitamos levantar un servicio con una utilidad, sin que nos haga perder mucho tiempo montándola.