適用於 LINUX 平台適用於 Windows 平台

使用部署 REST API 來部署 Docker 儲存器

您可以使用 DeployService REST API,將 Docker 儲存器中的 Liberty 或 Node.js 伺服器部署成群體的成員。

開始之前

決定要在其中安裝 Docker 映像檔的目標主機。將 Docker 安裝在目標主機上。每一個目標主機都需要 RXA 或 SSH。請參閱 設定 RXA 以執行 Liberty 群體作業

如果您將在 Docker 儲存器中使用 Node.js,請從 Docker Hub 登錄下載 Node.js 4.x 版。

多媒體 觀看:WASdev 文章中的利用 WebSphere® Liberty 群體來管理內部部署的 Polyglot 環境視訊,會補充說明這個主題中的程序。

程序

  1. 建立 Docker 映像檔。
    1. 使用 Dockerfile 來建立 Liberty 映像檔。

      您可以將下列 Dockerfile 範例變更為適合您的環境。每一個範例都隨附 joinMember Script,可將 Docker 儲存器中的成員伺服器加入群體控制器,還有 removeMember Script,可將 Docker 儲存器中的成員伺服器從群體移除。

    2. 如果您使用 Dockerfile 建立 Liberty Network Deployment 映像檔,請配置 server.xml 檔,以便與 Dockerfile 搭配使用;例如:
      <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 以及更新版本]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)

    4. 執行 Docker build 指令,來建立映像檔。
      1. 將 Dockerfile 及joinMemberremoveMember Script 複製到已安裝 Docker 的電腦中。如果您使用 Docker 檔來建立 Liberty Network Deployment 映像檔,則也要將 Dockerfile 中指名的 server.xml 檔複製到此電腦。將檔案放在相同目錄中。
      2. 在保留檔案的目錄中開啟指令視窗。
      3. 執行 Docker 指令,以建立映像檔:
        docker build -t image_name
      4. 驗證映像檔已建立。下列指令會在建立成功時傳回映像檔名稱。
        docker images
    5. 選擇性的: 使用 docker push 指令,將 Docker 映像檔公佈在 Docker 登錄上。如需相關資訊,請參閱 Docker 登錄
  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 以及更新版本]
      {"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 Rule 同時用於 Liberty Docker 映像檔和 Node.js Docker 映像檔。
    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
  • 取得部署作業的簡短狀態。將步驟 4 中的記號用於 {token}。因此,以步驟 4 中的 {"id":3} 傳回記號來說,請將 3 用於 {token}
    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"}}
  • 取得部署作業的完整結果。將步驟 4 中的記號用於 {token}。因此,以步驟 4 中的 {"id":3} 傳回記號來說,請將 3 用於 {token}
    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