J-Jobs

Guides -J-Jobs Orchestrator v2.4 How-To 가이드

J-Jobs Orchestrator How-To 가이드

최종 작성일 : 2019년 7월

기준 버전 : J-Jobs v2.4

Copyright ⓒ LG CNS LG CNS의 사전 승인 없이 본 내용의 전부 또는 일부에 대한 복사, 배포 사용을 금합니다.

본 문서는 J-Jobs Orchestrator 사용자의 이해를 돕기 위한 문서로 Manager 의 메뉴 구성 중심으로 작성되어 있다.

J-Jobs with Docker

J-Jobs 에서는 Docker Container를 Docker CLI 기반으로 제어할 수 있는 기능을 제공한다.

Docker 템플릿을 이용하여 J-Jobs Agent가 위치한 Host에서 Docker Container를 구동하거나 중지할 수 있다.

J-Jobs Agent가 위치한 Host/VM인스턴스/Container는 기본적으로 Docker를 사용할 수 있는 환경이 구성되어 있어야 한다.

J-Jobs with Docker 구성

J-Jobs를 이용하여 Docker Container를 제어하고자 하는 경우 크게 두 가지 방식으로 구성 가능하다. 각 구성 방식에 대한 아키텍처는 다음 그림을 참고한다.

본 문서에서 사용되는 용어는 다음과 같이 정의한다.

  • jjobs-instance : J-Jobs 풀버전이 설치되어 있는 Host/VM인스턴스임

    단, J-Jobs Manager 사용을 위하여 방화벽 설정을 이용하여 외부에서 접근 가능하도록 포트(7065)를 열어둔다.

  • jjobs-agent00~NN : J-Jobs Agent가 설치된 Host/VM인스턴스 혹은 jjobs-image를 이용하여 container로 구동중인 J-Jobs Agent가 속한 Host/VM인스턴스

  • jjobs-image : J-Jobs Agent가 설치된 Docker 이미지

  • Docker Registry : Docker Hub 혹은 프로젝트 자체적으로 사용중인 Docker Registry

  • Docker Image : Docker Hub에서 다운로드 받은 이미지 + Docker build를 사용해서 생성된 사용자 이미지

  • Internal IP : 내부 망에서 할당된 IP (예, AWS의 경우 Private IP)

  • External IP : 외부 망에서 할당된 IP (예, AWS의 경우 Public IP)

Docker와 독립적인 J-Jobs Agent를 구성

Docker가 설치된 Host/인스턴스에 각각 J-Jobs Agent를 설치하여 J-Jobs Server와 통신하며 배치 작업 요청 등을 처리하는 구조로서, J-Jobs Server를 통해 작업 요청(Docker CLI 명령)을 받으면 J-Jobs Agent는 해당하는 Docker CLI 명령을 J-Jobs Agent가 위치한 Host/인스턴스에 설치된 Docker로 전달하는 형태로 Docker Container를 제어한다.

Docker Container에 J-Jobs Agent를 구성

Docker가 설치된 Host/VM 인스턴스에서 jjobs-image를 이용해서 J-Jobs Agent를 Container로 구동하여 J-Jobs Server와 통신하며 배치 작업 요청 등을 처리하는 구조로서, J-Jobs Server를 통해 작업 요청(Docker CLI 명령)을 받으면 J-Jobs Agent는 해당하는 Docker CLI 명령을 J-Jobs Agent가 구동 중인 Container에서 수행한다. (추후 업데이트 필요!!)

J-Jobs 설치

기본 유틸 설치

J-Jobs 의 원할한 설치를 위해 아래 명령을 실하여 필요한 유틸을 설치한다.

  • sudo yum install zip -y

  • sudo yum install unzip -y

  • sudo yum install java-1.8.0-openjdk-devel.x86_64 -y

  • javac 의 경로를 확인하고 link 명령을 사용하여 설치된 jdk의 절대 경로를 확인한다. 추후 J-Jobs 설치 시에 사용된다.

    [jjobs@jjobs-instance ~]$ which javac
    /usr/bin/javac
    [jjobs@jjobs-instance ~]$ readlink -f /usr/bin/javac
    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin/javac
    

J-Jobs Meta DB 설치 (PostgreSQL)

