모던웹으로 Playframework 를 선택하였다고 하면, Scala+Akka의 이점을 고려했을것이며
여기서는 Playframework 를 인텔리J를 사용하여 초기 셋팅하고, 도커에 배포 실행하는 방법을 알아보겠습니다.
Play는 JVM환경에서 구동되는것이기때문에 JAVA 배포방법과 큰 차이는 없으며.
스칼라 실행/배포를 위해 SBT 를 이용하는것의 약간의 차이가 있습니다. ( Gradle도 지원)
도커는 덤으로 연동을 하였습니다.
play frame work : https://www.playframework.com/documentation/2.6.x/Home
필요플러그인
- SBT
- DOCKER
프로젝트 생성에서 실행 배포까지
Step0. 라이트벤드 제공 Play템플릿 선택하기
여기서는 Play Scala ChatRoom 을 선택하였으며 기본 MVC를 위한 뷰템플릿 + 웹소켓요소가 포함되어 있으며
웹소켓은 이제 모던웹에 필수요소이기때문에 기본으로 선택하였습니다.
Step1. 구성요소 받을때까지 기다리기
주요 application layout
- controller : MVC의 C에 해당하는 코드 집합들
- filters : 웹요청에대한 정책설정을 할수 있으며, 여기서는 웹소켓에 관련 정책이 자동설정됩니다.
- views : 뷰템플릿을 추가할수있으며, 여기서는 채팅 페이지의 기본 코드가 설정됩니다.
- conf : playframework에 사용되는 각종 설정들
- conf/routes : endpoint를 정의하고 대상 controller에 연결을 정의하는 라우터 설정입니다.
Step2. 컴파일및 실행
sbt는 스칼라프로젝트를 운영할시 메이븐과 유사한 심플하고 유용한 빌드툴입니다.
기본적으로 다음과 같은 명령을 사용할수가 있습니다.
- compile : 스칼라 프로젝트를 컴파일합니다.
- run : 스칼라 코드를 실행을 하며, 코드변경이 있을시 증분컴파일후 실행을 수행합니다. ( 개발환경 )
- dist : 배포를 위한 최종 배포파일을 생성하며 target/universal/{프로젝트명}.zip 로 최종결과물을 만들며 /bin 에 jar를 실행하는 스크립트가 포함됩니다.
배포용 빌드 Task등록
배포용 Task를 만들어둠으로 재사용이 가능하며, 배포 빌드단계 전단계에서 사용할수가 있습니다.
Step3. Docker Build 만들기
FROM openjdk:8-jre COPY target/universal/play-chatroom-scala-example-2.6.x /svc EXPOSE 9000 9443 CMD /svc/bin/play-chatroom-scala-example -Dhttps.port=9443 -Dplay.crypto.secret=secret
프로젝트 루트에 Dockerfile을 위와같이 만들어 줍니다. sbt dist후 universal에 생성된 zip의 압축을 푼후 ( unzip으로 자동화가능) 수행이가능한
도커 명령이며(도커가 셋팅이되었다고 가정합니다.)
위 명령은 jre가 필요하고 9000(play 웹기본포트), 9443(https) 두가지 포트를 사용하는 실행가능한 scala 웹서비스의 컨터이너를 작성하겠다란 의미입니다.
docker build -t playchatroom .
위 명령은 Dockerfile을 참고 하여 playchatroom 이라는 실행가능한 도커 이미지를 생성해줍니다.
D:\project\scala2>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
playchatroom latest 88e0b3cd5a14 10 minutes ago 484MB
openjdk 8-jre 66bf39162ea7 4 weeks ago 443MB
openjdk 를 베이스로 playcharroom 이라는 이미지 생성이 되었습니다.
Step4. Docker 실행하기
docker run -it -p 9000:9000 -p 9443:9443 --rm playchatroom
실행되는 도커 컨테이너는 격리된 네트워크로 포트 접근이 기본적으로 불가능하며, 도커의 본체에 포트포워딩 경로를 통해
접근을 시킬수가 있습니다. 여기서는 도커의 본체는 localhost이며 위 실행명령은 http://localhost:9000 으로 접속가능하게해줍니다.
인텔리J가 제공하는 Docker 플러그인을 통해서도 컨테이너 제어가가능하며
위 컨테이너 목록은 격리된 도커 서비스이며 여러가지 의존서비스들을 모두 동일한 가상 네트워크에서 포트충돌없이 구동이 가능합니다.
이렇게 한번 도커에 등록된 컨테이너는 환경변수만 바꿔가며 재사용및 재실행이 가능하게 됩니다.