이번 글에서는 Docker를 사용하여 간단한 3-Tier 컨테이너 환경을 구성해보고자 한다.
– WEB = NginX
– WAS = Tomcat
– DB = MySQL
구성은 WAS -> WEB -> DB 순으로 하도록 한다.
우선, WAS 부터 구성해보도록 하자.
1. WAS 구성
1-1. Github에 올라가 있는 어플리케이션 소스 다운로드
> 소스를 다운받을 디렉토리 생성 후 Git 저장소에서 소스를 Pull 한다.
root@master:~# mkdir -p /home/src root@master:~# cd /home/src root@master:/home/src# |
root@master:/home/src# git clone https://github.com/Hwang-sangyeon/spring-framework-for-petclinic.git
Cloning into ‘spring-framework-for-petclinic’…
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 1.89 MiB | 4.96 MiB/s, done.
1-2. JDK와 Maven 설치
> 소스를 컴파일 하기 위해 OpenJDK와 Maven을 설치한다.
root@master:~# sudo apt-get install openjdk-8-jdk maven
(중략) |
1-3. JAVA_HOME 설정
> 현재 java -version으로 버전 확인 시 설치한 자바로 설정되어 있지 않기 때문에 아래와 같이 변경이 필요하다.
root@master:/home/src# sudo update-java-alternatives –list java-1.11.0-openjdk-amd64 1111 /usr/lib/jvm/java-1.11.0-openjdk-amd64 java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64 root@master:/home/src# root@master:/home/src# root@master:~# sudo update-java-alternatives –jre-headless –jre –set java-1.8.0-openjdk-amd64 |
root@master:/home/src# java -version
openjdk version “1.8.0_292”
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~20.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
1-4. 소스 Build
> 이제 소스와 컴파일 할 JDK와 maven도 준비되었기 때문에 Compile을 해보도록 하자
소스 경로에 들어가 압축을 풀고 아래와 같이 빌드를 진행해준다.
빌드 전에 잠시 소스 수정이 필요하다. pom.xml에 mysql 연동 부분에 localhost:3306을 mysql-petclinic:3306으로 수정하자. was와 db가 다른 컨테이너로 기동되기 때문에 localhost를 인식할 수 없다. 그러나 mysql-petclinic은 컨테이너 명으로 link가 걸려 통신이 가능하다.. |
root@master:/home/src/spring-framework-for-petclinic/spring-framework-for-petclinic# mvn clean package -Dmaven.test.skip=true -P MySQL
…(중략)
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 16.802 s
[INFO] Finished at: 2021-11-07T13:54:37+09:00
[INFO] ————————————————————————
=========================================================================
빌드를 하고 나면, 소스 경로 하위의 target 디렉토리에 petclinic.war 소스 파일이 생성된다.
root@master:/home/src/spring-framework-for-petclinic/spring-framework-for-petclinic/target# ls -arlt|grep petclinic.war
-rw-r–r– 1 root root 41605349 11월 7 13:54 petclinic.war
1-5. WAS 이미지 생성
> 이제 만든 소스를 활용하여 tomcat 이미지를 만들어보도록 하자.
우선 이미지 생성을 위해 Dockerfile을 생성하고 이전에 만들었던 petclinic.war 파일을 같은 디렉토리에 위치시킨다.
root@master:/home/dockerfile/petclinic# pwd /home/dockerfile/petclinic root@master:/home/dockerfile/petclinic# ls -arlt total 40644 drwxr-xr-x 5 root root 4096 11월 7 14:06 .. -rw-r–r– 1 root root 41605349 11월 7 14:06 petclinic.war -rw-r–r– 1 root root 64 11월 7 14:06 Dockerfile drwxr-xr-x 2 root root 4096 11월 7 14:06 . |
하기는 Dockerfile 내용이다.
root@master:/home/dockerfile/petclinic# cat Dockerfile
From tomcat:8-jre8
ADD petclinic.war /usr/local/tomcat/webapps/
위와 같이 준비가 되었다면 이제 해당 위치에서 이미지 빌드를 하면 된다.
커맨드는 아래와 같다.
root@master:~/docker/tomcat-test# docker build -t tomcat-petclinic . Sending build context to Docker daemon 41.61MB Step 1/2 : From tomcat:8-jre8 8-jre8: Pulling from library/tomcat bb7d5a84853b: Pull complete f02b617c6a8c: Pull complete d32e17419b7e: Pull complete ab18cfab55f9: Pull complete 793716e93ecb: Pull complete 3b9b14f7678b: Pull complete 4dc2d594b57d: Pull complete 3f275ee15a3d: Pull complete 15b0db619216: Pull complete c0aa838e7a3a: Pull complete Digest: sha256:47165dabe7c092c61ef2726a7fdc70dda0ce9dea07ca68bda0aea6ecfaba2873 Status: Downloaded newer image for tomcat:8-jre8 —> cff25871f024 Step 2/2 : ADD petclinic.war /usr/local/tomcat/webapps/ —> f27039d77fc4 Successfully built f27039d77fc4 Successfully tagged tomcat-petclinic:latest |
2. WEB 구성
2-1. NginX 리소스 다운로드
> Git에 올라가 있는 NginX 리소스를 다운받는다.
root@master:/home/src# git clone https://github.com/Hwang-sangyeon/nginx-for-petclinic.git Cloning into ‘nginx-for-petclinic’… |
리소스 다운로드 후,
nginx.conf 파일에서 was 연동 포트 확인 및 nginx listen-port를 확인한다.
2-2. 이미지 생성
> Dockerfile이 있는 디렉토리에서 이미지를 빌드한다.
root@master:/home/src/nginx-for-petclinic/nginx-for-petclinic# docker build -t nginx-petclinic . Sending build context to Docker daemon 6.656kB |
2-3. WEB/WAS 이미지 확인
root@master:/home/src/nginx-for-petclinic/nginx-for-petclinic# docker images|grep petclinic nginx-petclinic latest 952aff9083ee 19 seconds ago 133MB tomcat-petclinic latest 39e56a91e5e7 9 minutes ago 334MB |
3. 컨테이너 기동
이제부터는 필요한 이미지가 준비되었기 때문에 WEB/WAS/DB 컨테이너를 기동하여 3-Tier를 구성을 해보려고 한다.
여기서 중요한 점은 WAS가 기동되기 전에 (소스 빌드) DB가 먼저 떠있어야 하기 때문에 DB 컨테이너를 반드시 먼저 기동시켜야 한다는 것이다.
3-1. DB 컨테이너 기동
> mysql-petclinic 컨테이너 명으로 mysql 이미지를 바로 받아 컨테이너를 실행한다.
docker run --name mysql-petclinic -e MYSQL_ROOT_PASSWORD=petclinic -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:5.7.8
Initializing database 이후 docker container ps로 확인
root@master:~# docker container ps | grep mysql
d286f5c59a6c mysql:5.7.8 “/entrypoint.sh mysq…” 57 seconds ago Up 56 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mysql-petclinic
3-2. WAS 컨테이너 기동
docker run -it --rm -p 8080:8080 --name tomcat-petclinic --link mysql-petclinic:mysql-petclinic tomcat-petclinic
> tomcat 컨테이너에서 mysql 컨테이너의 ip로 접속할 수 있겠지만, static ip가 아니기 때문에 mysql 컨테이너의 이름으로 접속을 해야 할 필요가 있다. 이럴 경우 link 옵션을 통해 컨테이너를 구동하면 tomcat 컨테이너에서 mysql 컨테이너로 이름으로 접속할 수 있다. link 옵션으로 구동하면 톰캣 컨테이너 안의 /etc/hosts에 링크된 mysql 컨테이너 hostname과 ip가 들어간다.
3-3. WEB 컨테이너 기동
docker run -it --rm -p 80:80 --name nginx-petclinic --link tomcat-petclinic:tomcat-petclinic nginx-petclinic
4. 서비스 호출

192.168.56.200은 VM의 IP
이상 도커를 활용하여 3-Tier 컨테이너 환경을 구성해보았다..