For LINUX platformsFor Windows platforms

Despliegue de contenedores Docker utilizando API REST de despliegue

Puede desplegar servidores Liberty o Node.js en contenedores Docker como miembros de un colectivo utilizando las API REST DeployService.

Antes de empezar

Determine los hosts de destino en los cuales desea instalar una imagen de Docker. Instale Docker en los hosts de destino. Cada host de destino necesita RXA o SSH. Consulte Configuración de RXA para operaciones de colectivo de Liberty.

Si va a utilizar Node.js en un contenedor Docker, descargue una versión de Node.js 4.x desde el registro de Docker Hub.

Multimedia Vea: El vídeo Gestión de un entorno políglota local con colectivos WebSphere Liberty en un artículo WASdev complementa el procedimiento en este tema.

Procedimiento

  1. Cree una imagen de Docker.
    1. Utilice un archivo Docker para crear una imagen de Liberty.

      Puede cambiar los siguientes ejemplos de archivo Docker para su entorno. Junto con cada uno de los ejemplos se proporciona un script joinMember que une el servidor miembro en el contenedor de Docker a un controlador colectivo y un script removeMember que elimina el servidor miembro en el contenedor de Docker del colectivo.

    2. Si utiliza un archivo Docker para una imagen de Liberty Network Deployment, configure el archivo server.xml para su uso con el archivo Docker; por ejemplo:
      <server description="Default Server">
         <featureManager>
            <feature>webProfile-6.0</feature>
         </featureManager>
      
         <httpEndpoint id="defaultHttpEndpoint"
                       httpPort="${memberHttpPort}"
                       httpsPort="${memberHttpsPort}" />
      
      </server>
    3. Asegúrese de que el archivo server.xml del controlador colectivo tiene sentencias que definen el nombre de usuario y la contraseña y las variables de despliegue del controlador.
      • Ejemplo de server.xml para una imagen de Liberty Network Deployment:
           <collectiveController user="admin" password="adminpwd" />
        ... 
           <deployVariable name="memberHttpPort" value="9090" increment="1"/> 
           <deployVariable name="memberHttpsPort" value="9453"
        increment="1"/>
      • [16.0.0.3 and later]Ejemplo de server.xml para una imagen de miembro de Node.js:
           <collectiveController user="admin" password="adminpwd" />
        ... 
           <deployVariable name="wlpn.appPort" value="9090" increment="1"/> 
           <deployVariable name="wlpn.adminPort" value="9453" increment="1"/>

      Las variables de despliegue deben establecer valores que permiten a cada miembro tener un número de puerto exclusivo en los hosts de destino. Consulte DeployVariable (deployVariable).

    4. Ejecute el mandato de construcción Docker para crear la imagen.
      1. Copie el archivo Docker y los scripts joinMember y removeMember en un sistema donde Docker esté instalado. Si está utilizando un archivo Docker para una imagen de Liberty Network Deployment, también copie el archivo server.xml especificado en el Dockerfile en el sistema. Coloque los archivos en el mismo directorio.
      2. Abra una ventana de mandatos en el directorio que contiene los archivos.
      3. Ejecute el mandato Docker para crear la imagen:
        docker
        build -t nombre_imagen .
      4. Verifique la creación de la imagen. El mandato siguiente devuelve el nombre de la imagen cuando la creación se ha realizado correctamente.
        imágenes de docker
    5. Opcional: Publique la imagen de Docker en un registro de Docker con un mandato docker push. Consulte Registro Docker si desea más información.
  2. Registre el host Docker de destino con el controlador colectivo.
    El registro de un host permite al controlador colectivo extraer la imagen de Docker del registro para dicho host, así como también acceder a archivos, mandatos y otros recursos en el host. Ejecute el mandato registerHost en la máquina de controlador para registrar el host de destino. Consulte el ejemplo siguiente:
    wlp/bin/collective registerHost targetHost --host=controllerHost --port=controllerHTTPSPort --user=controllerAdmin --password=controllerAdminPassword --rpcUser=osUser --rpcUserPassword=osUserPassword  --autoAcceptCertificates

    Consulte el archivo server.xml del controlador para encontrar los valores para los parámetros --host, --port, --user y --password. Para no utilizar un archivo de claves privado SSH como, por ejemplo, para hosts de destino en sistemas operativos Linux o Windows, incluya un usuario y una contraseña de inicio de sesión del sistema operativo estableciendo los parámetros --rpcUser y --rpcUserPassword. El usuario especificado por --rpcUser debe tener derechos de sistema operativo sobre la ubicación de despliegue de destino.

    Si un host ya está registrado, puede utilizar el mandato updateHost para restablecer la información de registro. Para obtener más información, consulte Registro de sistemas principales con un colectivo de Liberty.

  3. Si la imagen de Docker que se va a desplegar está almacenada en un registro, en lugar de disponible localmente en el host de Docker donde realizará el despliegue, puede configurar el controlador colectivo para acceder al registro. Consulte Configuración de un registro Docker para ser utilizado por un controlador colectivo.
  4. Revise las reglas de despliegue disponibles.
    1. Invoque una API REST que devuelva las reglas de despliegue disponibles. Utilice una herramienta que pueda invocar las API REST para obtener las reglas de despliegue disponibles.
      GET
      https://host_controlador:puerto_controlador/ibm/api/collective/v1/deployment/rule

      La invocación devuelve las reglas de despliegue en la estructura JSON; por ejemplo:

      [16.0.0.3 and later]
      {"rules":
      [
       {"id":"Liberty Docker Rule","description":"Regla de despliegue para contenedores Liberty Docker.","type":"docker","deployCommands":"repository=${dockerRepository};
       registry=${dockerRegistry}; if [ ! $registry ]; then if [ ! $repository];
       then echo 'dockerRegistry y dockerRepository no están configurados en el controlador colectivo, se supone que la imagen de Docker que se debe desplegar está disponible en el host de destino' ;
       docker run -d -e LICENSE=accept -e CONTAINER_NAME=${containerName} -e CONTAINER_HOST=${wlp.deploy.host} --net=host --name=${containerName} ${imageName} ;
       else echo 'No hay ningún dockerRegistry configurado en el controlador colectivo, los despliegues de imagen de Docker están inhabilitados'; failure='true' ; fi;
       else user=${dockerUser}; password=${dockerUserPassword}; email=${dockerUserEmail};
       if [ ! $repository]; then echo 'No hay ningún dockerRepository configurado en el controlador colectivo, los despliegues de imagen de Docker están inhabilitados'; failure='true' ; fi;
       if [ ! $user]; then echo 'No hay ningún dockerUser configurado en el controlador colectivo, los despliegues de imagen de Docker están inhabilitados'; failure='true' ; fi;
       if [ ! $password]; then echo 'No hay ningún dockerUserPassword configurado en el controlador colectivo, los despliegues de imagen de Docker están inhabilitados'; failure='true'; fi;
       if [ ! $email]; then echo 'No hay ningún dockerUserEmail configurado en el controlador colectivo, los despliegues de imagen de Docker están inhabilitados'; failure='true'; fi;
       if [ ! $failure]; then echo 'Iniciar sesión en el registro de Docker en ' $registry ' para el repositorio denominado ${dockerRepository} como usuario ' $user ' y obtener la imagen ${imageName} que se iniciará' ;
       docker logout;
       docker login --username=$user --password=$password --email=$email $registry ; docker pull ${dockerRepository}:${imageName} ;
       docker run -d -e LICENSE=accept -e CONTAINER_NAME=${containerName} -e CONTAINER_HOST=${wlp.deploy.host} --net=host --name=${containerName} ${dockerRepository}:${imageName} ; fi; fi;
       if [ ! $failure]; then echo 'Configurar el contenedor ${containerName} en ejecución' ;
       docker exec -t ${containerName} bash /opt/ibm/docker/joinMember ${containerName} --clusterName=${clusterName}
         --dockerHost=${wlp.deploy.host} --host=${wlp.admin.host}
      --port=${wlp.admin.port}
         --user=${wlp.admin.user} --password=${wlp.admin.password} --keystorePassword=${keystorePassword};
       else false; fi","undeployCommands":"docker start ${containerName}; 
       docker exec -t ${containerName} bash /opt/ibm/docker/removeMember ${containerName}
         --host=${wlp.admin.host} --port=${wlp.admin.port} --user=${wlp.admin.user} --password=${wlp.admin.password}
         --dockerHost=${wlp.deploy.host} && ( docker stop ${containerName};
       docker rm
        ${containerName} )","startCommands":"docker start
        ${containerName}","stopCommands":"docker stop
        ${containerName}","restartCommands":"","inputVariables":[
         {"name":"keystorePassword","type":"password","description":"Contraseña para los almacenes de claves del servidor desplegado","displayName":"Contraseña de almacén de claves"},
         {"name":"clusterName","type":"String","description":"Nombre del
      clúster del contenedor Liberty Docker.","defaultValue":"${imageName}_cluster","displayName":"Nombre de clúster"},
         {"name":"containerName","type":"String","description":"Nombre
      del contenedor Liberty Docker.","defaultValue":"${imageName}_container","displayName":"Nombre de contenedor"},
         {"name":"imageName","type":"dockerImage","description":"Nombre de la imagen de Liberty Docker.","displayName":"Nombre de imagen"}],
        "name":"Contenedor de Docker","default":true,"runtimeTypes":[{"displayName":"Node.js"},{"displayName":"Liberty"}],"packageType":"Contenedor de Docker"
       }
      ]}
    2. Si es necesario, cree sus propias reglas de despliegue añadiendo DeployRules a la configuración de controlador. Consulte Regla de despliegue (deployRule).
  5. Despliegue la imagen de Docker.
    Utilice una herramienta que pueda invocar las API REST para desplegar la imagen de Docker. La regla de despliegue contiene variables que pueden especificar valores de entrada para la invocación, por ejemplo, la imagen de Docker que se utilizará y el nombre de contenedor que se creará. El cuerpo de retorno contiene una señal que puede utilizar para solicitar el estado y los resultados.
    Nota: Utilice la misma Regla Liberty Docker para ambas imágenes, de Liberty Docker y de Node.js Docker.
    POST
    https://host_controlador:puerto_controlador/ibm/api/collective/v1/deployment/deploy
    
    {
       "rule": "Regla de Liberty Docker", 
       "hosts": [ "myHostName" ],
       "variables": [
          { "name":"imageName", "value":"myImageName" },
          { "name":"containerName", "value":"myContainerName" },
          { "name":"clusterName", "value":"myClusterName" },
          { "name":"keystorePassword", "value":"thePassword" }
       ]
    }

    Por ejemplo, la señal de retorno podría ser {"id":3}, que puede utilizar para obtener el estado y los resultados.

Qué hacer a continuación

Solicite y revise el estado y los resultados del despliegue.

  • Obtenga una lista de señales para operaciones de despliegue solicitadas.
    GET
    https://host_controlador:puerto_controlador/ibm/api/collective/v1/deployment/deploy
  • Obtenga un estado abreviado de las operaciones de despliegue. Utilice la señal del paso 4 para {token}. De esta forma para una señal de retorno {"id":3} del paso 4, utilice 3 for {token}.
    GET
    https://host_controlador:puerto_controlador/ibm/api/collective/v1/deployment/{token}/status 
    Durante el despliegue, la API devuelve IN_PROGRESS:
    {"status":{"host_destino":"IN_PROGRESS"}}
    Tras el despliegue, la API devuelve FINISHED:
    {"status":{"host_destino":"FINISHED"}}
  • Obtenga los resultados completos de una operación de despliegue. Utilice la señal del paso 4 para {token}. De esta forma para una señal de retorno {"id":3} del paso 4, utilice 3 for {token}.
    GET
    https://host_controlador:puerto_controlador/ibm/api/collective/v1/deployment/{token}/results
    Una vez completado el despliegue, los resultados contienen información sobre la operación. El ejemplo siguiente muestra resultados para FINISHED:
    {"results":[{"nombre_host":"host_destino","status":"FINISHED","result":0}]}
Anule el despliegue de un contenedor de Docker. No tendrá que especificar una regla de despliegue. La regla utilizada para el despliegue se ha almacenado durante el despliegue. Puede utilizar la regla para la anulación del despliegue. La variable userDir debe ser Docker.
  • Anule el despliegue de un contenedor.
    POST
    https://host_controlador:puerto_controlador/ibm/api/collective/v1/deployment/undeploy
    {     
       "host": "myHostName",
       "userDir":"Docker",     
       "serverName":"myContainerName"
    }
  • Obtenga una lista de señales para operaciones de anulación de despliegue.
    GET
    https://host_controlador:puerto_controlador/ibm/api/collective/v1/deployment/undeploy
    Para obtener el estado y los resultados, siga pasos similares a despliegues.

Icono que indica el tipo de tema Tema de tarea

Nombre de archivo: twlp_deployservice_docker.html