티스토리 뷰

앞서 언급한 적이 있지만, 내가 담당하고 있는 서비스는 CI/CD가 없다.

 

하지만, 관리해야할 서버군은 요청을 앞단에서 받아줄 Apache Httpd 서버 6개, WAS가 있는 API 서버 6개, 실시간 위치정보를 다루는 WAS 3개, 배치서버 4개다. 한번 배포하는데만 시간 단위로 걸리고, 배포용 WAR파일을 수동으로 올리는데만도 몇 분씩 걸린다...

 

자사 서비스가 아니다보니 요청하기 어려 운점은 이해하겠지만 솔직히 말이 안된다고 생각한다. 심지어 TC도 따로 없고 데일리 빌드도 하지않으며, 프로젝트에 참여한 개발자가 개별 commit을 하고, pull request로 관리하지 않는다.

 

불만만 토로하게 되었는데 이러한 사항들 때문에, 다른 서비스는 어떻게 배포 과정을 갖는지 공부하게되는 계기가 됐고, 실제 서비스에 사용될 수 있도록 구축해보고 싶어졌다.

 

서두가 길었는데, 구축하고자하는 부분들이 내가 알고 있지 않은 부분들이 많아서 말 그대로 더듬더듬 해나갔다.

 

가장 많이 참고한 곳은 아래 velog다.


[AWS] Jenkins를 활용한 Docker x SpringBoot CI/CD 구축

 

목표

단기 목표는 위 링크의 이미지와 같지만 1번과 2번은 뺄 예정이다. 내가 작성한 코드가 완벽하다는 보장이 없는데, 테스트를 거치지 않고 Push하자마자 배포된다? 어떤 끔찍한 일이 일어날지 모른다.

 

이 후 WEB-WAS 구조를 구축하고 MySQL DB Docker를 추가해 총 3개의 Docker 컨테이너를 생성하는 Docker Compose를 구축할 계획이다.

 

MSA 환경에 대해서는 아직 공부를 더해봐야겠지만, 최종적으로는 쿠버네티스(Kubernates)까지 쓸 수 있게 되면 더 좋을 것 같다. 쿠버네티스가 Docker 서비스를 종료했다는데, 이 이야기는 좀 더 확인해 볼 필요가 있다.

 

마지막으론 할 수 있을지 모르겠지만, 서버 코드가 정상적으로 업로드 되었다는 걸 확인 해 주는 API 테스트 자동화 Jenkins 파이프라인을 구축해보고 싶다.

 

 

1. 시작하기

사실 Jenkins는 로컬에서 돌릴 생각이었다. 하지만, 언젠가 사내 서버에 적용할 수 있도록 리눅스 환경에서의 구축이 필요했다. 그래서 WSL(Windows for Linux)에서 작업을 시작했다. 그리고 만약 사용하게 된다면, 서버 6개에 같은 환경을 빠르게 적용하기 위해 Docker 를 사용해보기로 했다.

 

하지만 Windows 10 WSL에서 Docker를 사용하기 위해서는 하이퍼바이저 문제로 인해 WSL2로 설정해야하고, Microsoft의 방화벽 정책 때문에 WSL2에서도 재부팅 시에 매번 재설정해야하는 어려움이 있었다.

(Docker for Windows를 썼으면 됐을 것 같긴한데, 서버 배포 환경이 리눅스라 환경을 맞춰서 인프라를 구축하고 싶었다)

 

또한 재부팅시 방화벽 설정을 매번 새로해야 해서, AWS에서 작업하기로 했다. AWS EC2의 프리티어 서버를 활용해 웹 서비스 배포 서버와, Jenkins 서버를 구축하기로 했다.

 

 

2. AWS EC2에 웹서버 띄우기

2.1 Spring Boot 프로젝트 생성

우선 스프링 부트 프로젝트를 이니셜 라이즈 해주는 사이트 에서 Spring Boot 프로젝트를 생성해, 간단한 웰컴페이지를 만들었다.

 

웰컴 페이지 작성


왼쪽에 hello를 클릭하면 안녕하세요. hello! 페이지로 연결된다.

 

이 간단한 웹 페이지를 GitHub에 업로드해야 한다.

 

2.2 GitHub에 프로젝트 업로드

EC2에서 Docker가 자동으로 소스코드를 땡겨가게 하기 위해서 프로젝트롤 GitHub에 업로드해 두어야한다. 너무 기본적인 설정이라 알아서 해보자.

 

2.3 AWS EC2 인스턴스 생성

https://aws.amazon.com/ko/ec2/ 로 이동한다.

 

가입, 로그인 과정은 알아서 하면, 대시보드 화면으로 넘어온다. 왼쪽 리스트에서 인스턴스를 클릭하면 내가 생성한 EC2의 정보를 간단하게 볼 수 있다.

 

오른쪽 위의 주황색 버튼인 인스턴스 시작 버튼을 클릭해 새 EC2 인스턴스를 생성한다. 인스턴스 생성 페이지로 이동하고, 명시되어 있는 순서대로 입력한다.

 

1. 이름 태그 탭에서 이름 지정

 

2. 애플리케이션 및 이미지 탭에서 본인이 사용할 Linux의 운영체제 선택(난 ubuntu를 선택)

여기서도 디폴트인 Amazon Linux를 선택해서 기존에 사용하던 리눅스 설정과 다른 점들이 있어서 새로 인스턴스를 생성했다. 본인에게 맞는 리눅스 버전을 선택하면된다.

 

3. 인스턴스 유형 선택 : 프리티어인 t2.micro 선택

 

 

