이번 글에서는 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 (중략) ... update-alternatives: using /usr/lib/jvm/java-11-openjdk-amd64/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode update-alternatives: using /usr/lib/jvm/java-11-openjdk-amd64/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode Setting up libxdmcp-dev:amd64 (1:1.1.3-0ubuntu1) ... Setting up x11proto-core-dev (2019.2-1ubuntu1) ... Setting up libxcb1-dev:amd64 (1.14-2) ... Setting up libx11-dev:amd64 (2:1.6.9-2ubuntu1.2) ... Setting up libxt-dev:amd64 (1:1.1.5-1) ... |
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 이미지를 바로 받아 컨테이너를 실행한다.
root@master:~# 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 컨테이너 기동
root@master:~# 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 컨테이너 기동
root@master:~# docker run -it --rm -p 80:80 --name nginx-petclinic --link tomcat-petclinic:tomcat-petclinic nginx-petclinic |
4. 서비스 호출
이상 도커를 활용하여 3-Tier 컨테이너 환경을 구성해보았다..
도커로 3-Tier를 구성해보니.. 컨테이너를 구성하고 관리하는데에 상당한 불편함을 느꼈다. 물론 docker-compose를 이용하면 web/was/db 컨테이너를 편리하게 구성할 수 있겠지만, 관리 측면에서는 여전히 불편함이 존재한다.
그렇기 때문에 다음 글에서는 kubernetes를 활용한 3-Tier 환경을 구성해보도록 하자.
'컨테이너 > 도커' 카테고리의 다른 글
[Docker] Docker-Compose 설치 (0) | 2021.11.02 |
---|---|
[도커 설치] Docker Installation on Ubuntu:20.04 (0) | 2021.10.24 |