개인 프로젝트로 진행하던 공간예약플랫폼의 CI/CD 구축과정을 기록하고자 글을 남깁니다.
1편은 가장 기본적인 서버를 생성하고, 어플리케이션을 Docker이미지로 Build한 후 해당 서버에서 실행하는 과정을 작성하였습니다.
물론 자바빌드파일(.jar)을 서버로 가져와서 직접 실행해주는 방법도있지만, Docker로 배포한다면 컨테이너를 사용하여 어플리케이션과 해당 종속성까지 패키징하기때문에 어떤 환경이든 동일하게 실행이 가능하다는 장점을 가지고 있어 선택하였습니다.
또한 한 서버에 어플리케이션 외에도 연관된 Redis, RabbitMQ까지 함께 띄울 예정이기 때문에 Docker를 사용하여 여러 개의 컨테이너를 쉽고 효율적으로 관리하고자 하였습니다.
네이버 클라우드 콘솔(https://console.ncloud.com/dashboard)에 접속한 후 [Services] > [Server] 화면으로 들어가서 서버를 생성해줍니다.
참고로 저는 아래 스펙으로 서버를 생성하였습니다.
최근 네이버클라우드에서 Ubuntu OS지원은 종료한거같더라구요. Cent OS로 만들어도 무방합니다.
서버 설정 후엔 인증키(pem파일)도 새로받아서 저장해주고
ACG도 선택해준 후 생성하면 끝입니다. 이때 ACG는 서버의 네트워크 접근 규칙입니다.
서비스를 외부에서 접속하기 위해서는 반드시 공인IP가 필요합니다. 아래 화면에 들어가서 IP를 신청하고 서버에 적용해줍니다.
공인 IP를 생성했다면 이제 ACG설정이 필요합니다. 저는 22포트로 SSH접속을하고 8080포트로 서비스할 예정이므로 해당 포트에 규칙을 설정해주었습니다. 접근은 모든 IP에서 할 수 있도록 하였습니다.
모든 설정을 마쳤기때문에 서버로 접속이 가능합니다. 하지만 저희는 관리자 비밀번호를 모르기때문에.. 서버를 생성하면서 받은 pem키로 비밀번호를 받아봅시다.
서버를 선택 후 [서버 관리 및 설정 변경] > [관리자 비밀번호 확인] 클릭
pem 키 첨부 후 비밀번호 확인
PC에서 SSH로 직접 접속해봅시다. cmd창을 열고 아래 아래 명령어를 입력 후 비밀번호까지 입력해줍니다.
ssh root@공인IP -p 22
접속에 성공했다면 이제 우리가 익숙한 비밀번호로 변경이 필요합니다.
passwd
너무 짧으니까 경고를 주네요.. 그래도 변경은 완료되었습니다!
서버에 Docker를 설치해줍니다. 저는 Ubuntu OS이기때문에 아래 절차대로 수행해주었습니다.
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
출처 : https://velog.io/@osk3856/Docker-Ubuntu-22.04-Docker-Installation
본인 PC에도 OS에 맞게 설치해줍니다. https://www.docker.com/get-started/
build한 Docker이미지를 올릴 저장소가 필요합니다. DockerHub(https://hub.docker.com/)에 가입 후 새로운 Repository를 생성해줍니다.
앞으로 만들 Docker이미지는 해당 Repository에 지속적으로 배포될 예정이며, namespace/repository-name
이 이미지 이름이 됩니다.
어플리케이션을 Docker 이미지로 만들기 위해서는 Docker File이 필요하므로 프로젝트 스펙에 맞게 작성해줍니다.
저는 SpringBoot어플리케이션을 배포하기때문에 스프링공식문서(https://spring.io/guides/topicals/spring-boot-docker/)를 참고하여 작성하였습니다.
FROM adoptopenjdk/openjdk11
EXPOSE 8080
ARG JAR_FILE=build/libs/*-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
FROM adoptopenjdk/openjdk11
: 도커 레지스트리에서 필요한 이미지를 다운받아 이를 기반으로 새로운 이미지를 생성합니다.EXPOSE 8080
: 해당 컨테이너의 8080포트를 개방합니다.ARG JAR_FILE=build/libs/*-SNAPSHOT.jar
: 빌드된 jar파일 경로를 변수로 설정합니다.COPY ${JAR_FILE} app.jar
: 빌드된 jar파일을 Docker 이미지안에 /app.jar로 복사합니다.ENTRYPOINT ["java", "-jar", "/app.jar"]
: 컨테이너가 시작될 때 실행하는 명령어를 지정합니다.해당 도커파일은 배포하고자하는 프로젝트의 root경로에 작성해주세요.
로컬에서 이미지가 잘 생성이 되는지 테스트 해봅니다. 참고로 마지막 .
은 도커파일이 현재 디렉토리에 있다는 뜻입니다.
docker build -f Dockerfile -t namespace/repository-name .
로컬에서 생성한 이미지를 Repository에 올려봅시다. 도커허브계정으로 접속 후 만들어준 이미지를 push해주면 hub에 업로드된것을 확인할 수 있습니다.
docker login -u 계정이름 -p 비밀번호
docker push namespace/repository-name
이제 거의다 끝났습니다. 방금 docker에서 올린 이미지를 서버에서 실행해봅시다!
서버에 다시 접속해주고 아래 명령어를 입력해줍니다.
docker pull namespace/repository-name # 이미지 다운로드
docker run -d -p 서버port:컨테이너port --name 컨테이너이름 namespace/repository-name # 이미지 실행
-d
옵션 : 컨테이너를 백그라운드에서 실행한다는 의미입니다.-p
옵션 : 컨테이너포트와 서버포트를 binding합니다.실행 후 로그도 확인해보고 서비스도 접속해보면 정상적으로 동작하는걸 확인할 수 있습니다.
docker logs -f 컨테이너이름
제가 배포하는 프로젝트는 Redis와 RabbitMQ에 의존성을 가지고있습니다. 따라서 이들까지 서버에 올려봅시다.
docker run --name myredis -d -p 6379:6379 redis --requirepass "비밀번호"
redis-cli -p 6379
auth 비밀번호
docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=계정명 -e RABBITMQ_DEFAULT_PASS=비밀번호 rabbitmq:3-management
공인IP:15672
로 접속하여 설정한 계정명과 비밀번호로 접속해줍니다.💡 당연히 ACG설정으로 NCP서버의 6379, 5672, 15672포트를 개방해야 외부에서 접속이 가능합니다!
정리하고 보니 굉장히 긴 과정이었네요. 저는 참여했던 프로그램에서 네이버클라우드 크레딧을 제공해 주셔서 사용해 보았는데 UI도 굉장히 직관적이고 사용하기 편리하더라고요. 특히 한국에서 제공하는 서비스이기때문에 메뉴얼도 이해하기 쉬웠습니다. 기회가 된다면 모니터링 툴이라던지 서버말고 다른 기능도 사용해보고싶네요!
기본적은 인프라는 구성했으므로 다음 글은 GithubAction으로 CI/CD를 구축하는 과정을 담을 예정입니다. 감사합니다.
잘보고 갑니다~ 많은 도움이 될 거 같아요