For LINUX platformsFor Windows platforms

デプロイメント REST API を使用した Docker コンテナーのデプロイ

DeployService REST API を使用して、Docker コンテナー内の Liberty または Node.js サーバーを、集合のメンバーとしてデプロイできます。

始める前に

Docker イメージのインストール場所となるターゲット・ホストを決定します。それらのターゲット・ホストに Docker をインストールします。 ターゲット・ホストごとに RXA または SSH が必要です。Liberty 集合操作用 RXA のセットアップを参照してください。

Docker コンテナーで Node.js を使用する場合は、Docker Hub レジストリーから Node.js の 4.x バージョンをダウンロードしてください。

マルチメディア ご覧ください: このトピックの手順を補足する説明が、WASdev 記事内のビデオ「Managing an On-Premise, Polyglot Environment with WebSphere® Liberty Collectives」に示されています。

手順

  1. Docker イメージを作成します。
    1. Dockerfile を使用して Liberty イメージを作成します。

      以下の Dockerfile 例を環境に合わせて変更できます。各例と共に、Docker コンテナー内のメンバー・サーバーを集合コントローラーに結合する joinMember スクリプトと、 Docker コンテナー内のメンバー・サーバーを集合から除去する removeMember スクリプトが提供されています。

    2. Liberty Network Deployment イメージ用の Dockerfile を使用する場合、その Dockerfile と共に使用する server.xml ファイルを構成します。以下に例を示します。
      <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 の build コマンドを実行してイメージを作成します。
      1. Dockerfile、joinMember スクリプト、および removeMember スクリプトを、Docker がインストールされているコンピューターにコピーします。Liberty Network Deployment イメージ用の Dockerfile を使用している場合、その 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 の各パラメーターの値を見つけます。 Linux や Windows などのオペレーティング・システム上のターゲット・ホストの場合などに、SSH 秘密鍵ファイルを使用しない場合は、 --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