모던웹으로 Playframework 를 선택하였다고 하면, Scala+Akka의 이점을 고려했을것이며 여기서는 Playframework 를 인텔리J를 사용하여 초기 셋팅하고, 도커에 배포 실행하는 방법을 알아보겠습니다. Play는 JVM환경에서 구동되는것이기때문에 JAVA 배포방법과 큰 차이는 없으며. 스칼라 실행/배포를 위해 SBT 를 이용하는것의 약간의 차이가 있습니다. ( Gradle도 지원) 도커는 덤으로 연동을 하였습니다. play frame work : https://www.playframework.com/documentation/2.6.x/Home |
여기서는 Play Scala ChatRoom 을 선택하였으며 기본 MVC를 위한 뷰템플릿 + 웹소켓요소가 포함되어 있으며
웹소켓은 이제 모던웹에 필수요소이기때문에 기본으로 선택하였습니다.
주요 application layout
sbt는 스칼라프로젝트를 운영할시 메이븐과 유사한 심플하고 유용한 빌드툴입니다.
기본적으로 다음과 같은 명령을 사용할수가 있습니다.
배포용 빌드 Task등록
배포용 Task를 만들어둠으로 재사용이 가능하며, 배포 빌드단계 전단계에서 사용할수가 있습니다.
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 . |
IDE에서 도커설정을 하게되면 , 배포-도커빌드-실행 단계를 버튼하나로 진행할수가 있으며 도커 컨테이너 내의 가상 네트워크에서 작동되지만, 로컬에서 작동하는것처럼 불편함없이 작동이 가능합니다. 디버깅 환경을 구축하려면 , 리모트환경을 이용해야하며 약간의 다른 셋팅 필요합니다. Docker 빌드는 다양한 방법으로 연동될수 있습니다. |
위 명령은 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 이라는 이미지 생성이 되었습니다.
docker run -it -p 9000:9000 -p 9443:9443 --rm playchatroom |
실행되는 도커 컨테이너는 격리된 네트워크로 포트 접근이 기본적으로 불가능하며, 도커의 본체에 포트포워딩 경로를 통해
접근을 시킬수가 있습니다. 여기서는 도커의 본체는 localhost이며 위 실행명령은 http://localhost:9000 으로 접속가능하게해줍니다.
인텔리J가 제공하는 Docker 플러그인을 통해서도 컨테이너 제어가가능하며
위 컨테이너 목록은 격리된 도커 서비스이며 여러가지 의존서비스들을 모두 동일한 가상 네트워크에서 포트충돌없이 구동이 가능합니다.
이렇게 한번 도커에 등록된 컨테이너는 환경변수만 바꿔가며 재사용및 재실행이 가능하게 됩니다.