4. 키 페어 생성

 

 4-1. 처음 만드는 사람은 당연히 키페어가 없기 때문에, 오른쪽 키 페어 생성 링크 를 선택 
 4-2. 아래 그림과 같은 창이 나오면 키페어 이름을 입력하고, 생성되는 .pem파일을 반드시 잘 보관한다. 서버 로그인을 ssh를 이용해 하는데 해당 키가 꼭 필요하다.

 

5. 네트워크 설정

 

보안그룹 설정이 매우 중요하다. 어떤 IP와 PORT를 OPEN 상태로 둘 것인가? 를 설정하는 것이기 때문이다.ssh, HTTPS, HTTP는 IP는 위치무관(Any OPen) 기본 오픈 상태로 두자. 얘네들은 기본 포트가 있으니, 별도의 설정이 필요없다.

 


그리고 웹서비스에 접근을 받아줄 IP/PORT를 미리 오픈해두면 나중에 Docker 컨테이너를 실행시킬 때 다시 설정할 필요 없으니 하나를 설정해두면 편하다.

 

  1. 스토리지 구성 : 최대 30GB까지 사용 가능하다고 하니 디폴트 8GB보다는 조금 큰 정도로 늘려준다. 프로젝트 크기가 커지면 아무것도 못하니까... 추후에 조정 가능하니 디폴트로 써도 된다.
  2. 생성 : 오른쪽 아래 주황버튼인 인스턴스 시작 버튼을 클릭하면, 인스턴스 자동으로 실행된다. 인스턴스의 상태가 실행 중 상태가 되면 그때부터 접근이 가능하다.
  3. 인스턴스에 접근하기 : 실행 중 상태로 변경되면, 인스턴스 ID를 클릭해보자. 그러면 인스턴스의 정보를 확인할 수 있는 창으로 이동되는데, 거기서 퍼블릭 IPv4 DNS의 개방 주소법 링크를 클릭한다.

ssh로 접근하는 방법으로 접근하면 된다.

 

CMD 창을 열고(Windows에서 접근이라 PowerShell로 열었다), 아까 생성했던 키페어가 생성된 위치로 이동한다. 그리고 아래와 같이 ssh 명령어를 입력하면 ssh로 EC2에 접근이 된다.

ssh -i [키페어 이름] [리눅스 계정명]@[EC2 퍼블릭 IPv4 DNS]

2.4 Docker 설치

Docker에 대한 설명은 추후에 추가할 예정. 리눅스 컨테이너? 라고 하는데 리눅스 개발환경을 컨테이너화한다 정도로 알고 있다.

 

AWS EC2 인스턴스에 Docker를 설치한다.

2.4.1 Docker 설치

처음 EC2에 접속하면, 리눅스가 완전 디폴트 상태기 때문에, 리눅스에서 기본 제공하는 apt 패키지를 update 해줘야 한다. 그리고 docker 설치한다.

sudo apt-get update
sudo apt-get install docker.io
sudo service docker start

2.4.1 Dockerfile 생성

Docker Image를 생성하기 위해서, Dockerfile을 작성했다.

FROM tomcat:8.5-jdk11-openjdk
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install git -y
RUN mkdir workspace
RUN git clone "git 주소 입력" /workspace
WORKDIR /workspace
RUN chmod u+x ./gradlew
RUN ./gradlew clean build
RUN mv ./build/libs/".war 또는 .jar" /usr/local/tomcat/webapps/

tomcat의 jdk 11버전 image를 기반으로 github으로부터 웰컴페이지가 있는 소스코드를 받아와 빌드하고, /webapps 아래로 이동시키면 자동으로 배포가 된다.

2.4.2 Docker build / run

1. sudo docker build --no-cache -t imsosloeepy/tomcat-was-server:latest .
2. sudo docker run -d --name tomcat-server -p 80:8080 imsosloeepy/tomcat-was-server:latest
3. sudo docker exec -it tomcat-server /bin/bash

1. 만들어둔 Dockerfile을 docker build 명령어를 통해서 docker image를 생성한다.

 

  1. docker build 명령어를 실행시키기 전에 Dockerfile이 있는 위치로 이동해야한다. 아니면 마지막에 . 명령어를 Dockerfile이 있는 위치를 지정하면 된다.
  2. docker images 명령어로 생성된 docker image를 확인 가능하다.

 

2. tomcat-server라는 이름을 갖는 docker container를 생성한다. -d 태그로 백그라운드에서 container를 실행시킨다.

 

  1. EC2의 80 포트를 tomcat-server docker의 8080과 매칭시킨다.(8080은 tomcat의 기본 포트다.)
  2. docker ps 명령어로 생성된 docker container를 확인 할 수 있다.

 

3. 위와 같이 docker container를 실행시키면 외부에서 확인가능하다.

 

 

3. 실행시킨 container를 커맨드라인으로 접근할 수 있는 명령어다.

 

3. 다음으로...

다른 EC2에 Jenkins를 띄워주기 전에, 웰컴 페이지를 띄워주는 EC2에서 Docker에서 Gradle 빌드할 때 계속해서 멈추는 문제가 발생했다.

 

무슨 문제인지 파악하기 어려웠던게 빌드 중간에 멈춰버려서 별다른 명령어가 나오지 않았고, 됐다 안됐다해서 어떤 문젠지 파악하기 힘들었다.

 

이 문제 때문에 몇 주는 고생했는데, 이를 어떻게 수정했는지부터 다음 내용을 작성하고, Jenkins와 WAS를 SSH로 연결하는 주제로 넘어가고자 한다.

'개발 > 인프라' 카테고리의 다른 글

Harbor의 리버스 프록시 문제...  (1) 2023.03.15
Harbor : Private Container Registry 설치하기  (1) 2023.03.15
웹서버와 WAS의 차이 정리  (1) 2023.01.26
Docker 정리  (0) 2023.01.26
VM(Virtual Machine)과 Docker  (1) 2023.01.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함