3.9 Uso de Docker

3.9.1 ¿Por qué usar Docker?

Docker es una plataforma basada en contenedores que permite desarrollar, distribuir y ejecutar aplicaciones dentro de un contenedor. La aplicación, además de las dependencias que esta necesite, como archivos binarios y bibliotecas, y la información de configuración se guardan en el contenedor. Puede distribuir varios contenedores, que se ejecutan en Docker y sobre el sistema operativo.

Con Docker, puede ampliar las aplicaciones verticalmente, lo que significa que puede haber varias instancias del servidor de sesión en un servidor y cada una de ellas presentará exactamente el mismo rendimiento que cuando se creó y probó.

3.9.2 ¿Cuáles son las ventajas?

La organización en contenedores ofrece muchas ventajas:

  • Rendimiento

    Las máquinas virtuales son una alternativa a los contenedores. Sin embargo, los contenedores no contienen un sistema operativo (a diferencia de las máquinas virtuales). Esto significa que los contenedores se pueden crear e iniciar de forma más rápida y presentan un formato más pequeño.

  • Agilidad

    Debido a que los contenedores son más portátiles y ofrecen un mayor rendimiento, puede aprovechar los procedimientos de desarrollo más ágiles y con mayor capacidad de respuesta.

  • Aislamiento

    Los contenedores de Docker son independientes entre sí. Esto es importante porque un contenedor de Docker que contenga una aplicación, incluidas las versiones necesarias del software compatible, no interferirá con otro contenedor de la misma aplicación que requiera un software compatible diferente. Puede tener total confianza de que, en cada etapa del proceso de desarrollo y distribución, la imagen que cree presentará el rendimiento esperado.

  • Capacidad de ampliación

    La creación de nuevos contenedores es un proceso rápido y sencillo. La documentación de Docker proporciona información sobre cómo gestionar varios contenedores.

3.9.3 Terminología

Existen términos básicos con los que debe familiarizarse al trabajar con Docker. Para obtener más información, consulte el sitio de documentación de Docker.

  • Contenedor
  • : una instancia en tiempo de ejecución de una imagen. Por lo general, un contenedor está completamente aislado del entorno del host y solo puede acceder a los archivos y puertos del host si se ha configurado para realizar esta acción. Para ejecutar una imagen en un contenedor, utilice el comando "run" de Docker.
  • Nodo central de Docker
  • : un recurso de la comunidad basada en la nube para trabajar con Docker. El nodo central de Docker se utiliza normalmente para alojar imágenes, pero se puede usar para autenticar usuarios y automatizar la creación de imágenes. Cualquier usuario puede publicar imágenes en el nodo central de Docker.
  • Herramienta de composición de Docker
  • : se trata de una herramienta que utilizan los archivos YAML para configurar los servicios de la aplicación y, a continuación, definir y ejecutar aplicaciones de Docker de varios contenedores. Para obtener más información sobre la herramienta de composición, visite la documentación de Docker sobre esta herramienta.
  • Archivo de Docker
  • : un documento de texto que contiene los comandos para crear una imagen de Docker. Puede especificar comandos complejos (como especificar una imagen existente para utilizarla como base) o simples (como copiar archivos de un directorio en otro). Para crear una imagen desde un archivo de Docker, utilice el comando "build" de Docker.
  • Imagen
  • : un paquete ejecutable independiente que se ejecuta en un contenedor. Una imagen de Docker es un archivo binario que incluye todo lo necesario para ejecutar un único contenedor de Docker, incluidos sus metadatos. Puede crear sus propias imágenes (mediante un archivo de Docker) o utilizar imágenes que hayan creado otros usuarios y que estén disponibles a continuación en un registro (como, por ejemplo, el nodo central de Docker). Para crear una imagen desde un archivo de Docker, utilice el comando "build" de Docker. Para ejecutar una imagen en un contenedor, utilice el comando "run" de Docker.

3.9.4 Primeros pasos con Docker y Host Access for the Cloud

