이번 포스팅에서는 SpringBoot로 작성된 서버 파일을 Docker를 이용해 배포하는 방법에 대해 알아보도록 하겠습니다. Docker의 기본 개념이나 명령어는 이미 잘 알고 있다는 가정 하에 포스팅을 작성하였으니, 이해가 잘 안 되신다면 아래의 포스팅을 먼저 읽어주시기 바랍니다.
>> 도커란 무엇인가
스프링부트 프로젝트를 이미지로 만들기 위해선, 먼저 프로젝트를 JAR 파일로 변환해야 한다. JAR 파일을 생성하는 방법은 아래와 같다.
① IntelliJ 우측의 Grade을 클릭한 후, Tasks > build > bootJar을 클릭한다.
② 아래와 같이 build > libs에 jar 파일이 생성되는 것을 확인할 수 있다.
방금 생성한 JAR 파일을 기반으로 이미지를 생성할 것이다. 도커 이미지를 생성하는 방법에는 두 가지가 있는데, 여기서는 Dockerfile 스크립트로 이미지를 만드는 방법을 사용할 것이다.
① JAR 파일과 동일한 위치(build > libs)에 Dockerfile이라는 이름의 파일을 생성한다.
② Dockerfile 스크립트에 아래의 내용을 입력한다.
FROM openjdk:17
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
① Docker Desktop을 실행한다.
② IntelliJ 터미널에 아래의 명령을 입력한다.
cd build/libs
docker build -t {도커 허브 ID}/{레포지토리 이름:버전} {Dockerfile 경로}
③ 이미지가 잘 생성되었는지 확인해보자.
docker image ls
SpringBoot 프로젝트를 이미지로 만들었으니, 이제 이미지로 컨테이너를 만들어 실행만 하면 된다. 다만, 그전에 어떠한 환경에서도 이미지에 쉽게 접근할 수 있도록 DockerHub에 이미지를 Push 해야 한다.
현재 이미지에는 민감 데이터(yml 파일 등)가 포함되어 있으므로, Private Repository에 Push 하기로 하자.
① DockerHub에서 Repositories > Create repository 버튼을 클릭한다.
② Private Repository를 생성한다.
③ 도커에 로그인하기 위해 IntelliJ 터미널에 아래의 내용을 입력한다.
docker login
④ 로컬 이미지 이름 그대로 Push 할 것이기 때문에, 태그를 부여하는 과정은 생략하기로 한다.
⑤ 아래의 명령을 입력하여 이미지를 DockerHub에 업로드할 수 있다.
docker push {이미지 이름}
⑥ Dockerhub의 Repositories에서 방금 업로드한 이미지를 확인할 수 있다.
Putty를 이용해 EC2에 원격 접속한다. EC2 생성 밎 원격 접속에 대해서는, 아래의 포스팅을 참고하기 바란다.
>> EC2 생성 및 원격 접속
① Putty에 아래의 명령을 입력하여 EC2에 Docker를 설치하자.
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 install docker-ce docker-ce-cli containerd.io
② 아래의 명령을 입력해 Docker가 잘 실행되고 있는지 확인할 수 있다.
sudo systemctl status docker
③ User가 곧 root가 아닌 경우, 권한이 없다는 이유로 Docker가 실행되지 않는다. 따라서 아래의 명령을 입력해주어야 한다.
sudo usermod -aG docker $USER
sudo service docker restart
sudo systemctl restart docker
sudo chown root:docker /var/run/docker.sock
④ Docker에 로그인한다.
docker login
⑤ Dockerhub에 업로드한 이미지를 가져오자.
docker pull {이미지 이름}
docker image ls
⑥ 가져온 이미지를 이용해 컨테이너를 생성 및 실행한다.
docker run -i -t -p 8080:8080 {이미지 이름} &
// 또는 docker run -dit -p 8080:8080 {이미지 이름}
docker ps
⑦ API가 정상적으로 실행되는 것을 확인할 수 있다.
⑧ 서버를 종료하고 싶다면, 컨테이너를 종료하고 삭제하면 된다.
docker stop {컨테이너 ID}
docker rm {컨테이너 ID}
docker rmi {이미지 ID}