J-Jobs에서 사용하는 기본 DB(PostgreSQL)를 설치하여 사용하는 것을 기본으로 설명한다. 실제 프로젝트에서는 Oracle, MariaDB, H2, MS-SQL 등 타 DB 사용이 가능하다.

  • DB설치를 위해 전달 받은 설치파일(jjob_DB_installer_linux_x64.sh)을 Host/VM인스턴스로 복사하고 실행 권한을 부여한다.

    [jjobs@jjobs-instance ~]$ chmod 755 jjob_DB_installer_linux_x64.sh
    [jjobs@jjobs-instance ~]$ ll
    total 22064
    -rwxr-xr-x. 1 jjobs jjobs 22591109 Jul  9 06:10 jjob_DB_installer_linux_x64.sh
    [jjobs@jjobs-instance ~]$
    
  • 필요한 폴더를 미리 만들어 둔다.

    [jjobs@jjobs-instance ~]$ mkdir pgsql
    [jjobs@jjobs-instance ~]$ cd pgsql/
    [jjobs@jjobs-instance pgsql]$ mkdir engn && mkdir data && mkdir log
    [jjobs@jjobs-instance pgsql]$ ll
    total 0
    drwxrwxr-x. 2 jjobs jjobs 6 Jul  9 06:22 data
    drwxrwxr-x. 2 jjobs jjobs 6 Jul  9 06:22 engn
    drwxrwxr-x. 2 jjobs jjobs 6 Jul  9 06:22 log
    [jjobs@jjobs-instance pgsql]$ cd ..
    [jjobs@jjobs-instance ~]$
    
  • 다음과 같이 제공된 설치 파일을 실행하여 DB를 설치한다.

    [jjobs@jjobs-instance ~]$ ./jjob_DB_installer_linux_x64.sh \
    --base_path /home/jjobs/pgsql \
    --install_kind B \
    --db_home_path /home/jjobs/pgsql/engn \
    --db_data_path /home/jjobs/pgsql/data \
    --db_log_path /home/jjobs/pgsql/log \
    --db_ip 127.0.0.1 \
    --db_port 5432 \
    --db_user jjobs \
    --db_pswd jjobs1234 \
    --db_name jjobs \
    --db_vip 127.0.0.1
    
  • 라이선스 승인 단계에서 y를 입력하여 설치를 진행하여 아래와 같이 나오면 성공이며, jjobs 롤이 이미 있다는 에러는 넘겨도 상관없다.

    ...
    waiting for server to start.... done
    server started
    createuser: creation of new role failed: ERROR:  role "jjobs" already exists
    ALTER ROLE
    CREATE ROLE
    CREATE ROLE
    waiting for server to shut down.... done
    server stopped
    waiting for server to start.... done
    server started
    waiting for server to shut down.... done
    server stopped
       ...... Done
    =======================================================
     Program Install Success
    =======================================================
    [jjobs@jjobs-instance ~]$
    

J-Jobs 기본 설치

사전에 jjobs-instance라고 정의한 J-Jobs 풀버전이 설치되어 있는 Host/VM인스턴스를 구성하고자 하므로, 설치 파일의 Full 옵션을 이용해 한번에 Manager, Server, Agent를 설치한다. J-Jobs 설치와 관련된 자세한 사항은 설치_가이드를 참고한다.

  • 설치파일(jjob_installer_linux_x64_2.3.5_yyyymmdd)을 Host/VM인스턴스로 복사하고 실행 권한을 부여한다.

    [jjobs@jjobs-instance ~]$ chmod 755 jjob_installer_linux_x64_2.3.5_20190704
    [jjobs@jjobs-instance ~]$ ll
    total 337944
    -rwxr-xr-x. 1 jjobs jjobs  22591109 Jul  9 06:10 jjob_DB_installer_linux_x64.sh
    -rwxr-xr-x. 1 jjobs jjobs 323460257 Jul  9 06:36 jjob_installer_linux_x64_2.3.5_20190704
    drwxrwxr-x. 5 jjobs jjobs        65 Jul  9 06:25 pgsql
    [jjobs@jjobs-instance ~]$
    
  • 전체 설치 스크립트를 실행한다. java_path 항목은 미리 확인해둔 java 설치 경로를 이용한다.

    jdbc_url 의 DB IP는 127.0.0.1 이 아닌 Host/VM인스턴스의 Internal IP를 사용해야 한다.

    이유는 다른 Host/VM인스턴스에 설치된 J-Jobs Agent가 접속할 수 있도록 설정하기 위함이다.

    [jjobs@jjobs-instance ~]$ ./jjob_installer_linux_x64_2.3.5_20190704 \
    --base_path /home/jjobs/jjobs \
    --install_kind F \
    --install_mode I \
    --java_path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64 \
    --use_postgresql \
    --jdbc_url 'jdbc:postgresql://10.146.0.2:5432/jjobs' \
    --dbms_user jjobs \
    --dbms_pswd jjobs1234 \
    --use_dedicated_man_was \
    --man_web_port 7065 \
    --svr_service_web_port 7075 \
    --svr_cotrol_base_port 17075 \
    --agnt_name agent1 \
    --agnt_svr_group 1 \
    --agnt_group 0 \
    --agnt_startup_svc_protocol http \
    --agnt_startup_svc_context jjob-server \
    --agnt_startup_svc_domain 127.0.0.1 \
    --agnt_startup_svc_port 7075
    
  • 라이선스 승인 단계에서 y를 입력하여 설치를 진행하여 아래와 같이 나오면 성공이다.

    1. Loading information.
       ...... Done
    2. Making configuration.
       ...... Done
    3. Preparing installation.
    unpacking.... jjob-server
    done.
    unpacking.... jjob-manager
    done.
    repacking.... jjob-server
    done.
    repacking.... jjob-manager
    done.
       ...... Done
    4. Installing.
       ...... Done
    =======================================================
     Program Install Success
    =======================================================
    [jjobs@jjobs-instance ~]$
    
  • jjobs 폴더 하위에는 manager, server, agent 폴더로 구성되어 있으며 각각 실행, 중지 스크립트가 생성되었음을 확인한다.

    [jjobs@jjobs-instance ~]$ cd jjobs
    [jjobs@jjobs-instance jjobs]$ ll
    total 32
    drwxrwxr-x. 16 jjobs jjobs  194 Jul  9 06:41 agent
    -rw-r--r--.  1 jjobs jjobs 5550 Aug  5  2018 License.txt
    drwxrwxr-x.  9 jjobs jjobs  160 Jul  9 06:41 manager
    drwxrwxr-x.  2 jjobs jjobs    6 Jul  9 06:41 mft
    drwxrwxr-x.  9 jjobs jjobs  160 Feb 13 15:37 server
    -rwxr-xr-x.  1 jjobs jjobs  204 Jul  9 06:41 start_agent.sh
    -rwxr-xr-x.  1 jjobs jjobs  185 Jul  9 06:41 start_manager.sh
    -rwxr-xr-x.  1 jjobs jjobs  459 Jul  9 06:41 start_server.sh
    -rwxr-xr-x.  1 jjobs jjobs  167 Jul  9 06:41 stop_agent.sh
    -rwxr-xr-x.  1 jjobs jjobs  134 Jul  9 06:41 stop_manager.sh
    -rwxr-xr-x.  1 jjobs jjobs  349 Jul  9 06:41 stop_server.sh
    [jjobs@jjobs-instance jjobs]$
    

