For LINUX platformsFor Windows platforms

使用部署 REST API 部署 Docker 容器

可以使用 DeployService REST API 将 Docker 容器中的 Liberty 或 Node.js 服务器作为集合体的成员进行部署。

开始之前

确定要安装 Docker 映像的目标主机。将 Docker 安装在目标主机上。每个目标主机都需要 RXA 或 SSH。请参阅设置 RXA 以执行 Liberty 集合体操作

如果您将使用 Docker 容器中的 Node.js,请从 Docker Hub registry 中下载 Node.js 4.x 版本。

多媒体 观看:WASdev 文章中的管理包含 WebSphere® 集合体的本地多语种环境视频对本主题中的过程进行了补充。

过程

  1. 创建 Docker 映像。
    1. 使用 Dockerfile 创建 Liberty 映像。

      您可以更改您所使用的环境的以下 Docker 文件示例。为每个示例提供了 joinMember 脚本和 removeMember 脚本,joinMember 脚本用于向集合体控制器中加入 Docker 容器中的成员服务器,removeMember 脚本用于从集合体中移除 Docker 容器中的成员服务器。

    2. 如果正将 Docker 文件用于 Liberty Network Deployment 映像,请配置 server.xml 文件以使其与 Docker 文件配合使用;例如:
      <server description="Default Server">
         <featureManager>
            <feature>webProfile-6.0</feature>
         </featureManager>
      
         <httpEndpoint id="defaultHttpEndpoint"
                       httpPort="${memberHttpPort}"
                       httpsPort="${memberHttpsPort}" />
      
      </server>
    3. 确保集合体控制器 server.xml 文件包含用于定义控制器用户名及密码和部署变量的语句。
      • Liberty Network Deployment 映像的示例 server.xml
           <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]Node.js 成员的 server.xml 示例映像:
           <collectiveController user="admin" password="adminpwd" />
        ... 
           <deployVariable name="wlpn.appPort" value="9090" increment="1"/> 
           <deployVariable name="wlpn.adminPort" value="9453" increment="1"/>

      部署变量必须设置使每个成员都能够在目标主机上具有唯一端口号的值。请参阅 DeployVariable (deployVariable)

    4. 运行 Docker 构建命令以创建映像。
      1. 将 Docker 文件以及 joinMemberremoveMember 脚本复制到安装了 Docker 的计算机。 如果您正在将 Docker 文件用于 Liberty Network Deployment 映像,还请将 Docker 文件中指定的 server.xml 文件复制到计算机。将这些文件放在同一目录中。
      2. 在保存这些文件的目录中打开命令窗口。
      3. 运行 Docker 命令以创建映像:
        docker build -t image_name
      4. 验证映像创建。如果创建成功,那么以下命令会返回映像名称。
        docker images
    5. 可选: 使用 docker push 命令在 Docker 注册表上发布 Docker 映像。有关更多信息,请参阅 Docker Registry
  2. 向集合体控制器注册目标 Docker 主机。
    注册主机使得集合体控制器可以将 Docker 映像从注册表拉取到该主机,以及访问该主机上的文件、命令和其他资源。在控制器机器上运行 registerHost 命令以注册目标主机。请参阅以下示例:
    wlp/bin/collective registerHost targetHost --host=controllerHost --port=controllerHTTPSPort --user=controllerAdmin --password=controllerAdminPassword --rpcUser=osUser --rpcUserPassword=osUserPassword  --autoAcceptCertificates

    请查看控制器的 server.xml 文件以查找 --host--port--user--password 参数的值。要避免使用 SSH 专用密钥文件(例如,对于 Linux 或 Windows 操作系统上的目标主机),请通过设置 --rpcUser--rpcUserPassword 参数来添加操作系统登录用户和密码。--rpcUser 指定的用户必须具有对目标部署位置的操作系统权限。

    如果已注册主机,那么可使用 updateHost 命令重置注册信息。有关更多信息,请参阅向 Liberty 集合体注册主机

  3. 如果要部署的 Docker 映像存储在注册表中而不在将执行部署的 Docker 主机的本地位置,那么可以将集合体控制器配置为访问该注册表。请参阅配置供集合体控制器使用的 Docker 注册表
  4. 查看可用的部署规则。
    1. 调用用于返回可用部署规则的 REST API。 使用可调用 REST API 的工具获取可用部署规则。
      GET https://controller_host:controller_port/ibm/api/collective/v1/deployment/rule

      该调用将以 JSON 结构返回部署规则;例如:

      [16.0.0.3 and later]
      {"rules":
      [
       {"id":"Liberty Docker Rule","description":"Deploy rule for Liberty Docker containers.","type":"docker","deployCommands":"repository=${dockerRepository};
       registry=${dockerRegistry}; if [ ! $registry ]; then if [ ! $repository];
       then echo 'The dockerRegistry and dockerRepository are not configured in the collective controller, the Docker image to be deployed is assumed available on the target host' ;
       docker run -d -e LICENSE=accept -e CONTAINER_NAME=${containerName} -e CONTAINER_HOST=${wlp.deploy.host} --net=host --name=${containerName} ${imageName} ;
       else echo 'No dockerRegistry configured in the collective controller, Docker image deployments are disabled'; failure='true' ; fi;
       else user=${dockerUser}; password=${dockerUserPassword}; email=${dockerUserEmail};
       if [ ! $repository]; then echo 'No dockerRepository configured in the collective controller, Docker image deployments are disabled'; failure='true' ; fi;
       if [ ! $user]; then echo 'No dockerUser configured in the collective controller, Docker image deployments are disabled'; failure='true' ; fi;
       if [ ! $password]; then echo 'No dockerUserPassword configured in the collective controller, Docker image deployments are disabled'; failure='true'; fi;
       if [ ! $email]; then echo 'No dockerUserEmail configured in the collective controller, Docker image deployments are disabled'; failure='true'; fi;
       if [ ! $failure]; then echo 'Login to the Docker registry at ' $registry ' for repository named ${dockerRepository} as user ' $user ' and pull the image ${imageName} to be started' ;
       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 'Configure the running container ${containerName}' ;
       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":"Password for keystores of the deployed server","displayName":"Keystore Password"},
         {"name":"clusterName","type":"String","description":"Name of Liberty Docker container cluster.","defaultValue":"${imageName}_cluster","displayName":"Cluster Name"},
         {"name":"containerName","type":"String","description":"Name of Liberty Docker container.","defaultValue":"${imageName}_container","displayName":"Container Name"},
         {"name":"imageName","type":"dockerImage","description":"Name of Liberty Docker image.","displayName":"Image Name"}],
        "name":"Docker Container","default":true,"runtimeTypes":[{"displayName":"Node.js"},{"displayName":"Liberty"}],"packageType":"Docker Container"
       }
      ]}
    2. 必要时,通过将 DeployRules 添加到控制器配置来创建您自己的部署规则。请参阅部署规则 (deployRule)
  5. 部署 Docker 映像。
    使用可调用 REST API 的工具部署 Docker 映像。部署规则包含可用来指定调用的输入值(例如,要使用的 Docker 映像和要创建的容器名称)的变量。返回主体包含可用来请求获取状态和结果的令牌。
    注:Liberty Docker 映像和 Node.js Docker 映像使用同一 Liberty Docker Rule
    POST https://controller_host:controller_port/ibm/api/collective/v1/deployment/deploy
    
    {
       "rule": "Liberty Docker Rule", 
       "hosts": [ "myHostName" ],
       "variables": [
          { "name":"imageName", "value":"myImageName" },
          { "name":"containerName", "value":"myContainerName" },
          { "name":"clusterName", "value":"myClusterName" },
          { "name":"keystorePassword", "value":"thePassword" }
       ]
    }

    例如,返回令牌可以是 {"id":3},您可以使用该令牌来获取状态和结果。