Si decide utilizar Docker durante la instalación de HACloud, el paquete de instalación incluirá un archivo de Docker inicial y un archivo jar de la aplicación complementario para que pueda empezar a utilizar el servidor de sesión en los contenedores. Estos archivos están disponibles antes de la instalación.

Puede encontrar ejemplos en la carpeta docker/samples. Consulte Ejemplos para obtener las instrucciones correspondientes.

Para crear la imagen base, es necesario realizar cuatro pasos:

  1. Instale Docker. Siga las instrucciones del sitio Web de Docker.

  2. Extraiga el archivo del paquete de descarga y busque Dockerfile,entrypoint.sh y sessionserver.jar en la carpeta Docker.

  3. Cree la imagen de Docker.

  4. Ejecute la imagen de Docker.

Cree la imagen de Docker del servidor de sesión.

Si ha seguido los pasos 1 y 2, ha instalado Docker, y ha extraído y localizado el archivo de Docker y el archivo sessionserver.jar, el siguiente paso consiste en crear la imagen base de Docker del servidor de sesión.

  1. Ejecute este comando desde la carpeta que contiene el archivo de Docker:

    docker build -t hacloud/sessionserver:<versión>.

    Sustituya <versión> por la versión del servidor de sesión. Si no hay disponible una versión, la etiqueta por defecto (-t) es la más reciente.

  2. Compruebe que la imagen se haya creado correctamente. Ejecute:

    docker images

    La salida debería contener información acerca de la imagen que acaba de crear.

Ejecute la imagen.

Antes de poder ejecutar la imagen del servidor de sesión en un contenedor de Docker, debe llevar a cabo los siguientes pasos:

Especifique la dirección del servidor MSS.

Para especificar la ubicación del servidor MSS, transfiera una variable de entorno al servidor de sesión mediante Docker. Por ejemplo, --env MSS_SERVER=mss.server.com

Especifique la contraseña de registro de servicios.

Para especificar la contraseña de registro de servicios, transfiera una variable de entorno al servidor de sesión mediante Docker. Por ejemplo, --env SERVICE_REGISTRY_PASSWORD=<su_contraseña>.

Puede recuperar la contraseña desde la propiedad service.registry.password ubicada en ./mss/server/conf/container.properties en el servidor MSS. Utilice la propiedad service.registry.password completa.

Indicar a MSS que confíe en el certificado de identidad del servidor de sesión

Para llevar a cabo este paso, puede utilizar Consola Administrativa > Configurar parámetros > Certificados de confianza. Consulte la documentación de la Consola Administrativa de MSS, Para añadir un certificado de servidor al almacén de confianza de MSS. El certificado del servidor de sesión está disponible en el directorio sessionserver/etc.

Proporcionar el almacén de claves que contiene el certificado de identidad del servidor de sesión.

El servidor de sesión se identifica mediante un certificado. Se espera que el certificado esté presente en el almacén de claves de Java, /opt/sessionserver/etc/keystore.bcfks, ubicado en el contenedor.

Proporcionar el almacén de confianza que contiene el certificado de MSS

Cuando el servidor de sesión establece conexiones TLS salientes, comprueba la confianza de los servidores remotos (como, por ejemplo, MSS) mediante certificados de su almacén de confianza. Se confiará en los certificados presentes en el almacén de claves de Java, /opt/sessionserver/etc/trustcerts.bcfks, ubicado en el contenedor.

Asignación del almacén de claves y el almacén de confianza a los que se encuentran en el contenedor

Tiene dos opciones para proporcionar estos almacenes de claves en el contenedor:

Uso de un montaje de volumen

Un montaje de volumen monta un archivo o un directorio del equipo host en un contenedor. Se hace referencia al archivo o el directorio mediante su vía completa o relativa en el equipo host.

Este volumen monta los archivos de los almacenes de claves y de confianza del host en el contenedor de Docker.

docker run --env MSS_SERVER=localhost \
    --env SERVICE_REGISTRY_PASSWORD=<introducir contraseña aquí> \
    --volume ~/demo_keystore.bcfks:/opt/sessionserver/etc/keystore.bcfks \
    --volume ~/demo_truststore.bcfks:/opt/sessionserver/etc/trustcerts.bcfks \
    --publish 7443:7443 \
    sessionserver