J-Jobs Agent 추가 설치

사전에 jjobs-agent00 ~ jjobs-agentNN으로 정의한 J-Jobs Agent가 설치되어 있는 Host/VM인스턴스를 구성하거나 J-Jobs Agent를 Container로 구성하는 경우에 해당한다.

Docker와 독립적인 J-Jobs Agent 설치하기

J-Jobs Agent 설치 대상 Host/VM인스턴스에 다음과 같은 순서로 J-Jobs Agent를 설치한다.

  • zip, unzip, openjdk를 설치한다.

  • javac 의 경로를 확인하고 link 명령을 사용하여 설치된 jdk의 절대 경로를 확인한다.

  • 다음과 같이 설치 스크립트를 실행한다. java_path 항목은 미리 확인해둔 java 설치 경로를 이용하고, startup_url 항목은 jjobs-instance의 Internal IP로 설정한다.

    [jjobs@jjobs-agent00 ~]$ ./jjob_installer_linux_x64_2.3.5_20190704 \
    --base_path /home/jjobs \
    --install_kind A \
    --install_mode I \
    --java_path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64 \ 
    --svr_group 1 --agnt_group 0 --startup_url http://10.146.0.2:7065/jjob-server
    

Docker Container로 J-Jobs Agent 설치하기

(추후 업데이트) : DockerHub 이용하여 pull

Docker 설치

Docker 직접 설치

본 문서에서는 Docker CE를 설치하고 이를 기반으로 설명한다. Ubuntu, Debian, CentOS, Redhat 등 Docker CE 설치가 가능한 모든 OS를 지원한다. 본 문서에서는 CentOS 7을 기준으로 설치 과정을 설명하고, 타 OS 사용 시에는 별첨에서 가이드하고 있는 설치 URL을 참고하여 설치한다.

단, Docker CE 18 이상 설치를 권장한다.

Docker CE 17 이하 버전에서는 Docker 템플릿에서 제공되는 Dockerfile 편집 기능 사용 시에 Docker 내부 오류가 발생할 수 있다. 예를 들어 임시로 생성되는 Dockerfile의 절대경로와 Dockerfile 경로/Container 작업 디렉토리 항목에서 설정된 경로와 다른 경우 오류가 발생한다.

  • 기존에 설치된 버전을 삭제한다. 설치된 버전을 찾을 수 없다는 오류는 무시하면 된다.

    [jjobs@jjobs-agent00 ~]$ sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  • 필수 패키지를 설치한다.

    [jjobs@jjobs-agent00 ~]$ sudo yum install -y yum-utils \
      device-mapper-persistent-data lvm2
    
  • Docker CE 설치 파일을 제공하는 저장소를 등록한다.

    [jjobs@jjobs-agent00 ~]$ sudo yum-config-manager \
        --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  • Docker CE와 containerd, Docker CLI를 최신 버전으로 설치한다.

    [jjobs@jjobs-agent00 ~]$ sudo yum install docker-ce docker-ce-cli containerd.io
    

    Docker CE의 특정 버전을 설치하고자 하는 경우에는 다음과 같이 입력한다.

    sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
    
  • Docker를 구동한다.

    [jjobs@jjobs-agent00 ~]$ sudo systemctl start docker
    
  • hello-world 이미지를 실행하여, Docker가 정상적으로 설치되었음을 확인한다.

    [jjobs@jjobs-agent00 ~]$ sudo docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    1b930d010525: Pull complete
    Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
    
  • Docker를 root가 아닌 특정 사용자가 사용하기 위해, 다음 명령을 수행하여 docker 그룹에 특정 사용자(jjobs)를 추가한다. 사용자 계정으로 로그아웃 한 뒤, 다시 로그인하면 적용된다.

    [jjobs@jjobs-agent00 ~]$ sudo usermod -aG docker jjobs
    

에이전트 그룹 설정의 전처리 스크립트를 이용한 Docker 사전 설치

[관리자 > 시스템 설정 > 에이전트 설정]에서 제공하는 에이전트 그룹 설정의 전처리 스크립트 항목에 Docker 설치 관련 명령을 저장한다.

에이전트 그룹 설정의 전처리 스크립트 항목에 설정된 명령이 있는 경우에 J-Jobs Agent가 구동될 때 전처리 스크립에 정의된 명령을 실행한다. 참고로 이미 Docker가 설치되어 있는 경우에는 설치 과정이 skip(Nothing to do) 된다.

J-Jobs Agent Custom Docker Image 생성

(추후 업데이트)

J-Jobs 실행

J-Jobs 실행 (at jjobs-instace)

설정 및 설치가 끝났으면 jjobs-instace로 다시 접속하여 필요한 설정을 마무리 한다.

J-Jobs Meta DB를 실행(PostgreSQL)

[jjobs@jjobs-instance jjobs]$ sh /home/jjobs/pgsql/engn/start_db.sh
waiting for server to start.... done
server started
[jjobs@jjobs-instance jjobs]$