下一步做什么

请求获取并查看部署状态和结果。

  • 获取用于所请求部署操作的令牌的列表。
    GET https://controller_host:controller_port/ibm/api/collective/v1/deployment/deploy
  • 获取部署操作的短状态。对 {token} 使用步骤 4 中的令牌。因此,对于步骤 4 中的返回令牌 {"id":3},请对 {token} 使用 3
    GET https://controller_host:controller_port/ibm/api/collective/v1/deployment/{token}/status 
    部署期间,该 API 会返回 IN_PROGRESS
    {"status":{"target_host":"IN_PROGRESS"}}
    部署完成后,该 API 会返回 FINISHED
    {"status":{"target_host":"FINISHED"}}
  • 获取部署操作的完成结果。对 {token} 使用步骤 4 中的令牌。因此,对于步骤 4 中的返回令牌 {"id":3},请对 {token} 使用 3
    GET https://controller_host:controller_port/ibm/api/collective/v1/deployment/{token}/results
    部署完成后,结果将包含有关此操作的信息。以下示例显示 FINISHED 的结果:
    {"results":[{"host_name":"target_host","status":"FINISHED","result":0}]}
取消部署 Docker 容器。您无需指定部署规则。用于部署的规则在部署时已进行存储。可以将该规则用于取消部署。userDir 变量必须为 Docker
  • 取消部署容器。
    POST https://controller_host:controller_port/ibm/api/collective/v1/deployment/undeploy
    {     
       "host": "myHostName",
       "userDir":"Docker",     
       "serverName":"myContainerName"
    }
  • 获取用于取消部署操作的令牌的列表。
    GET https://controller_host:controller_port/ibm/api/collective/v1/deployment/undeploy
    要获取状态和结果,请完成类似于部署的步骤。

用于指示主题类型的图标 任务主题

文件名:twlp_deployservice_docker.html