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 허브 레지스트리에서 Node.js 4.x 버전을 다운로드하십시오.

멀티미디어 시청: WASdev 기사의 WebSphere® Liberty 집합체에서 사내 구축형 Polyglot 환경 관리 비디오는 이 주제의 프로시저를 보완합니다.

프로시저

  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 빌드 명령을 실행하여 이미지를 작성하십시오.
      1. Dockerfile과 joinMemberremoveMember 스크립트를 Docker가 설치된 컴퓨터에 복사하십시오. Liberty Network Deployment 이미지용 Docker 파일을 사용 중인 경우 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 규칙을 사용하십시오.
    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