J-Jobs Manager 실행

/home/jjobs/jjobs 에서 실행하며, 중간에 발생하는 에러는 테이블이 존재하지 않아 발생하는 것으로 최초 실행에서는 정상이다. 확인 후 Ctrl+C 로 빠져나온다.

[jjobs@jjobs-instance jjobs]$ ./start_manager.sh
Using CATALINA_BASE:   /home/jjobs/jjobs/manager
Using CATALINA_HOME:   /home/jjobs/jjobs/manager
Using CATALINA_TMPDIR: /home/jjobs/jjobs/manager/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
Using CLASSPATH:       /home/jjobs/jjobs/manager/bin/bootstrap.jar:/home/jjobs/jjobs/manager/bin/tomcat-jul i.jar
Tomcat started.
...
...
...
[M][2019-07-09 07:01:08,802][INFO ] HV000001: Hibernate Validator 5.2.1.Final
[M][2019-07-09 07:01:10,430][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 07:01:05 UTC 2019]; parent: Root WebApplicationContext
[M][2019-07-09 07:01:10,573][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 07:01:05 UTC 2019]; parent: Root WebApplicationContext
[M][2019-07-09 07:01:10,737][INFO ] Mapped URL path [/repository/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
[M][2019-07-09 07:01:20,200][INFO ] FrameworkServlet 'servlet': initialization completed in 15155 ms
09-Jul-2019 07:01:20.245 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /home/jjobs/jjobs/manager/webapps/jjob-manager.war has finished in 37,784 ms
09-Jul-2019 07:01:20.259 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-7065"]
09-Jul-2019 07:01:20.293 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-6994"]
09-Jul-2019 07:01:20.295 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 37949 ms
^C
[jjobs@jjobs-instance jjobs]$
  • http://ExternalIP:7065/jjob-manager 접속하여 로그인 화면에서 root/jjobs1234 계정으로 로그인하면 메타테이블이 없음 확인창이 뜬다. (해당 메시지는 최초 설치후 실행에서만 볼 수 있다)

  • 확인을 눌러 메타 테이블 생성을 진행한다.

  • 우측 상단의 로그인 화면으로 이동을 눌러 다시 root계정으로 로그인을 한다.
  • 설치/제거 메뉴의 우측 상단의 초기화 마법사를 눌러 초기화를 진행한다 (설치_가이드에서 상세 확인할 수 있다.)

라이선스는 j-jobs@lgcns.com 으로 문의하여 발급 받아야 한다.

  • 로그아웃을 하고 ADMINISTRATOR계정으로 로그인을 한다. (초기화 마법사에서 설정한 ID/PW를 이용한다.)

  • 관리자 > 시스템설정 > 서버설정 화면에서 서버 편집을 눌러 통신정보 탭의 최대 연결수를 조정한다.

    하나의 에이전트는 3개의 tcp라인을 사용하기에 기본설정 10은 최대 3개의 에이전트가 연결될 수 있다. (Bad case)

J-Jobs Server 실행

/home/jjobs/jjobs 에서 실행하며 아래처럼 에러없이 로그가 보이면 성공이다

[jjobs@jjobs-instance jjobs]$ ./start_server.sh
Using CATALINA_BASE:   /home/jjobs/jjobs/server
Using CATALINA_HOME:   /home/jjobs/jjobs/server
Using CATALINA_TMPDIR: /home/jjobs/jjobs/server/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
Using CLASSPATH:       /home/jjobs/jjobs/server/bin/bootstrap.jar:/home/jjobs/jjobs/server/bin/tomcat-juli.jar
Using CATALINA_PID:    server.pid
Existing PID file found during start.
Removing/clearing stale PID file.
Tomcat started.
[S][2019-07-09 08:17:00,652][INFO ] Closing Root WebApplicationContext: startup date [Tue Jul 09 08:16:51 UTC 2019]; root of context hierarchy
[S][2019-07-09 08:17:00,672][INFO ] Shutting down EhCache CacheManager
...
...
...
[S][2019-07-09 08:30:52,637][INFO ] HV000001: Hibernate Validator 5.2.1.Final
[S][2019-07-09 08:30:53,971][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 08:30:49 UTC 2019]; parent: Root WebApplicationContext
[S][2019-07-09 08:30:54,090][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 08:30:49 UTC 2019]; parent: Root WebApplicationContext
[S][2019-07-09 08:30:54,204][INFO ] Mapped URL path [/repository/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
[S][2019-07-09 08:30:54,405][INFO ] FrameworkServlet 'servlet': initialization completed in 4542 ms
09-Jul-2019 08:30:54.432 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /home/jjobs/jjobs/server/webapps/jjob-server.war has finished in 29,214 ms
09-Jul-2019 08:30:54.451 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-7075"]
09-Jul-2019 08:30:54.601 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-7004"]
09-Jul-2019 08:30:54.734 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 29614 ms
  • 서버 기동 정상여부는 모니터링 > 서버 화면에서 확인 할 수 있다.

J-Jobs Agent 실행

먼저 start_agent.sh 파일의 마지막 내용이 아래와 같은지 확인하고 아니라면 수정하여 저장한다.

...

./startdaemon.sh 0 1 http x.x.x.x 7075 /jjob-server jjob 0 agent

  • /home/jjobs/jjobs 에서 실행하며 프로세스 확인은 설치_가이드를 참고한다.

    [jjobs@jjobs-instance jjobs]$ ./start_agent.sh
    JAVA_HOME = /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
    BATCH_HOME = /home/jjobs/jjobs/agent
     ready to stop
    ... cleaning PID
    [jjobs@jjobs-instance jjobs]$
    
  • 정상 실행이 되었다면 모니터링 > 서버 화면에서 다음처럼 확인 할 수 있다.

J-Jobs Agent 실행 (at jjobs-agent00 ~ jjobs-agentNN)

Docker와 독립적인 J-Jobs Agent 실행하기

먼저 start_agent.sh 파일의 마지막 내용이 아래와 같은지 확인하고 아니라면 수정하여 저장한다.

단, IP가 jjobs-instance의 Internal IP로 설정되어야 한다.

...

./startdaemon.sh 0 1 http x.x.x.x 7075 /jjob-server jjob 0 AgentName

  • /home/jjobs/jjobs 에서 실행하며 프로세스 확인은 설치_가이드를 참고한다.

    [jjobs@jjobs-agent00 jjobs]$ ./start_agent.sh
    JAVA_HOME = /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
    BATCH_HOME = /home/jjobs/jjobs/agent
     ready to stop
    ... cleaning PID
    [jjobs@jjobs-agent00 jjobs]$
    
  • 정상 실행이 되었다면 모니터링 > 서버 화면에서 연결 상태를 확인 할 수 있다.

Docker Container로 J-Jobs Agent 실행하기

(추후 업데이트)

  • DockerHub pull 받은 image를 이용하여 docker run
  • J-Jobs Agent Custom Docker Image를 이용하여 docker run

Docker 템플릿

Docker 템플릿은 Docker를 제어하기 위해, Docker CLI를 실행 시키는 Step이다.

Docker 명령 유형에 따라 입력 항목이 다르며, 필요한 파라미터는 사용자 정의 Property 에서 등록할 수 있다.

항목설명기본 값
설명화면에 표시되는 Step 이름Docker
Docker 명령Docker 명령의 유형을 선택한다.
- BUILD : docker build 명령 수행
- RUN : docker run 명령
- PUSH : docker push 명령
- PULL : docker pull 명령
- RAW : docker 명령을 직접 입력함
인코딩로그 파일을 기록할 때 사용할 인코딩시스템 기본값
사용자 정의 PropertyDocker 템플릿에서 사용될 아규먼트
- 고정값 : Property 값이 편집 시점에 고정된다.(상수값)
- 파라미터 : Job을 실행할 때마다 파라미터로 값을 입력받아 Job 내부에 전달한다. 파라미터로 전달되지 않으면 기본값을 사용한다.
자세한 설명은 사용자 가이드를 참고한다.

BUILD

Docker 명령 유형을 BUILD로 선택한 경우, 다음의 항목을 입력해야 한다.

항목설명기본 값
Repository/ImageBUILD에서는 Repository를 의미한다. Repository 명은 소문자로 입력해야한다. 자세한 사항은 Docker 가이드를 참고한다.
형식) namespaces/repository:tag
Dockerfile 유형Dockerfile에 대한 설정
- 기등록된 Dockerfile 사용 : 등록된 Dockerfile을 사용하여 build 명령을 수행하는 방식으로, Dockerfile 경로와 Dockerfile 명을 입력함
- Dockerfile 직접 입력 : 텍스트 에디터에 Dockerfile 내용을 직접 입력하는 방식으로, 임시 Dockerfile을 생성하여 build 명령을 수행함
기등록된 Dockerfile 사용
Dockerfile 경로/Container 작업 디렉토리기등록 Dockerfile을 사용하는 경우에는 Dockerfile이 위치한 디렉토리 경로 혹은 Dockerfile 내에서 COPY 등의 명령 사용 시 기준이 되는 디렉토리 경로를 의미한다.
참고로 Dockerfile 내에서 절대 경로는 사용 불가하며, 경로 설정이 필요한 경우에는 Container 작업 디렉토리로 입력된 디렉토리를 기준으로 상대 경로로 설정해야 한다.
Dockerfile 명Dockerfile 명을 다른 이름으로 변경하고 하는 경우 원하는 파일명을 입력한다.Dockerfile
Dockerfile ContentsDockerfile 내용을 직접 입력한다.
F11을 누르면 Dockerfile 편집이 가능한 전체 화면으로 전환된다.
빌드 작업 시, 캐시 사용여부build 명령 수행 중에 캐시를 사용할 것인지 사용 여부를 설정한다.
- 캐시 사용안함
- 캐시 사용
캐시 사용
Optionsdocker build 명령에서 제공하는 옵션을 직접 입력한다.
예를 들어, -c, -m, -q, -t 등 옵션을 설정할 수 있으며, 자세한 사항은 docker 사용법을 참고한다.

예를 들어, docker build 명령을 사용하여 Tomcat에 사용자 Web Application을 배포하는 사용자 이미지를 생성하는 작업을 Docker 템플릿을 사용하여 정의하면 다음과 같다.

  1. Docker Hub에서 제공하는 Tomcat 이미지를 기본 이미지로 사용
  2. 미리 생성해 놓은 샘플 Web Application 압축 파일(spring-mvc-showcase.war)을 Tomcat Container 내부로 복사

Dockerfile 유형 중에서 기등록된 Dockerfile 사용하는 경우에 대한 docker build step의 예는 다음과 같다.

Dockerfile 유형 중에서 Dockerfile 직접 입력하는 경우에 대한 docker build step의 예는 다음과 같다.

RUN

Docker 명령 유형을 RUN으로 선택한 경우, 다음의 항목을 입력해야 한다.

항목설명기본 값
Repository/ImageDocker Image 명을 입력한다.
형식) namespaces/repository:tag
Detached modeContainer를 백그라운드로 실행 시킬지 여부를 설정한다.
- **detach off ** : 실행 후 종료될 때까지 대기
- detach on : 백그라운드로 실행
detach off
컨테이너 이름Container에 별칭을 지정한다. 예를 들어, docker stop, docker rm 등의 명령 사용 시에 Container ID를 대신하여 사용할 수 있다.
추가 아규먼트run 명령에서 추가로 필요한 commnad arguments를 직접 입력한다.
Optionsdocker run 명령에서 제공하는 옵션을 직접 입력한다.
예를 들어, -p 옵션을 추가하여 Container에서 사용 중인 포트를 Host/VM 인스턴스의 포트로 연결한다.

