안녕하세요 이정운 입니다.
이번 강좌에는 요즘에 대세인 Docker 에 대해서 공부도 해볼겸 Open Liberty 에 대한 Docker image 를 가지고 수행 및 이리 저리 테스트도 해보는 형태로 테스트를 간단하게 수행 해보도록 하겠습니다.
(저도 docker 부분에서는 전문가가 아니라서 이런 저런 자료 취합하고 여러번 테스트해서 제가 이해된 부분에 대해서만 설명(?)드릴 수 있다는 한계가 있다는 점은 양해 부탁드리겠습니다.)
#1) Open Liberty 에 대한 Docker image 확인 및 간단한 테스트
하단의 docker hub 를 보시면 아시겠지만 Open Liberty 에 대한 공식 Docker image 를 제공할 뿐만 아니라 지원하는 표준에 따라 다양한 tag 를 제공하고 있습니다.
https://hub.docker.com/r/openliberty/open-liberty/
github 를 통해서 보시면 아시겠지만 kernel, microProfile1, javaee7, webProfile7 이라는 총 4가지 형태의 tag 를 제공합니다. (https://github.com/OpenLiberty/ci.docker/tree/master/release)
우선 가장 기본이 되는 kernel 로 태그된 Dockerfile 을 살펴보면 하단과 같습니다. 여기서 Docker 에 대해서 깊게 다루지 않을거라 긴 설명은 안할 거지만 기본적으로 "FROM ibmjava:8-jre" 보면 아시겠지만 가장 기본적으로 사용되는 Docker image 는 IBM Java 8.0 JRE 관련 image 입니다. 어떻게 보면 Linux 환경에서 Tomcat 대비 Open Liberty 의 가장 다른 점은 기본 JVM 으로 IBM Java 를 사용할 수 있다는 점이며 이에 따른 장점도 많이 가지고 있습니다. (좀 더 자세한 내용은 링크 참고 - http://www.websphere.pe.kr/xe/was_technotes/63497 )
즉, 기본 IBM Java 8.0 JRE 에서 IBM repository 로 접근하여 Open Liberty 를 직접 설치하는 형태로 구성되어 있으며 서비스를 위해서 HTTP(9080), HTTPS(9443) 포트를 노출하도록 되어 있습니다.
-------- Dockerfile for kernel -------------------------------------------------------------------------
FROM ibmjava:8-jre
LABEL maintainer="Alasdair Nottingham" vendor="Open Liberty" url="https://openliberty.io/"; github="https://github.com/OpenLiberty/ci.docker";
RUN apt-get update \
&& apt-get install -y --no-install-recommends unzip \
&& rm -rf /var/lib/apt/lists/*
# Install Open Liberty
ENV LIBERTY_VERSION 17.0.0.3
ENV LIBERTY_SHA 528e393e0b240ebbedb91d25402e22297c6d56ec
RUN wget https://repo1.maven.org/maven2/io/openliberty/openliberty-runtime/$LIBERTY_VERSION/openliberty-runtime-$LIBERTY_VERSION.zip -U UA-Open-Liberty-Docker -O /tmp/wlp.zip \
&& echo "$LIBERTY_SHA /tmp/wlp.zip" > /tmp/wlp.zip.sha1 \
&& sha1sum -c /tmp/wlp.zip.sha1 \
&& unzip -q /tmp/wlp.zip -d /opt/ol \
&& rm /tmp/wlp.zip \
&& rm /tmp/wlp.zip.sha1
ENV PATH=/opt/ol/wlp/bin:$PATH
# Set Path Shortcuts
ENV LOG_DIR=/logs \
WLP_OUTPUT_DIR=/opt/ol/wlp/output
RUN mkdir /logs \
&& ln -s $WLP_OUTPUT_DIR/defaultServer /output \
&& ln -s /opt/ol/wlp/usr/servers/defaultServer /config
# Configure WebSphere Liberty
RUN /opt/ol/wlp/bin/server create \
&& rm -rf $WLP_OUTPUT_DIR/.classCache /output/workarea
COPY docker-server /opt/ol/docker/
EXPOSE 9080 9443
CMD ["/opt/ol/docker/docker-server", "run", "defaultServer"]
-------- Dockerfile for kernel -------------------------------------------------------------------------
다음으로 실제적으로 테스트해볼 microProfile1 에 대한 Dockerfile 은 kernel 을 그대로 상속 받으면서 server.xml 만 추가 됩니다.
-------- Dockerfile for microProfile -------------------------------------------------------------------------
FROM openliberty/open-liberty:kernel
COPY server.xml /config/
-------- Dockerfile for microProfile -------------------------------------------------------------------------
server.xml 은 이전에도 간단히 설명드렸지만 Open Liberty 의 설정 파일이며 쉽게 읽거나 이해할 수 있으며 Feature 부분을 보시면 아시겠지만 microProfile-1.2 기능을 사용한다는 것을 직관적으로 알 수 있습니다. Open Liberty 의 가장 큰 차별점은 Feature 에 JSP, Servlet, JAX-RS 와 같이 선언하여 그 기능만을 바로 사용할 수 있다는 것입니다.
https://github.com/OpenLiberty/ci.docker/blob/master/release/microProfile1/server.xml
--------server.xml-------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
<!-- Enable features -->
<featureManager>
<feature>microProfile-1.2</feature>
</featureManager>
<!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
<httpEndpoint id="defaultHttpEndpoint"
httpPort="9080"
httpsPort="9443" />
<!-- Automatically expand WAR files and EAR files -->
<applicationManager autoExpand="true"/>
</server>
--------server.xml-------------------------------------------------------------------------
여기서 사용한 microProfile-1.2 는 Java EE 표준을 기반으로 Microservice Architecture 에 적합하게 커스터마이징 하고 MSA 에 필요한 새로운 표준을 추가 제공하는 오픈소스 입니다. IBM, Redhat, Smartbear 등 다양한 벤더가 참여하여 JAX-RS + CDI + JSON-P 과 같은 Java 엔터프라이즈 표준을 기반으로 마이크로서비스 아키텍처를 위한 최적화를 수행하는 것을 그 목적으로 하며 하단에 보시는 것처럼 Microservice Architecture 구축에 필수적인 Fault Tolerance, Config, Healthcheck, Metric 등 추가적인 표준화 작업을 수행하고 있는 Java EE 표준의 새로운 물결입니다. (보다 자세한 사항은 http://microprofile.io 에서 추가 확인 가능합니다. )
이제 docker hub 에서 직접 Open liberty 를 위한 다양한 Dockerfile 을 확인해봤으니 실제로 테스트를 수행해 보도록 하겠습니다.
우선 제일 처음으로는 하단과 같이 docker hub 에서 사용할 docker image 를 받아옵니다.
docker pull openliberty/open-liberty:microProfile1
이렇게 가지고온 docker image 를 'run' 명령어를 통해서 하단과 같이 수행하면 docker container 가 실제 수행됩니다.
(여기서 -p 옵션은 포트 바인딩을 해주는 옵션으로 docker host 의 80 포트를 실제 수행하는 docker container 의 9080 과 연결해주는 것입니다.)
docker run -d -p 80:9080 -it --name openliberty openliberty/open-liberty:microProfile1
위와 같이 수행을 하게되면 Docker Container 가 수행되면서 웹 브라우저를 통해서 80 포트로 Open Liberty 에 접근 가능한 것을 확인 가능합니다.
이렇게 서비스된 docker container 는 하단과 같이 log 를 확인하거나 , top 명령을 통해서 process 를 확인하거나 실제 docker container 안으로 직접 들어가서 file 을 제어하거나 일반 OS 처럼 조작 할 수 있습니다.
docker logs --tail=all -f openliberty
docker top openliberty
docker exec -it openliberty bash
참고로 하단의 명령으로 docker container 를 중지 하거나 삭제가 가능합니다. (docker container 에 대한 삭제가 수행될 뿐 실제 docker image 는 지워지지 않습니다. docker image 를 지우기 위해서는 'docker rmi' 명령어를 수행해야 합니다.)
sudo docker stop wlp
sudo docker rm wlp
#2) Open Liberty 에 대한 기본 docker image 를 확장하기
간단한 샘플 servlet 애플리케이션을 준비하고 현재 동작하고 있는 docker container 의 /config/dropins 폴더에 복사합니다.
(Open Liberty 는 지정된 특정 폴더에 애플리케이션 war, ear 만 복사해도 자동으로 인식하고 확장하여 바로 서비스를 제공할 수 있습니다.)
docker cp /tmp/sample.servlet-2.1.0.war openliberty:/config/dropins/sample.servlet-2.1.0.war
참고 : 샘플 서블릿은 github 에 있는 샘플 서블릿 사용 : https://jitpack.io/com/github/WASdev/sample.servlet/2.1.0/sample.servlet-2.1.0.war
또한, 외부에서 요청을 받기 위하여 주석에 언급된 것처럼 'host="*"' 을 하단과 같이 추가한 server.xml 을 만듭니다.
--------server.xml-------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
<!-- Enable features -->
<featureManager>
<feature>microProfile-1.2</feature>
</featureManager>
<!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
<httpEndpoint id="defaultHttpEndpoint"
host="*"
httpPort="9080"
httpsPort="9443" />
<!-- Automatically expand WAR files and EAR files -->
<applicationManager autoExpand="true"/>
</server>
--------server.xml-------------------------------------------------------------------------
이렇게 만들어진 설정도 docker container 에 복사해줍니다. (기 언급드린 것처럼 Open Liberty 는 OSGi 기반으로 동적인 특성을 가지고 있어서 별도의 재시작 없이도 동적으로 반영됩니다.)
docker cp /tmp/server.xml openliberty:/config/server.xml
실제로 웹브라우저를 통해서 테스트해보면 바로 결과를 확인하실 수 있습니다. (dropins 방식을 사용하신 경우 접근할 context root 는 파일명 입니다.)
http://192.168.225.156/sample.servlet-2.1.0/
이제 'docker commit' 명령을 이용하여 war 애플리케이션이 추가된 docker container 를 확장한 채 docker image 로 만듭니다.
docker commit -a "jwlee98@gmail.com" -m "add sample.servlet-2.1.0.war" openliberty openliberty:microProfile2
이렇게 'docker commit' 을 통해서 확장한 docker image 를 통해서 docker container 를 생성하면 war 애플리케이션이 추가된 채 바로 수행 및 결과를 확인할 수 있습니다.
결국은 DevOps 관점에서 docker 환경을 고려한다면 이렇게 Open Liberty 와 애플리케이션을 docker image 로 묶어서 배포 및 수행 할 수 있다는 의미입니다. 당연히 docker image 를 통한 버전 관리도 가능하겠죠..
어떻게 이해가 좀 되시나요? docker 를 사전에 사용해 본 분들에게는 아주 쉬운 이야기 일것이며 이제 처음 사용하거나 Open Liberty 사용자라도 그렇게 오래 고민하지 않아도 이해할 수 있지 않을까 합니다.
여기까지 잘 따라오셨다면 기언급한 것처럼 Open Liberty 에 대한 docker image 를 통해서 간단히 사용 및 서비스 해보셨을 뿐만 아니라 'commit' 을 통한 docker image 확장등도 간단히 살펴보았다고 생각됩니다. 그럼 이번 강좌는 여기서 이만 휘리릭~~~
'IBM - old > Open Liberty 기술자료' 카테고리의 다른 글
[Open]IBM WAS Liberty 의 오픈 소스 버전인 Open Liberty 공식 발표 (0) | 2017.09.22 |
---|
댓글