프론트엔드

Windows에서 Docker Web application 개발환경 구축

CyberI 2017. 1. 4. 19:47

Docker 나 컨테이너 가상화는 무엇인지 굳이 설명을 하지 않아도 이제는 매우 일반적으로 쓰이는 IT 용어가 되었습니다.

Hybrid 기반의 Cloud 환경 및 Microservices 가 앞으로 인프라 아키텍처로써 발전해 나가고 있는 시점에  컨테이너 기반 가상화의 대표주자인 Docker의 중요성은 다시 설명 드리지 않아도 될 만큼 개발자나 인프라 담당자가 꼭 알아두어야 할 시대가 된것 같습니다.

그래도 추가적인 대략적인 개념이 필요하시면 아래 글을 읽어보시면 도움이 되겠습니다.

 참조 :컨테이너 기반의 가상화 (Docker) [링크]

 이번 아티클에서는 대부분 개발자가 이용하고 있는 윈도우 환경에서 Docker 환경을 구축하고 Tomcat 기반의  web application (war)을 Docker image 로 만들고 실행해 보는 방법을 정리해 보겠습니다.

그전의 Docker  활용예제등은 linux 기반의 centos ubuntu 에서 직접 실행하는 예제나 소개여서 windows 환경에서 동작시킬 때는 생각보다 어려운 점이 많았습니다.

  

Docker 설치

 Centos RedHat OS 에서는 이미 Docker가 기본 설치되거나 yum 통해 편리하게 설치 실행할 수 있습니다.

Docker는 기본적인 Linux Kernel 에서만 동작하기 때문에 Oracle VirtualBox와 같은 OS기반 가상화 기술을 활용하여 Windows MacOS에서는 설치 및 실행합니다.

우선 Docker Toolbox(https://www.docker.com/products/docker-toolbox)를 설치합니다.

 

되도록이면 선택항목을 모두 선택하고 설치하면 됩니다.

 

모두 설치가 완료되면 아래 화면과 같은 프로그램 메뉴가 추가됩니다.

 - Docker Quickstart Terminal :  docker 명령을 이용할 수 있는 terminal

 - Kitematic (Alpha) : docker image를 손쉽게 다운받고 설치 실행할 수 있는 GUI Tool

 

처음에서는 Docker Quickstart Terminal 을 실행할 때 오류가 발생하는 경우가 많아서 아래와 같은 순서로 진행하는 것이 좋습니다. (MacOS 환경에서는 바로 잘 동작합니다. Windows 환경에서도 잘 동작하는 경우가 대부분인데 제 PC에서는 잘 안되는 경우가 많네요.)

 





 - Kitmatic 실행

 - 만약 오류 발생시 [USE VIRTUALBOX] 선택 

 - 실행 완료 후 좌측하단의 DOCKER CLI 실행해서 command 모드 실행

   

내부적으로는 VirtualBox을 통해 Docker 가 실행될 수 있는 OS(boot2docker) 이미지를 통해 실행되는 것인데 VirtualBox boot2docker 이미지가 잘 올라오지 않는 경우가 있습니다.

이런 경우 수동으로 docker 서버 머신을 VirtualBox에 아래 명령으로 설치할 수 있습니다.


 docker-machine -s D:\docker create --driver virtualbox docker

 

-s 옵션은 docker 가상 이미지 및 설정정보가 위치하는 경로이고

맨 마지막 docker virtualbox의 가상VM 의 이름을 설정하는 것입니다.

기존에 docker machine이 있는 경우는 

docker-machine rm docker 

와 같은 명령을 통해 삭제할 수 있습니다.

  

제일 먼저 docker version을 확인해 보시면 docker client server의 버전을 확인해 볼 수 있습니다.

  


tomat web application 이미지 만들기

다음 준비할것을 tomcat에 올릴 war (web applicaitn)  준비해야 합니다

그리고  Dockerfile 이라는 docker 이미지를 만들기 위한 각종 메타정보를 담고 있는 파일을 작성해야 합니다.

 

## 기본이 되는 docker image 
From tomcat:8-jre8

# Maintainer
MAINTAINER "Me <me@gmail.com>"

# Copy to images tomcat path
ADD coreframe-5.0.2.war /usr/local/tomcat/webapps/

  

docker build -t webserver .

 

위 명령을 입력하면 현재 디렉토리의 dockerfile정보를 읽어서 webserver 라는 이름의 docker image를 생성합니다.

 

이제 docker container를 실행 보죠.

 

docker run -it --rm -p 18080:8080 --name firstdocker webserver

위 명령 firstdocer라는 이름을 가지고 webserver 컨테이너를 실행하는 명령이다.

-p 는 포트관련 옵션으로 외부 18080 포트를 container 내부의 8080 포트로 mapping 시켜준다는 의미입니다. 잘 실해이 되면 아래와 같이 Docker Container 를 통해 실행한 web application을 확인해 볼 수 있습니다.

 


 

Maven에서 docker image 생성하기

 

실제 서비스를 목표로 하는 경우는 소스의 변경이 되었을 때 즉각적으로 docker image 를 생성하여 자동화 하고자 하는 경우가 일반적입니다.

java 소스를 build할 때 많이 사용되는 maven에서 docker plugin을 활용하여 web application war를 생성하고 해당 war tomcat image 와 결합된 docker image를 생성하는것에 대해 설명하겠습니다.

 

1) Dockerfile 설정