예를 들어, docker run 명령을 사용하여 앞서 생성한 사용자 이미지를 이용하여 Container를 구동하는 작업을 Docker 템플릿을 사용하여 정의하면 다음과 같다.

PUSH/PULL

Docker 명령 유형을 PUSH/PULL으로 선택한 경우, 다음의 항목을 입력해야 한다.

항목설명기본 값
Repository/ImageDocker Image 명을 입력한다.
형식) namespaces/repository:tag
Registry 유형Docker Registry 유형을 선택한다.
- Docker Hub : Docker Hub 사용
- Custom Registry : 프로젝트에서 별도로 구성한 Docker Registry를 사용
Custom Registry
Registry 접속태그사용하고자 하는 Registry 인증정보를 선택한다.
단, 사전에 [관리자 > 시스템 설정 > 외부증명소]메뉴에서 registry 유형으로 Docker Registry에 대한 인증정보가 등록되어야 한다.
인증 유형Docker Registry에 대한 인증을 언제, 어떤 방식으로 수행할 것인지를 선택한다.
- 에이전트의 ~/.dockercfg credential을 사용 : 각각의 Host/VM 인스턴스에서 운영자가 직접 docker login을 실행하고 login 후 생성된 credentail을 이용하는 방식이며, 인증 과정이 필요하지 않은 경우에도 이 옵션을 선택
- Registry 접속태그에 등록된 Id/Password 사용 : Docker 템플릿이 수행될 때마다 사전 작업으로 인증 명령을 수행하는 방식
에이전트의 ~/.dockercfg credential을 사용
Optionsdocker build, docker run, docker push, docker pull 명령에서 제공하는 옵션을 직접 입력한다.
예를 들어, run 명령에서는 -p 옵션을 추가하여 Container에서 사용 중인 포트를 Host/VM 인스턴스의 포트로 연결한다.