Existe un inconveniente asociado al uso del montaje de volumen. Dado que los almacenes del almacén de claves deben encontrarse en cada host de Docker en el que se esté ejecutando un contenedor, el contenedor de Docker no será muy portátil.

Ampliación de una imagen de Docker existente

Con este método, puede crear un nuevo archivo de Docker para copiar los archivos que necesita en la imagen de Docker. Esto permite que la imagen de Docker sea más portátil.

Cree primero un archivo de Docker que se extenderá desde la imagen de Docker, "hacloud/sessionserver".

FROM hacloud/sessionserver:<por ejemplo, hacloud/sessionserver:latest o hacloud/sessionserver:version>

COPY <su-vía>/keystore.bcfks /opt/sessionserver/etc/keystore.bcfks
    COPY <su-vía>/truststore.bcfks /opt/sessionserver/etc/trustcerts.bcfks

A continuación, cree la imagen de Docker ampliada y asígnele el nombre demo.

docker build -t demo .

Por último, ejecute la imagen demo.

docker run --env MSS_SERVER=localhost \
    --env SERVICE_REGISTRY_PASSWORD=<introducir contraseña aquí> \
    --publish 7443:7443 \
    demo

Especificar el nombre de host y el puerto de Docker

El servidor de sesión debe difundir su nombre de host para que MSS pueda encontrarlo. Como Docker genera un nombre exclusivo aleatorio al que no se puede acceder fuera del contenedor, debe especificar el nombre del host de Docker para MSS. También es necesario indicar al servidor de sesión el puerto que se va a publicar en el host de Docker. Los clientes que accedan al servidor de sesión acabarán encontrando <nombre_de_host_de_Docker>:<puerto_publicado_de_Docker>.

--env HOST_NAME=docker_host_name
   --env SERVER_PORT=docker_published_port

3.9.5 Ejemplos

Los ejemplos, ubicados en la carpeta docker/samples, le guiarán por las cuatro situaciones mediante la herramienta de composición de Docker. La herramienta de composición utiliza un archivo YAML para configurar y ejecutar las aplicaciones con un único comando.

Requisitos previos

Para ejecutar los ejemplos:

Entre los ejemplos, se incluyen:

  • Básico - Un ejemplo básico que proporciona archivos de almacén de claves y de confianza de demostración en los que puede importar un certificado de servidor MSS.

  • Híbrido - Un ejemplo híbrido que presupone una instalación local de Host Access for the Cloud y monta los archivos de almacén de claves y de confianza existentes del disco en el contenedor de Docker.

  • Extensiones - Un ejemplo de ampliación que muestra cómo actualizar, modificar y personalizar el cliente Web.

  • Equilibrio de carga - Un ejemplo de equilibrador de carga que muestra cómo establecer el equilibro entre contenedores enlazados.

Básico

En este ejemplo básico, se muestra cómo ejecutar la imagen de Docker del servidor de sesión en la herramienta de composición de Docker. En este ejemplo, deberá importar el certificado del servidor MSS en la muestra proporcionada./certs/demo_truststore.bcfks mediante una herramienta similar a KeyStore Explorer. Por defecto, el certificado de MSS se encuentra en /mss/server/etc/<nombre-equipo>.cer. Consulte Protección de las conexiones.

Antes de ejecutar el ejemplo, actualice los valores de MSS_SERVER, HOST_NAME y SERVICE_REGISTRY_PASSWORD en docker-compose.yml.

  • Para iniciar el servicio del servidor de sesión:

    docker-compose up
  • Para ejecutar el servicio en un daemon (modo desconectado):

    docker-compose up -d
  • Para examinar los contenedores en ejecución:

    docker ps

Híbrido

En este ejemplo, hay presente una instalación local de Host Access for the Cloud con archivos de los almacenes de claves y de confianza en el disco. Estos archivos se montarán (copiarán) en el contenedor de Docker.