이번의 경우도 첫번째 작업은 dockerfile을 설정입니다.. 보통 src/main/docker 라는 디렉토리를 만들고 Dockerfile 파일을 생성하여 아래와 같이 설정하시면 됩니다.

 

FROM tomcat:8-jre8
MAINTAINER webplugger

# remove the default tomcat application
RUN rm -rf /usr/local/tomcat/webapps/ROOT /usr/local/tomcat/webapps/ROOT.war

# add the BiVeS-WebApp as the new default web app
COPY coreframe-web-${project.version}.war /usr/local/tomcat/webapps/ROOT.war

 

2) pom.xml 수정

dockerfile를 읽고 실행하기 위해서 몇 가지 추가적인 maven plugin을 설정해야 합니다.

 

 

<plugin>
    <artifactId>
maven-resources-plugin</artifactId>
    <executions>
        <execution>
            <id>
copy-resources</id>
            <phase>
validate</phase>
            <goals>
                <goal>
copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>
${basedir}/target</outputDirectory>
                <resources>
                    <resource>
                        <directory>
src/main/docker</directory>
                        <filtering>
true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

 

  


<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.10</version>
<configuration>
<imageName>cyberx/${project.artifactId}</imageName>
<dockerDirectory>${basedir}/target</dockerDirectory>
</configuration>
</plugin>

 

3) mvn.bat 수정

set DOCKER_HOST=tcp://{docker ip주소}:2376

set DOCKER_MACHINE_NAME=default

set DOCKER_TLS_VERIFY=1

set DOCKER_TOOLBOX_INSTALL_PATH=d:\Program Files\Docker Toolbox

set DOCKER_CERT_PATH=C:\Users\사용자이름\.docker\machine\machines\default

위와 같은 설정을 추가 설정이 필요합니다.

기본적으로 docker plugin JDK 7이상을 사용해야 하므로 maven JAVA_HOME 환경도 그에 따라 설정해주어야 합니다.

 

DOCKER_HOST는 자신의 docker machine의 ip 주소에 맞추어서 설정을 하고 port는 일반적으로 2375 또는 2376인데 본인의 윈도우 환경에서는 2376으로 설정되어 있었습니다.

DOCKER_TOOLBOX_INSTALL_PATH  DOCKER_CERT_PATH 경로는 본인의 docker toolbox 설치 경로 및 사용자 경로에 맞추어 설정을 수정하시면 됩니다.

  

mvn clean package docker:build

 

docker run -d -p 28080:8080 --name coreframe cyberx/coreframe-web

 

 

Docker image 등록하고 가져오기 (push/pull)

한번 만들어진 docker image는 재활용 성을 높이기 위해 저장소에 등록하고 편리하게 가져다 쓸 수 있습니다.

우선 별도의 개인적인 register 를 만들 수 도 있지만 https://hub.docker.com/ 을 통해 편리하게 저장소를 이용할 수 있습니다.

 아이디와 이메일, 패스워드 등록 한 후 email 통한 confirm이 끝나면 바로 이용할 수 있습니다.

  

이미지 등록은

docker push 계정명/이미지이름 

 

반대로 image 를 가져올 때는 

docker pull 계정명/이미지이름 

 

으로 하면 image 내용을 가져올 수 있습니다.

 Docker 의 images 들은 하나의 파일이 분산돼서 저장되고 다운로드 되기 때문에 추후 push 및 pull 할 때 오랜 시간이 걸리지 않습니다.

  

마무리

Docker 기술은 Linux의 컨테이너 가상화 기술인 LXC로 부터 파생되어 나온 기술이라 아무래도 Window Mac 환경에서는 약간 불편하고 생각처럼 잘 안 되는 경우가 있습니다.

또한 외국 자료 또한 Linux 기반환경에서 직접 작업하는 경우가 많아 windows에서 환경 설정 및 war 이미지 생성관련 자료는 많이 부족한 상태입니다.

Monolithic 방식의 거대한 web application을  Docker  같은 방식으로 image 를 생성하여 관리하는 것은 Docker의 많은 장점을 사용하지 못할 수 있습니다.

Microservices 와 같이 작은 개념은 여러 서비스를 Docker 컨테이너 기술을 사용한다면 기존 Monolithic 방식보다 훨씬 사용하기 편하고 개발 및 배포의 life cycle을 단순화 하고 빠른 변화에 대처가 가능합니다.

 메인프레임에서 Unix 서버를 거쳐 이제는 Linux 기반의 OS로 많은 기업들이 Platform을 변경하고 있으며

Microservices 개념처럼 작은 서비스를 독립적이면 성능 부하를 주지 않는 Docker는 앞으로 일반적인 기술이 될것 으로 보입니다.

 2017년 새해에 새로운 기술을  열린 마음으로 적극 활용해 보면 좋을 것 같습니다.