예를 들어, docker push 명령을 사용하여 앞서 생성한 사용자 이미지를 Docker Hub에 push하는 작업을 Docker 템플릿을 사용하여 정의하면 다음과 같다.

예를 들어, docker pull 명령을 사용하여 Docker Hub에 있는 이미지를 pull하는 작업을 Docker 템플릿을 사용하여 정의하면 다음과 같다.

RAW

Docker 명령 유형을 RAW으로 선택한 경우, 다음의 항목을 입력해야 한다.

항목설명기본 값
Commanddocker 명령을 직접 입력하고자 하는 경우에 설정한다.
예) docker ps -a

예를 들어, Container ID가 아니라 Container 이름을 이용하여 구동 중인 Container를 중지하는 방법은 다음과 같다. name 옵션에는 RUN 작업에서 기등록한 컨테이너 이름을 명시한다.

Docker 템플릿 사용 예

Docker 명령을 활용한 Docker 샘플 작업 생성 및 실행, 실행 내역 확인 방법에 대하여 설명한다.

Sample Job 생성

Tomcat 이미지를 활용한 Web Application 배포

사전 준비
  1. jjobs-agent00로 접속한다.

  2. 샘플 파일이 저장될 샘플 디렉토리를 생성한다. (예, /sorc001/sample)

  3. 샘플 디렉토리에 샘플 war 파일을 준비한다. (예, spring-mvc-showcase.war)

    [jjobs@jjobs-agent00 sample]$ ls
    spring-mvc-showcase.war
    
my-app-test Job 생성

Tomcat 이미지를 이용하여 사용자 이미지를 생성한 뒤, 사용자 이미지를 사용하여 Container를 구동하는 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. (docker build) Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    docker build 명령을 수행하여 사용자 이미지를 생성하는 Step이다.

    항목입력 값
    설명docker build
    Docker 명령BUILD
    Dockerfile 유형Dockerfile 직접 입력
    Dockerfile 경로/Container 작업 디렉토리/sorc001/sample
    Dockerfile ContentsFROM tomcat
    COPY ./spring-mvc-showcase.war /usr/local/tomcat/webapps
    Repository/Image${PARAM("BUILD_IMAGE_NAME")}
    빌드 작업 시, 캐시 사용여부빌드 작업 시, 캐시 사용여부
    Options
    사용자 정의 Property종류 - 파라미터
    이름 - BUILD_IMAGE_NAME
    값 - my-tomcat-app
  3. (docker stop) Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    docker run 명령 수행 전에 이전에 구동된 Container를 중지시켜준다. 해당 Step을 추가하는 이유는 이전에 실행된 Job이 있는 경우, 두 번째 이후로 Job을 실행하면 포트 충돌이 나면서 docker run 명령 수행 시에 오류가 발생하기 때문이다.

    항목입력 값
    설명docker stop
    Docker 명령RAW
    Commanddocker stop $(docker ps -q -f name=${JOB_ID})
  4. (docker stop) docker stop 템플릿의 실행 탭에서 다음 항목을 설정한다.

    docker stop 명령의 경우 stop 할 Container가 없을 때 오류가 발생하는데, 이를 무시하고 다음 Step으로 진행시키기 위함이다.

    항목입력 값
    오류 발생 시 Skip 처리사용
  5. (docker run) Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    docker run 명령을 수행하여 사용자 이미지를 이용하여 Container를 구동하는 Step이다.

    항목입력 값
    설명docker run
    Docker 명령RUN
    Repository/Image${PARAM("BUILD_IMAGE_NAME")}
    Detached modedetach on
    컨테이너 이름${JOB_ID}
    Options-p 8877:8080
    추가 아규먼트
  6. F4 를 눌러 Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-agent00으로 지정한다. 다른 J-Jobs Agent에서 수행되지 않도록 하기 위함이다.

  7. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = my-app-test)

