이 포스팅 분류는 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를 쓰는건 아니므로 외부에서 접속은 할 수 없다.
그럼 이제 명령어 하나로 빌드하고 실행하는 마법을 보자.
도커와 쉘스크립트를 이용하면 위처럼 쉽게 빌드하고 테스트할 수 있다.
'DevOps > Docker-Example' 카테고리의 다른 글
[Docker]Ubuntu-Apach-Php : php를 리눅스(우분투)에서 돌리는데 코딩하면 즉각 수정되게 (0) | 2019.11.29 |
---|---|
[Docker][ShellScript]Nginx.LoadBalancer-Nodejs : 엔진엑스로 nodejs에 로드밸런싱하기 (0) | 2019.10.08 |
[Docker]Ubuntu-Sshd : 우분투 컨테이너 실행하고 원격접속하기(ssh) (0) | 2019.06.28 |
[Docker]Mysql.InitSql : Mysql동작시 sql읽고 db초기화하기 (0) | 2019.04.21 |
[Docker]Apache-CodeIgniter-FrontEndPackageManager(Bower)-Php-Ubuntu (0) | 2018.05.26 |