Antes de ejecutar el ejemplo, actualice los valores de MSS_SERVER, HOST_NAME, SERVER_PORT y SERVICE_REGISTRY_PASSWORD en el archivo .env.

Para iniciar el servicio del servidor de sesión:

  • Copie .env y docker-compose.yml en sessionserver/microservices/sessionserver/.

  • En este directorio, ejecute: docker-compose up -d

Extensiones

Mediante el uso de extensiones y su propio código HTML, CSS o JavaScript, puede actualizar, modificar y personalizar la presentación del cliente Web desde el navegador. Consulte Ampliación del cliente Web para obtener más información.

En este ejemplo, se establece SPRING_PROFILES_ACTIVE en extensions-enabled y se asigna la ubicación de las extensiones en docker-compose.yml.

Antes de ejecutar el ejemplo, actualice los valores de MSS_SERVER, HOST_NAME y SERVICE_REGISTRY_PASSWORD en el archivo .env.

Para iniciar el servicio del servidor de sesión:

docker-compose up -d

También puede optar por ampliar la imagen base de Docker, hacloud/sessionserver, y copiar los archivos de extensión en el contenedor de Docker:

  1. Cree el archivo de Docker que se extenderá desde la imagen de Docker, "hacloud/sessionserver".

    FROM hacloud/sessionserver
        
    COPY ./certs/keystore.bcfks /opt/sessionserver/etc/keystore.bcfks
    COPY ./certs/trustcerts.bcfks /opt/sessionserver/etc/trustcerts.bcfks
    COPY ./extensions /opt/sessionserver/extensions/
  2. Cree la imagen de Docker ampliada y asígnele el nombre extensions.

    docker build -t extensions
  3. Actualice docker compose.yml para utilizar la nueva imagen de extensiones.

    version: '3'
    services:
      sessionserver:
        image: extensions
        environment:
          - LOGGING_FILE=./logs/sessionserver.log
          - LOGGING_FILE_MAXSIZE=10MB
          - LOGGING_FILE_MAXHISTORY=10
          - MSS_SERVER=${MSS_SERVER}
          - SERVICE_REGISTRY_PASSWORD=${SERVICE_REGISTRY_PASSWORD}
          - SPRING_PROFILES_ACTIVE=extensions-enabled
        ports:
          - ${SERVER_PORT}:7443

Equilibrio de carga

HAProxy es un equilibrador de carga. Obtenga más información sobre HAProxy en su sitio Web.

En este ejemplo, se incluye un servicio haproxy en el archivo docker-compose.yml. Este ejemplo utiliza una imagen de haproxy para el equilibro entre contenedores enlazados. En este ejemplo, se utilizan puentes SSL para enlazar los contenedores.

Para proporcionar una comunicación segura entre los clientes y el equilibrador de carga, debe actualizar la propiedad LOAD_BALANCER_CERT del archivo .env con la ubicación del certificado del equilibrador de carga.

Para ayudarle con la prueba, puede generar un certificado autofirmado:

  1. Genere una clave privada exclusiva (KEY):

    sudo openssl genrsa -out mydomain.key 2048
  2. Genere una petición de firma de certificado (CSR):

    sudo openssl req -new -key mydomain.key -out mydomain.csr
  3. Cree un certificado autofirmado (CRT):

    sudo openssl x509 -req -days 365 -in mydomain.csr -signkey mydomain.key -out mydomain.crt
  4. Añada KEY y CERT a loadbalancer.pem:

    sudo cat mydomain.key mydomain.crt > ./etc/loadbalancer.pem

Para iniciar los servicios del servidor de sesión y HAProxy:

docker-compose up -d

-o bien-

docker-compose up --scale sessionserver=n -d

Donde n es el número de instancias del servidor de sesión.

Puede cambiar el número de instancias del servidor de sesión después de que se inicien los servicios:

docker-compose scale sessionserver=n

Para acceder a la página de estadísticas del servidor de sesión y HAProxy:

  • https://server:7443

  • http://server:1936/haproxy?stats

En uso:

  • usuario: admin

  • contraseña: password