OS 이미지를 사용한 배치 작업 Shell 파일 수행

사전 준비
  1. jjobs-agent00로 접속한다.

  2. 샘플 파일이 저장될 샘플 디렉토리를 생성한다. (예, /sorc001/sample)

  3. 샘플 디렉토리에 배치 작업 파일(shell)을 생성한다. (예, batch.sh)

    #!/bin/sh
    echo "$HOSTNAME"
    for i in {1..10}
    do
            sleep 1
            echo batch shell test...$i
            ls -la
    done
    cat /etc/*-release | uniq
    
  4. 배치 작업 파일(shell)에 실행권한을 추가한다.

    [jjobs@jjobs-agent00 sample]$ chmod +x batch.sh
    
batch-shell-test Job 생성

ubuntu 이미지를 이용하여 배치 작업 파일을 실행할 수 있는 사용자 이미지를 생성한다. 사용자 이미지를 사용하여 동시에 3개의 Container를 구동하여 배치 작업 파일을 실행하고 각 Container에서 실행한 결과 값을 출력하는 예제 Job을 등록하는 과정은 다음과 같다.

사용자 파라미터, 출력변수, Command/Shell 템플릿 등은 사용자 가이드를 참고한다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. (docker build) Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    docker build 명령을 수행하여 사용자 이미지를 생성하는 Step이다.

    항목입력 값
    설명docker build
    Docker 명령BUILD
    Dockerfile 유형Dockerfile 직접 입력
    Dockerfile 경로/Container 작업 디렉토리/sorc001/sample
    Dockerfile ContentsFROM ubuntu
    COPY ./batch.sh /home
    Repository/Image${PARAM("BUILD_IMAGE_NAME")}
    빌드 작업 시, 캐시 사용여부빌드 작업 시, 캐시 사용여부
    Options
    사용자 정의 Property종류 - 파라미터
    이름 - BUILD_IMAGE_NAME
    값 - my-ubuntu-batch
  3. 병렬처리 시작 엘리먼트를 추가한다.

  4. (docker run 01) Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    docker run 명령을 수행하여 사용자 이미지를 이용하여 Container를 구동하는 Step이다. 출력변수를 추가하여 Container 실행 결과를 출력변수에 저장한다.

    항목입력 값
    설명docker run 01
    Docker 명령RUN
    Repository/Image${PARAM("BUILD_IMAGE_NAME")}
    Detached modedetach off
    컨테이너 이름${JOB_ID}-01
    Options
    추가 아규먼트/home/batch.sh
    사용자 정의 Property종류 - 출력변수
    이름 - CONTAINER_RESULT_01
    값 - GET_VALUE_FROM_STDOUT(1,12,"UTF-8")
  5. (docker run 02) Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    항목입력 값
    설명docker run 02
    Docker 명령RUN
    Repository/Image${PARAM("BUILD_IMAGE_NAME")}
    Detached modedetach off
    컨테이너 이름${JOB_ID}-02
    Options
    추가 아규먼트/home/batch.sh
    사용자 정의 Property종류 - 출력변수
    이름 - CONTAINER_RESULT_02
    값 - GET_VALUE_FROM_STDOUT(1,12,"UTF-8")
  6. (docker run 03) Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    항목입력 값
    설명docker run 03
    Docker 명령RUN
    Repository/Image${PARAM("BUILD_IMAGE_NAME")}
    Detached modedetach off
    컨테이너 이름${JOB_ID}-03
    Options
    추가 아규먼트/home/batch.sh
    사용자 정의 Property종류 - 출력변수
    이름 - CONTAINER_RESULT_03
    값 - GET_VALUE_FROM_STDOUT(1,12,"UTF-8")
  7. 병렬처리 종료 엘리먼트를 추가한다.

  8. (review result) Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    병렬로 수행된 3개의 Container를 실행한 결과 값을 저장하고 있는 3개의 출력변수를 확인하는 Step이다.

    항목입력 값
    설명review result
    입력 유형스크립트
    스크립트echo result of containers
    echo container-01..$1
    echo container-02..$2
    echo container-03..$3
    아규먼트${OUTPUT.CONTAINER_RESULT_01} ${OUTPUT.CONTAINER_RESULT_02} ${OUTPUT.CONTAINER_RESULT_03}
  9. F4 를 눌러 Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-agent00으로 지정한다. 다른 J-Jobs Agent에서 수행되지 않도록 하기 위함이다.

  10. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = batch-shell-test)

Sample Job 실행

등록한 Job을 실행하는 방법은 크게 네 가지가 있다. 자세한 설명은 사용자 가이드를 참고한다.

  1. Job 편집 화면에서 Ctrl+Enter 를 눌러 실행한다.
  2. Job 편집 화면에서 실행관리 > 즉시실행메뉴를 사용하여 실행한다.
  3. Job > 편집 화면 우측에 위치한 Job 목록 화면에서 등록한 Job의 우측에 위치한 즉시실행버튼을 클릭하여 Job을 실행한다.
  4. Job > 실행 메뉴에서 Job을 선택하여 실행할 수 있다.

네 가지 방법 모두 Job을 실행할 때에는 다음과 같이 로그 레벨, 실행구역, 파라미터 값 등을 변경하여 실행할 수 있는 화면에 제공되며, 필요에 따라 변경하여 Job 즉시실행버튼을 클릭하여 Job을 실행한다.

Sample Job 실행내역 확인

결과 > Job 실행내역 화면은 상단의 검색 조건과 실행 내역 목록으로 구성된다.

검색 조건

검색 조건설명
날짜 (필수)검색할 Job 요청 시간 (From ~ To)
기본값으로 어제 ~ 내일이 설정되어 있음
요청 ID요청 ID
인스턴스 IDJob 인스턴스 ID
실행 IDJob 실행 ID
Job IDJob ID
Job 명Job 명. 부분 일치 검색
에이전트 명Job을 실행한 에이전트명
에이전트 그룹 IDJob을 실행한 에이전트 그룹 ID
스케줄 이름실행한 스케줄명
요청 사용자요청 사용자

실행 상태

탭 구분실행 상태설명
전체대기를 제외한 모든 실행 결과가 보이는 탭이다. (기본 선택)
대기Job 요청이 많아 진행되지 못하고 대기중이거나, 스케줄 요청 후 대기중인 실행 목록이 보이는 탭이다.
확인운영자나 관리자의 확인을 받아야 하는 실행 목록이 보이는 탭이다.
진행실행중인 목록만 보이는 탭이다.
오류실패하거나 중지한 실행 목록만 보이는 탭이다.
완료성공적으로 종료한 실행 목록만 보이는 탭이다.

로그 확인

실행 결과 목록에서 상태를 클릭하면 Job의 로그 확인창이 열린다. Job 즉시실행 시에, 로그 모아보기를 사용하여 Job을 실행하였을 경우, Job 로그에서 하위 Step의 로그도 함께 확인할 수 있다. Job이 실행 중인 상태에서 로그를 확인할 경우에도 주기적으로 새로고침하여 준실시간으로 로그를 볼 수 있다.

Sample Job 실행결과 예시

my-app-test Job

실행 결과 목록에서 Job ID가 my-app-test인 실행내역 중에서 실행 ID를 클릭하면, Job 실행 상세 정보 팝업 창이 열리고 Job/Step 실행 결과, 파라미터 등을 확인할 수 있다. 상태를 클릭하면 Job/Step의 실행 로그를 확인할 수 있다.

Step 실행 탭을 클릭하면 Step 별 상세 실행 내역을 확인할 수 있다.

batch-shell-test Job

실행 결과 목록에서 Job ID가 batch-shell-test인 실행내역 중에서 실행 ID를 클릭하면, Job 실행 상세 정보 팝업 창이 열리고 Job/Step 실행 결과, 파라미터 등을 확인할 수 있다.

다음 그림은 Step 실행 탭을 클릭한 결과 화면이다.

다음은 docker run 01 Step의 상태를 클릭한 Step의 로그 확인 창이며, 화면 하단에 출력 변수로 설정된 값을 확인할 수 있다.

다음은 review result Step의 상태를 클릭한 Step의 로그 확인 창이며, 병렬로 수행된 3개의 Container의 결과값이 출력되었음을 확인할 수 있다.

[별첨]

OS 별 Docker 설치

Docker 공식 홈페이지에 다음과 같이 OS 별로 Docker 설치 방법이 상세하게 설명되어 있으므로 참고한다.

Docker CE

OS참고 URL
CentOS (RedHat)https://docs.docker.com/install/linux/docker-ce/centos/
Debianhttps://docs.docker.com/install/linux/docker-ce/debian/
Fedorahttps://docs.docker.com/install/linux/docker-ce/fedora/
Ubuntuhttps://docs.docker.com/install/linux/docker-ce/ubuntu/

Docker EE

OS참고 URL
CentOShttps://docs.docker.com/install/linux/docker-ee/centos/
RedHathttps://docs.docker.com/install/linux/docker-ee/rhel/
SUSE Linux Enterprise Server (SLES)https://docs.docker.com/install/linux/docker-ee/suse/

Custom Registry insecure 설정

프로젝트에서 구성한 Custom Registry가 인증 과정이 없는 경우에, Custom Registry에 push/pull 하는 과정 중에, https 응답 관련 오류가 발생한다. 이러한 오류 발생 시, 다음과 같이 Custom Registry에 대한 insecure 설정을 추가해야 https 관련 오류없이 push/pull 명령이 수행된다.

Ubuntu, Debian, SLES, CentOS, Redhat 인 경우

  1. /etc/docker/daemon.json 파일을 생성/변경

    {
    	"insecure-registries": ["172.31.16.200:5000"]
    }
    
  2. Docker service를 재시작한다.

Amazon Linux 인 경우

  1. /etc/sysconfig/docker 파일 수정

    OPTIONS="--default-ulimit nofile=1024:4096 --insecure-registry 172.31.16.200:5000"
    
  2. Docker service를 재시작한다.