[CJ Olivenetworks - Cloud Wave] CGV Fast Order 시스템 인프라 구축 3-1. [Httpd, Spring Boot, Aurora MySQL] 3 Tier Web Application - Github Actions, Docker
간단한 Web Application 구축 및 DB 연동 Test
CI/CD 환경 구축을 위한 Test App 모습
- JDBC 쓰다가 JPA 사용하니 신세계가 펼쳐졌다.
- Primary key 중복 문제 등 모든 트러블 슈팅 성공
- 코드 길이도 210 줄에서 약 5줄로 줄어들었다.
- 승재 형 감사합니다..
Docker Image Build 하기
- Intellij 에서 우측 Gradle 이모티콘 → Tasks → build → bootJar 실행
- 그럼 좌측 프로젝트 → build → libs 에 .Jar Snapshot이 생긴다.
$ java -jar *.jar
- 생성된 .jar 파일은 추후 배포 전 Local 환경에서 시험 동작 시켜보는 것이 좋다.
- 해당 파일을 기반으로 동작할 Dockerfile을 프로젝트의 최상단 경로에 작성
# Use the offical OpenJDK base image FROM openjdk:19 CMD ["/.gradlew", "clean", "package"] ARG JAR_FILE_PATH=build/libs/*.jar COPY ${JAR_FILE_PATH} spring.jar # Expose the port app is running on(change to match app’s port) EXPOSE 8080 # Command to run the application ENTRYPOINT ["java", "-jar", "spring.jar"]
- Dockerfile이 존재하는 프로젝트 최상단 경로에서 Docker Image 빌드 및 확인 후 Docker hub Push.
docker buildx build --platform=linux/amd64 -t csm4903/gooloom-was:v2.0.1 .
M1 Mac
을 사용한다면 위 사진처럼buildx
라는 멀티 플랫폼 빌드 툴을 사용해서 amd64 아키텍쳐로 빌드해야 오류가 발생하지 않는다.
- 이미지 빌드가 성공했다면 후에 EKS에서 끌어다 사용 할 수 있게 Docker hub로 push 해보자.
- AWS EKS 에 Bastion을 통해 접속 후 WAS 클러스터에 yaml apply를 통한 pod 생성
- AWS EKS 클러스터 중 두번째 Private Subnet에 존재하는 WAS 클러스터 (lastDance2)에 접근.
- test 용 yaml 파일을 작성 후
kubectl apply -f (파일이름.yaml)
실행. - 이전에 Docker hub에 Push 해놓은 이미지 이름과 버전을 잘 명시해주자.
-n (namespace 이름)
옵션을 추가해서 특정 namespace에 생성해주어도 좋다.
kubectl get po -w
실행 시 Running 되는 것을 볼 수 있다.
- AWS EKS 클러스터 중 두번째 Private Subnet에 존재하는 WAS 클러스터 (lastDance2)에 접근.
[번외] Mod_JK Connector 를 사용하여 Apache2 와 Tomcat 연결하기
우선 진행 과정 중 내가 만난 에러 해결방법 부터 보여주겠다.
configure: error: You must specify a valid --with-apxs path
configure: error: C compiler cannot create executables
- 위 두가지 에러는 아래 패키지들을 설치하면 해결된다.
# 현재 Apache2 image 가 apk add 만 사용 가능한 경우
$ apk add perl
$ apk add gcc
$ apk add apache2-dev
$ apk add build-base
# 현재 Apache2 image 가 apt-get 사용 가능한 경우
$ apt-get update
$ apt-get install perl
$ apt-get install apache2-dev
$ apt-get install curl # 필수 x
아래부터는 본인이 시도했던 방법들 중 하나입니다.
1. Docker 에서 Httpd Container 실행 및 접속
# Httpd Container 생성 및 실행 (Mac M1 사용자는 --platform 옵션 필수 사용) $ docker run -d -p 80:80 --platform=linux/amd64 --name (원하는 컨테이너 이름) httpd # Httpd Container 접속 $ docker exec -it (name) /bin/bash
정상적으로 Httpd 컨테이너에 접속한 모습
2. 필수 패키지 설치
# 현재 Apache2 image 가 apk add 만 사용 가능한 경우
$ apk add perl
$ apk add gcc
$ apk add apache2-dev
$ apk add build-base
$ apk add vim
# 현재 Apache2 image 가 apt-get 사용 가능한 경우
$ apt-get update
$ apt-get install perl
$ apt-get install apache2-dev
$ apt-get install curl # 필수 x
$ apt-get install vim
3. Mod_jk 설치 후 압축 해제 및 실행
# Mod_jk 설치 (현재 가장 최신 버전은 1.2.48)
$ curl -O http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
# Mod_jk 압축 해제
$ tar -zxvf tomcat-connectors-1.2.41-src.tar.gz
# 압축 해제 경로/native 로 이동
$ cd tomcat-connectors-1.2.41-src/native
# configure 실행 (에러 발생 시 패키지 재 설치)
$ /usr/local/apache2/tomcat-connectors-1.2.41-src/native # ./configure --with-apxs=/usr/local/apache2/bin/apxs
# Mod_jk 모듈 설치
$ make && make install
4. httpd.conf 수정
# vi /usr/local/apache2/conf/httpd.conf
# mod_js.so 위치
LoadModule jk_module modules/mod_jk.so
# mod_jk.c 설정
<IfModule mod_jk.c>
# 다음과 같은 경로는 tomcat으로 연결
JKMount /* tomcat
JKMount /*.jsp tomcat
JkMount /jkmanager/* jkstatus
JkMountCopy All
<Location /jkmanager/>
JkMount jkstatus
Require ip 127.0.0.1
</Location>
# workers.properties 위치
JkWorkersFile "apache/conf/workers.properties"
# 로스 위치
JkLogFile "| apache/bin/rotatelogs -l apache/mod_jk.log.%y%m%d 86400 "
# 로그 레벨
JkLogLevel error
# 로그 포멧
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkShmFile "apache/mod_jk.shm"
#JkRequestLogFormat "%w %V %T"
</IfModule>
5. httpd-vhost.conf 수정
$ vi usr/local/apache2/conf/extra/httpd-vhosts.conf
- JKMount 는
worker1
->tomcat
으로 변경했습니다.
6. workers.properties 추가
vim /usr/local/apache2/conf/workers.properties
# vhost 에서 Mount 된 worker의 이름
worker.list=tomcat
# 통신 프로토콜 = ajp13 (=ajp1.3)
worker.tomcat.type=ajp13
# tomcat이 동작하고 있는 host의 ip주소
worker.tomcat.host=127.0.0.1
# (:80)httpd(:8001) -> (:8001)mod_jk connector(:8001) -> (:8001)tomcat(:8080)
worker.tomcat.port=8001
worker.tomcat.retries=1
worker.tomcat.socket_timeout=10
worker.tomcat.connection_pool_timeout=10
# mod_jk 의 status 를 확인할 수 있는 manager 설정인데, 없어도 된다.
worker.list=jkstatus
worker.jkstatus.type=status
7. Docker Commit & Push
$ docker commit -m "커밋 내용" (컨테이너 ID) (도커 허브 ID)/(사용할 이미지 이름):(버전 명시)
- 현재까지 설치한 패키지 및 Mod_jk 설정 사항을 그대로
docker commit
,docker push
하여 이미지로 저장한다.
8. 동작 확인
- 해당 이미지를 k8s manifest file에 적용
kubectl logs (pod 이름)
확인
Apache2(httpd) 와 Spring boot 내장 Tomcat 연동 성공
[CJ Olivenetworks - Cloud Wave 1기] 활동 중 진행한 팀 프로젝트입니다.
무단 복제 및 게시는 삼가주시기 바랍니다.
Task Lists
- 간단한 Web Application 구축 및 DB 연동 Test
- Docker Image Build 하기
- [번외] Mod_JK Connector 를 사용하여 Apache2 와 Tomcat 연결하기
Comments