GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Docker

[ Docker ] 도커로 Spring 프로젝트 AWS 배포하기 ( DockerHub )

Backcoder 2022. 12. 28. 16:27

Docker 는 프로젝트를 '이미지' 로 가져와서 '컨테이너' 를 생성해 배포를 가능하게 해줍니다. 

 

열심히 만든 프로젝트를 '이미지' 로 만들기 위해서는 먼저 Spring 프로젝트를 jar 혹은 war 파일로 빌드해주어야 합니다. 

 

 

프로젝트를 Build 해주기 전에, 

먼저 Dockerfile 을 프로젝트에 추가해주어야 합니다.

 

사진처럼 프로젝트의 최상단 경로에서 Dockerfile 을 생성해줍니다. 

 

[ Dockerfile ] 

FROM openjdk:11-jdk
ARG WAR_FILE=build/libs/*.war
COPY ${WAR_FILE} app.war
ENTRYPOINT ["java","-jar","/app.war"]
  • Dockerfile은 DockerImage를 생성하기 위한 설정파일 스크립트 입니다. 
  • 빌드 시, Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 DockerImage를 생성해줍니다.

 

=>  jdk11 에서 .war 로 된 파일을 COPY 해서 app.war 로 만들겠다. 

( jar 파일로 배포되는 프로젝트라면 war => jar 로 만 바꾸어주면 됩니다. )

 

이제 Docker 에게 보낼 명령서도 작성해 두었겠다, 배포파일로 Build를 진행합니다.   

 

프로젝트로 가서 

gitBash 등 터미널에서 ( 프로젝트 최상위 경로 ) 빌드를 해줍니다. 

: 빌드하기전에 clean 으로 기존 빌드를 지우고, 새롭게 build

 

빌드를 해주면 

build - libs 경로에 war / jar 파일이 생성됩니다. 

 

이제 로컬에 있는 저 jar/war 파일을  ==>   AWS 의 깡통서버에  옮겨야 합니다.

 

옮기는데는 DockerHub 를 이용해 주었습니다. 

 

DockerHub에 새로운 Repository 를 만듭니다.

마찬가지로 프로젝트의 gitBash 등 터미널에서

docker build --build-arg DEPENDENCY=build/dependency -t backcoderjune/askproject .

~ ... -t 도커허브아이디/생성한리포지토리 .  

도커허브의 리포지토리로 build를 해주면 

=> Dockerfile 에 작성된 스크립트 내용대로 실행하며 '이미지' 로 빌드를 해주게 됩니다. 

docker push backcoderjune/askproject

만들어진 이미지를 push 해줍니다. 

( 마치 GitHub 에 push 하는 과정과 유사합니다. add . /  push   ) 

 

push 가 완료되면 dockerhub 사이트 레포지터리에 빌드해둔 프로젝트가 올라가 있는 상태입니다. 

 

 

이제 AWS 깡통서버에 가서 Docker 를 이용해 DockerHub 에 있는 저 빌드된 프로젝트를 PULL 해올겁니다. 

docker pull 을 해주면 dockerHub 에 있는 우리의 프로젝트는 빌드된 상태의 '이미지' 로 docker 에 생성됩니다. 

 

 

EC2 깡통 서버에 먼저 Docker 를 설치해줍니다. 

( 출처 : https://velog.io/@mooh2jj/AWS-EC2-Docker-%EC%84%A4%EC%B9%98 )

 

Docker, docker-compose 설치

AWS EC2-instance에 docker를 설치하는 방법이다.ubuntu 버전에 docker 설치는 다음 명령어를 따른다.정확한 설치방법은 docker 가이드문서에서 꼭 확인하고 설치하자.https://docs.docker.com/engine/install

velog.io

 

# 오래된 버전 삭제
sudo apt-get remove docker docker-engine docker.io containerd runc

sudo apt-get update
# repository 설정
sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
# Docker의 Official GPG Key 를 등록
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# stable repository 를 등록
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker Engine 설치
sudo apt-get update
 
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
# 설치 완료 확인, 버전 확인
docker --version

 

docker 설치가 완료되었고, 로그인을 해줍니다. 

임시권한을 주고 로그인해 줍니다. 

sudo chmod 666 /var/run/docker.sock
docker login

 

이제 EC2 깡통서버에서 docker에 접속해있습니다.

 

위에서 dockerHub 에 우리의 프로젝트를 Push 해두었던 걸 이 docker에서 PULL 을 해옵니다. 

docker pull backcoder/askproject

( docker pull 도커허브아이디/리포지토리 ) 

 

=> PULL 되어오면서, 우리의 프로젝트는 빌드가 완료된 IMAGE 상태Docker 에 받아와 집니다.

 

[ docker 이미지 확인 ] 

docker images

프로젝트가 '이미지' 로 생성되어 있는 것을 확인 할 수 있습니다.

 

이제 우리의 프로젝트 '이미지' 로 ==>  '컨테이너' 를 생성해주면 사실상 배포가 완성됩니다.  

 

[ 이미지로 컨테이너로 생성 ]

docker run -p 8080:8080 --name springboot-mysql 프로젝트이미지ID

docker run 으로 컨테이너를 생성해줄 수 있고 

-p 로 포트번호를 연결시켜 줍니다. 

--name 은 컨테이너 이름을 지어주고 

-d 는 백그라운드에서 실행되도록 해줍니다. 

프로젝트이미지ID 로 위에서 docker images 로 확인한 IMAGE ID 를 써줍니다.

 

 

이렇게 해주면 컨테이너가 생성되고  Spring 프로젝트가 실행, 

AWS 의 퍼블릭 IP :8080 포트로 (-p 로 지정한 포트) 접속이 가능합니다. 

( EC2 인스턴스에서 인바운드 규칙 포트를 열어두어야 합니다. ) 

 

배포가 완료 된 것이죠. 

 

 

 

 

AWS 깡통 서버에 해준거라고는 

 

Docker 설치 => Docker Pull 로 프로젝트 이미지 가져오기 => Container 생성 => 끝 

입니다. 마법같네요. 

 

 

하지만 이렇게 컨테이너를 생성해서 사용하면, 각 컨테이너들은 독립적으로 구성되기 때문에 

 

(1) 우리 프로젝트 컨테이너 

(2) DB연동을 위한 MySQL 컨테이너 

 

두 개를 생성해 두었더라도, 둘 사이에는 '연결고리' 가 없는 상태가 됩니다.

즉, 프로젝트에서 DB 를 사용할 수 없는 상태입니다. 

다음글에서는 이 두 독립적인 컨테이너들을 연결시켜주는 과정을 다루어보고자 합니다.

 

서버에 JDK 부터 시작해 한땀한땀 개발환경을 구성해서 배포해보고,

Docker를 사용해 배포를 진행해보니, 편의성이나 속도 측면에서 확실히 Docker 가 많이 이용되는 이유를 알 수 있었습니다. 하지만 중요하고 큰 서버의 경우는 가상환경인 docker container 보다는 직접 개발환경을 구축해서 진행하는게 더 선호되고 있다고도 합니다. 필요에 따라 적절한 방법으로 배포환경을 구성하는 역량을 키워가야 겠습니다.