SpringBoot + Docker + EC2 조합은 최근 자바 프로젝트에서 자주 사용하는 환경 구성입니다.
그래서 오늘은 로컬과 서버에 시스템을 구축하고 배포하는 방법을 알아보겠습니다.
먼저, 시스템 흐름도를 통해서 보면 이해가 쉬워집니다.
Spring Initializr
통해 간단하게 SpringBoot 프로젝트를 구축합니다.
별도의 개인 프로젝트가 있다면, 그대로 사용해도 좋습니다.
package com.devfoxstar.springbase.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HomeController { @RequestMapping("/") public String sample() { return "Home"; } }
초기에는 DockerBox
를 활용해서 가상 환경을 구성했습니다.
하지만 윈도우와 맥 모두 자체 가상 환경을 제공하면서, DockerBox는 더 이상 사용하지 않습니다.
맥은 전부터 간편하게 도커 구성이 가능했습니다.
윈도우도 WSL2(Windows Subsystem for Linux 2)
가 도입되면서, 구성이 한결 쉬워졌습니다.
윈도우 환경이라면 도커를 설치하기 전에 WSL2를 먼저 설치해 줍니다.
그리고 Docker Desktop 프로그램을 설치합니다.
Docker Desktop for Mac Docker Desktop for Windows
프로젝트에 도커를 설정하는 방법은 간단합니다.
프로젝트 루트에 Dockerfile
파일을 생성하면 됩니다.
FROM amazoncorretto:17 COPY build/libs/*.jar spring-base.jar ENTRYPOINT ["java", "-jar", "/spring-base.jar"]
기본적인 내용으로 구성했지만, 이 외에 추가 옵션들이 많이 있습니다.
실제 프로젝트에서는 좀 더 복잡한 설정 파일을 볼 수 있습니다.
SpringBoot 프로젝트 루트 경로로 가서 도커 이미지를 생성합니다.
도커 명령어를 실행하면 Dockerfile에서 설정한 내용들이 실행됩니다.
참고로 계정명/프로젝트명으로 이미지를 생성하는 이유는 나중에 도커 허브에 푸시하기 위해서입니다.
docker build -t devfoxstar/spring-base .
docker images
명령어로 생성된 도커 이미지를 확인합니다.
생성된 이미지로 컨테이너를 실행합니다.
이때 포트를 2개 적는 이유는 Host Port
와 Container Port
를 연결하기 위함입니다.
docker run -d -p 8080:8080 devfoxstar/spring-base
docker ps
명령어로 실행 중인 컨테이너를 확인할 수 있습니다.
이제 http://localhost:8080/
경로로 들어가면 페이지를 확인할 수 있습니다.
참고로 명령어로 실행한 내용들은 Docker Desktop에서도 간편하게 확인할 수 있습니다.
하지만 처음에는 명령어로 개념을 익혀 두는 걸 추천합니다.
도커 허브 사이트에 먼저 계정을 등록해야 합니다.
그리고 로그인을 진행합니다.
$ docker login Authenticating with existing credentials... Login Succeeded
다음으로 본인의 허브 Repository에 이미지를 푸시합니다.
$ docker push devfoxstar/spring-base
그러면 도커 허브 사이트에서 푸시된 이미지를 확인할 수 있습니다.
먼저 AWS에서 프리 티어 버전을 신청합니다.
저는 EC2 인스턴스에 Amazon Linux 2 AMI
를 설치했습니다.
이제 도커 허브의 이미지를 연결하겠습니다.
먼저 도커를 설치하고 프로그램을 실행합니다.
sudo yum install docker sudo systemctl start docker
다음으로 도커 허브의 이미지를 풀합니다.
sudo docker pull devfoxstar/spring-base
그리고 이미지를 실행합니다.
사실 로컬과 서버에서 진행 과정은 거의 동일입니다.
sudo docker run -d -p 8080:8080 devfoxstar/spring-base
이제 로컬과 마찬가지로 컨테이너를 확인해 봅니다.
참고로 외부 서비스를 한다면 80:8080으로 설정해서 80 포트로 접근을 설정합니다.
포트로 접근하기 위해서는 EC2 콘솔에서 보안 규칙을 추가해 줘야 합니다.
네트워크 및 보안 - 보안 그룹 - 보안 그룹 ID 인바운드 규칙에 80 또는 8080 포트 추가
그러면 로컬에서와 마찬가지로 http://IP:8080/
또는 http://IP/
로 접근이 가능합니다.
지금까지 로컬부터 도커 허브 그리고 서버 배포까지 알아봤습니다.
전체적인 프로세스를 알고 있다면, 그리 어렵지 않은 과정입니다.
그리고 실무에서도 비슷한 방식으로 프로젝트 배포가 이루어 집니다.
물론 Docker Compose
, GitLab
, Jenkins
, NGINX
, LoadBalancer
, Kubernetes
등 좀 더 복잡한 추가 기능들도 있습니다.
하지만 CI/CD
나 DevOps
는 점차 전문화되고 세분화되기 때문에, 개발자는 우선 여기까지만 알아도 충분합니다.