728x90

이 포스팅 분류는 Docker를 정확히 어떻게 사용할지를 다루지 않는다.

대신 Docker로 특정 상황에 어떻게 환경을 구축해야하는지의 예제를 담고 있다.

만약 이 Docker에 대해서 어떻게 관리하는 지를 알고싶다면 인터넷을 검색을 활용하거나

필자의 블로그에서 Software-Docker를 확인해주기를 바란다.

현재 여기 업로드 되어있는 모든 예제들은 필자의 github repository에 올라와있다.

그 주소는 아래와 같다.


https://github.com/kukaro/Eris-DockerExampleTemplate

예제를 직접 확인하고 싶다면 해당 repository를 참조하라.



스프링 프로젝트를 하다보면 테스트하기가 힘든 경우가 있다.

특히 자바 쪽이 좀 귀찮다.(스프링이나 JSP)왜냐하면 설정해줘야할게 많아서 그렇다.

그래서 이를 도커를 이용해서 명령어 하나로 처리한다면 훨씬더 쉽게 테스트할 수 있을 것이다.



프로젝트의 전체 구조는 위와 같다.


이번에는 쉘스크립트가 좀 많아서 도커예제로 좀 별루일 수는 있는데... 어짜피 쉬운 쉘스크립트 밖에 없어서 상관없을 듯 하다.


먼저 Dockerfile을 보자


Dockerfile


FROM ubuntu:latest
MAINTAINER kukaro <justkukaro@naver.com>
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd

#Set argument
ENV HOME_DIR /root
ENV WAR_NAME SpringTest
ENV WAR_VER -1.0-SNAPSHOT
ENV WAR .war

#set password
RUN echo 'root:root' |chpasswd

#replace sshd_config
RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config

#make .ssh
RUN mkdir /root/.ssh

RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

#Install tomcat
RUN apt-get update && apt-get install -y wget
RUN apt-get update && apt-get install -y tar
RUN apt-get update && apt-get install -y openjdk-8-jre
RUN apt-get update && apt-get install -y openjdk-8-jdk
RUN cd ${HOME_DIR} && wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-8/v8.5.43/bin/apache-tomcat-8.5.43.tar.gz
RUN cd ${HOME_DIR} && tar -xzf apache-tomcat-8.5.43.tar.gz
RUN cd ${HOME_DIR} && rm apache-tomcat-8.5.43.tar.gz && mv apache-tomcat-8.5.43 tomcat

#Add file
ADD ./run ${HOME_DIR}/run
ADD ./${WAR_NAME}${WAR_VER}${WAR} ${HOME_DIR}/tomcat/webapps
RUN rm -rf ${HOME_DIR}/tomcat/webapps/ROOT
RUN mv ${HOME_DIR}/tomcat/webapps/${WAR_NAME}${WAR_VER}${WAR} ${HOME_DIR}/tomcat/webapps/ROOT${WAR}

EXPOSE 22 8080

CMD ["/usr/sbin/sshd", "-D"]

좀 긴데 잘라서 보면 그리 까다롭지 않다.


RUN mkdir /var/run/sshd

ssh를 사용하기 위해서 만든 파일이다.


#Set argument
ENV HOME_DIR /root
ENV WAR_NAME SpringTest
ENV WAR_VER -1.0-SNAPSHOT
ENV WAR .war

반복될 변수들을 정해놓자.


#set password
RUN echo 'root:root' |chpasswd

#replace sshd_config
RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config

#make .ssh
RUN mkdir /root/.ssh

RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

필자는 ssh를 쓰는게 편하니까 sshd를 설치한다.

이 부분은 없어도 되는데 필자는 쓰는게 편하더라.


#Install tomcat
RUN apt-get update && apt-get install -y wget
RUN apt-get update && apt-get install -y tar
RUN apt-get update && apt-get install -y openjdk-8-jre
RUN apt-get update && apt-get install -y openjdk-8-jdk
RUN cd ${HOME_DIR} && wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-8/v8.5.43/bin/apache-tomcat-8.5.43.tar.gz
RUN cd ${HOME_DIR} && tar -xzf apache-tomcat-8.5.43.tar.gz
RUN cd ${HOME_DIR} && rm apache-tomcat-8.5.43.tar.gz && mv apache-tomcat-8.5.43 tomcat

그 다음 톰캣을 설치하자.


