[Spring] Docker를 활용한 배포(2) - Docker 설치 및 이미지 생성

박도연·2024년 10월 23일

Spring

목록 보기
6/7
post-thumbnail

배포 1탄 - EC2, RDS 생성
1탄에 이어 2탄에서는 docker를 설치하고, 이를 활용한 배포를 해보겠다능

Docker는 공부할 게 많은 것 같다.. 나는 가벼운 서버를 다루었기 때문에 도커에 많은 작업을 해두지는 않았다.

Docker를 활용하여 배포를 하는 과정을 간략하게 설명을 해보자면 아래와 같다.

작성한 코드를 로컬에서 Docker Image로 저장
-> 로컬에서 생성한 이미지를 Docker Hub에 Push
-> 리눅스 서버에 접속하여 Docker Hub에 올라온 이미지를 Pull
-> 도커를 실행(Run)하여 배포

Docker 설치

다음 링크를 참고하여 맥북에 도커를 설치해주었다. 그리고 도커 회원가입까지 마쳐준다.
https://happylie.tistory.com/78

IntelliJ에 jar 파일 생성

IntelliJ 오른쪽 사이드바의 코끼리 모양 Gradle 탭을 열고, Tasks > build > bootJar를 실행하면 Spring Boot 실행용 JAR 파일이 생성된다.

또는 터미널에서 아래 명령어를 실행해도 된다.

./gradlew clean bootJar

전체 빌드와 테스트까지 함께 수행하려면 다음 명령어를 사용할 수 있다.

./gradlew clean build

프로젝트 파일 경로의 build > libs에 가면 이렇게 JAR 파일이 생성된 것을 볼 수 있다.

프로젝트명-0.0.1-SNAPSHOT.jar 
프로젝트명-0.0.1-SNAPSHOT-plain.jar

여기서 Docker 배포에 사용할 파일은 plain이 붙지 않은 실행 가능한 Spring Boot JAR 파일이다.

Dockerfile 생성

프로젝트에 Dockerfile을 하나 생성해준뒤 아래 코드를 작성해준다.

# Java 17 런타임 환경이 포함된 베이스 이미지를 사용
FROM eclipse-temurin:17-jre  

# 컨테이너 내부 작업 디렉토리를 /app으로 지정
WORKDIR /app    

# 로컬에서 생성된 JAR 파일을 Docker 이미지 내부의 app.jar로 복사
ARG JAR_FILE=build/libs/*SNAPSHOT.jar
COPY ${JAR_FILE} app.jar     

# 컨테이너가 8080 포트를 사용한다는 것을 명시
EXPOSE 8080     

# JVM 힙 메모리를 256MB로 시작하고 최대 512MB까지 사용하도록 제한한 뒤, app.jar 실행
ENTRYPOINT ["java", "-Xms256m", "-Xmx512m", "-jar", "app.jar"]

터미널에서 Docker 이미지 생성

그전에 먼저 Docker 로그인을 해보자

우선 도커에 들어가 도커 회원가입을 하고 generate new token을 해준다. access permissions은 Read, Write, Delete로 설정해준다.

Generate를 하면 비밀번호(personal token)가 생성되는데 이 값은 따로 복사하여 저장해두자.

터미널에서 도커에 로그인할때 아래 코드를 작성해주면 된다. (비밀번호는 저장해둔 personal access token 입력)

docker login -u <아이디> -p <비밀번호>

이제 이미지를 생성해보자

docker build --platform linux/amd64 -t <도커계정이름>/<이미지이름> .   

‼️ 맥북의 경우 --platform linux/amd64 를 추가해주어야 합니다. 마지막에 .(점)은 꼭 넣어주어야 함

빌드가 정상적으로 완료되면 터미널 마지막 부분에 다음과 같은 메시지가 출력된다.

=> exporting to image
=> => naming to docker.io/<도커계정이름>/<이미지이름>:latest

이 메시지가 보이면 Docker 이미지가 성공적으로 생성된 것이다 !


생성된 이미지를 조회해보자

docker images  //현재 생성된 이미지 조회

조회를 하면 아래와 같이 생성된 이미지를 볼 수 있다.

IMAGE                          ID             DISK USAGE   CONTENT SIZE   EXTRA
<도커계정이름>/<이미지이름>:latest   abc123def456        581MB             0B

생성된 이미지를 Docker Hub에 Push

터미널에서 도커 이미지를 푸시해준다.

docker push <도커계정이름>/<이미지이름>

Docker Desktop에 접속하여 Hub가면 이미지가 올라온 것을 확인할 수 있다.

리눅스 서버에 접속하여 배포

uduntu 서버 접속

ssh -i < 이름>.pem ubuntu@<AWS 공용 IP>

aws에서 받은 pem파일이 있는 위치로 이동한 뒤, 위 코드를 입력해준다.
접속 성공 !


도커 이미지 pull
도커에 로그인을 해주고, hub에 올라온 이미지를 pull 받는다.

sudo docker login -u <아이디> -p <비밀번호>
sudo docker pull <도커아이디>/<이미지이름>

(우분투 서버에서는 권한때문인지, 앞에 sudo를 붙혀주어야 작동할때가 많다.)

도커 컨테이너 실행
이미지를 pull 받았다고 해서 서버가 실행되는 것은 아니다.

실제 Spring Boot 서버를 실행하려면 docker run 명령어로 컨테이너를 실행해야 한다.

sudo docker run -d \ --name <컨테이너명> \ --restart unless-stopped \ -p 8080:8080 \ <도커사용자이름>/<이미지이름>

-p 8080:8080은 EC2 호스트의 8080 포트와 Docker 컨테이너 내부의 8080 포트를 연결한다는 의미이다. 앞의 8080은 외부에서 접근하는 EC2의 포트이고, 뒤의 8080은 컨테이너 내부에서 Spring Boot 애플리케이션이 실행되는 포트이다.
따라서 브라우저에서 http://<AWS 공용 IP>:8080으로 접속하면 요청이 EC2의 8080 포트로 들어오고, Docker가 이를 컨테이너 내부 8080 포트로 전달해 Spring Boot 서버에 접근할 수 있게 된다.


실행 중인 컨테이너 확인

sudo docker ps

위 명령어를 실행해주면 아래와 같이 현재 실행중인 컨테이너와 이미지를 확인할 수 있다.

CONTAINER ID   IMAGE                       COMMAND                  STATUS         PORTS                    NAMES
xxxxxxxxxxxx   <도커사용자이름>/<이미지이름>      "java -Xms256m ..."      Up ...         0.0.0.0:8080->8080/tcp   <컨테이너명>

애플리케이션 정상 실행 확인

sudo docker logs -f <컨테이너명>

정상적으로 실행되면 로그에서 아래와 같은 내용을 확인할 수 있다.

Tomcat started on port 8080 
Started Application

이 로그가 보이면 Spring Boot 애플리케이션이 컨테이너 내부에서 정상적으로 실행된 것이다.


이후 브라우저에서 아래 주소로 접속하여 Swagger 화면이 뜨는지 확인한다.

http://<AWS 공용 IP>:8080/swagger-ui/index.html

자, 이러면 배포가 완료된 것이다 !! 💃🕺🏻

배포 1탄 - EC2, RDS 생성

profile
도여줄게 완전히 도라진 나

0개의 댓글