#Add file
ADD ./run ${HOME_DIR}/run
ADD ./${WAR_NAME}${WAR_VER}${WAR} ${HOME_DIR}/tomcat/webapps
RUN rm -rf ${HOME_DIR}/tomcat/webapps/ROOT
RUN mv ${HOME_DIR}/tomcat/webapps/${WAR_NAME}${WAR_VER}${WAR} ${HOME_DIR}/tomcat/webapps/ROOT${WAR}

이 부분이 좀 중요한데 여러분의 war파일을 톰캣에 넣어준다.

경로 문제 때문에 ROOT.war로 바꿔서 넣었다.


#Add file
ADD ./run ${HOME_DIR}/run

그 중에서 이 부분이 중요한데 run아래의 init.sh를 넣어준다.

이는 컨테이너가 동작한 이후에 해당 스크립트를 실행하기 위해서이다.


EXPOSE 22 8080

CMD ["/usr/sbin/sshd", "-D"]

그 다음 톰캣 포트 8080과 ssh포트 22를 열어준다. ssh안쓸거면 안열어도된다.


docker-compose.yml


version: '3.3'

services:
myubuntu:
image: myubuntu
container_name: myubuntu
command: /root/run/init.sh
ports:
- '11111:22'
- '18080:8080'
expose:
- '11111'
- '18080'

이제 docker-compose.yml을 보면 시작후에 커맨드를 shell스크립트로 짜놨다.

image는 myubuntu라는 우리가 위에 Dockerfile로 만든 이미지를 사용할 것이다.


#!/usr/bin/env bash
#init.sh

# Run tomcat
cd /root/tomcat/bin && ./startup.sh

# Start sshd
/usr/sbin/sshd -D

보면 알겠지만 tomcat을 바로 실행한 후 마지막으로 ssh를 실행한다.

그 다음 ssh를 실행한다.


Shell Script


위를 쉽게 돌리기위해서 스크립트를 3개를 짰다.



이렇게 스크립트를 3개 짰는데 init.sh가 제일 중요하다.


#!/usr/bin/env bash

war='SpringTest-1.0-SNAPSHOT.war'

function mvn_install(){
cd SpringTest && mvn install
cd ..
}

mvn_install

#run myubuntu instance
cp ./SpringTest/target/${war} ./myubuntu/
docker build -t myubuntu ./myubuntu/
docker-compose -f ./myubuntu/docker-compose.yml up -d
rm ./myubuntu/${war}

생각보다 조금 복잡해 졌는데 하나씩보자.


function mvn_install(){
cd SpringTest && mvn install
cd ..
}

함수로 만들었는데 굳이 함수로 만들 필요는 없고 쉽게 이야기해서 maven으로 war를 만드는 코드이다.

그리고 다시 원래 프로젝트로 돌아온다.


mvn_install

당연히 함수 실행이다.


#run myubuntu instance
cp ./SpringTest/target/${war} ./myubuntu/
docker build -t myubuntu ./myubuntu/
docker-compose -f ./myubuntu/docker-compose.yml up -d
rm ./myubuntu/${war}

그 다음 war파일을 docker프로젝트 내부로 cp를 이용해서 복사한다.

이렇게 한 이유는 docker는 무조건 내부의 파일만(Dockerfile이 존재한 디렉터리 이하)사용가능하기 때문이다.

그 다음 빌드하고 compose로 컨테이너 동작한 다음에 다시 war를 삭제해준다.

이제 그럼 실행해보자.


#!/usr/bin/env bash
#clean.sh

docker stop myubuntu
docker rm myubuntu
#docker rmi myubuntu

clean.sh는 컨테이너를 정지하고 삭제하는 명령어이다.

마지막에 이미지 삭제도 있는데 3개중에 필요없는걸 끄고 사용하면 좋을 것이다.

#!/usr/bin/env bash
#run.sh

myaddress=`ipconfig getifaddr en0`
myaddress=${myaddress}

ssh -p 11111 root@${myaddress}

#docker-compose exec myubuntu bash

그리고 원격접속으로 들어가는 명령어이다.


#docker-compose exec myubuntu bash

이명령어는 만약에 ssh를 쓰지 않고 서버에 들어가려면 Dockerfile위치에서 해당 명령어를 실행하면 ssh로 들어간 효과를 낼 수 있다.

단 ssh를 쓰는건 아니므로 외부에서 접속은 할 수 없다.


그럼 이제 명령어 하나로 빌드하고 실행하는 마법을 보자.



도커와 쉘스크립트를 이용하면 위처럼 쉽게 빌드하고 테스트할 수 있다.

+ Recent posts