Cloud

Docker로 Spring 웹 애플리케이션 배포하기 (2) - Docker 컨테이너에 배포

오은이 2024. 12. 12. 09:23

 

 

0. 메이븐 설치 확인하기

 

Windows PowerShell에 아래 명령어 입력

> mvn -v

 

 

* 빨간 코드가 안 떴다면 1번으로 넘어가기 *

 

 

위와 같이 빨간 코드가 뜬다면 메이븐 설치가 안 된 것이다.

 

아래 링크에 들어가서 설치부터 진행

 

 

 

 

 

Maven 다운로드

 

 

Download Apache Maven – Maven

Downloading Apache Maven 3.9.9 Apache Maven 3.9.9 is the latest release: it is the recommended version for all users. System Requirements Java Development Kit (JDK) Maven 3.9+ requires JDK 8 or above to execute. It still allows you to build against 1.3 and

maven.apache.org

 

Binary zip archives를 다운받는다.

 

 

 

apache-maven-3.8.8-bin.zip
7.99MB

 

 

 

 

다운받은 폴더를 Program Files > Apache 폴더 안에 압축 해제했다.

 

 

 

 

 

 

Maven 환경변수 세팅

 

변수 이름 : MAVEN_HOME, 변수 값 : 방금 만든 폴더 경로로 환경 변수를 생성한다.

 

 

② 이후 시스템 변수의 Path > 편집 > 새로 만들기를 하여 bin 경로를 추가한다.

C:\Program Files\Apache\apache-maven-3.8.8\bin

 

 

 

 

 

Shell 재실행 후 다시 명령어 입력

> mvn -v

 

빨간 코드가 사라진 것을 볼 수 있다!

 

메이븐 설치 성공

 

 

 

 


 

 

 

 

 

1. 이클립스 Maven Clean으로 패키징

 

프로젝트 우클릭 > Run As > 5 Maven Clean

 

 

 

 

콘솔창 확인

 

프로젝트가 WAR 파일로 성공적으로 패키징 되었음을 나타냄!

 

 

 

 

 

 

2. Dockerfile 작성

 

 

Getting Started | Spring Boot with Docker

Congratulations! You have created a Docker container for a Spring Boot application! By default, Spring Boot applications run on port 8080 inside the container, and we mapped that to the same port on the host by using -p on the command line.

spring.io

 

Spring Boot라면 위 페이지 참고하여 Dockerfile 작성

 

 

 

 

 

 

프로젝트 루트 폴더 안에 Dockerfile을 만들었다. (target 폴더 안에 생성 아님!!!)

 

 

 

 

# Tomcat 8..을 기반 이미지로 사용
FROM tomcat:8.5

# Spring 애플리케이션의 WAR 파일을 찾기 위해 Maven 빌드 후 target 디렉토리에 생성된 WAR 파일을 복사
# 여기서 WAR_FILE은 Maven 빌드 후 target 폴더에 생성된 WAR 파일을 의미
ARG WAR_FILE=target/*.war

# Tomcat을 8080 포트에서 실행
EXPOSE 8080

# Tomcat은 이미 ENTRYPOINT로 기본 실행되므로, 별도로 명시할 필요는 없음

# Copy WAR file into the Tomcat webapps directory
COPY ./path/to/animalpage.war /usr/local/tomcat/webapps/ROOT.war

 

나는 Spring Boot가 아니라 톰캣을 이용한 Spring 웹 페이지이기 때문에 위와 같이 작성했다.

 

 

 

 

 

 

 

3. Docker Repository 생성

 

작성한 Dockerfile로 프로젝트 빌드 및 이미지화하여 Docker hub에 push하기

 

 

Docker Hub Container Image Library | App Containerization

Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.

hub.docker.com

 

docker 사이트 접속 후 로그인 > Docker Hub 메뉴 클릭

 

 

 

 

 

Create repository 클릭

 

 

 

 

 

 

레포지토리 이름과 설명을 적고 Create 클릭

 

 

 

 

 

 

4. Docker 이미지 생성

 

Windows PowerShell을 열고 도커 파일을 생성한 위치로 이동 후 명령어 입력

 

 

자신이 도커파일을 생성한 프로젝트 위치로 이동

> cd /GovFrameDev-3.10.0-64bit/workspace/Test8_shop

 

 

메이븐 패키징

> mvn package

배포 가능한 아티팩트(jar, war 파일 등 생성)

 

 

도커 이미지 생성

// docker build -t {docker hub 계정명}/{docker hub repository명} .
> docker build -t oeun/animalpage .

 

 

 

 

위와 같이 파란 코드가 뜬다면 도커 이미지 생성 성공!

 

 

만약 빨간 코드가 뜬다면..?

더보기

나는 실제로 아래와 같은 에러가 떴었는데

 

===================================================
[ERROR] Failed to execute goal on project Test8_shop: Could not resolve dependencies for project com:Test8_shop:war:1.0.0: Failed to collect dependencies at egovframework.rte:egovframework.rte.ptl.mvc:jar:3.10.0: Failed to read artifact descriptor for egovframework.rte:egovframework.rte.ptl.mvc:jar:3.10.0: Could not transfer artifact egovframework.rte:egovframework.rte.ptl.mvc:pom:3.10.0 from/to maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories: [egovframe (http://maven.egovframe.go.kr/maven, default, releases), egovframe_old1 (http://maven.egovframe.kr:8080/maven/, default, releases), egovframe_old2 (http://www.egovframe.go.kr/maven/, default, releases)]

===================================================

 

 

pom.xml에 

<repository>
<id>egovframe</id>
<url>https://maven.egovframe.go.kr/maven/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>

url 부분이 http로 되어있었다!

 

https로 변경 후 mvn clean install -U 명령어로 메이븐 강제 업데이트하여 해결됨

 

 

 

 

 

5. Repository로 이미지 push

// docker push {docker hub 계정명}/{docker hub repository명}:{tagname(optional)}
> docker push oeun/animalpage

 

 

 

 

 

 

 

6. 우분투에서 docker 실행

 

명령어를 순서대로 입력

 

시스템 패키지를 최신 상태로 업데이트

$ sudo apt update
$ sudo apt upgrade -y

 

 

Docker 패키지 설치

$ sudo apt install docker.io -y

 

 

Docker 시작 및 상태 확인

$ sudo systemctl start docker	# 도커 시작
$ sudo systemctl status docker	# 도커 상태 확인

 

위와 같이 active (running)이 뜬다면 정상 실행!

 

 

 

 

 

 

7. Docker hub에 업로드한 Docker 이미지 파일 내려받기

$ # sudo docker pull {계정명}/{repository명}
$ sudo docker pull oeun/animalpage

 

 

 

 

 

8. Docker 이미지 구동

$ # sudo nohup docker run -p {host 포트}/{container 포트} {docker hub 계정명}/{docker hub repository명} > nohup.out 2>&1 &
$ sudo nohup docker run -p 8081:8080 oeun/animalpage > nohup.out 2>&1 &

$ sudo docker ps # 도커 컨테이너 목록 확인

 

또는

 

 

윈도우 파워쉘에서 실행

> docker-compose up -d

(기존 컨테이너가 있으면 다시 시작, 없으면 생성)

 

 

 

 

9. 결과 확인

 

 

컨테이너가 돌아가고 있는 가상 호스트 머신의 IP

$ hostname -I

 

맨 앞에  X.X.X.X 형식으로 IP가 나온다.

 

 

톰캣 실행 후 주소 접속하기 ( X 부분에 자기 IP 넣기)

http://X.X.X.X:8081

 

원래 DB 연결을 안 해도 화면은 뜰 것인데 

 

난 접속 결과 하얀 화면만 뜬다..^^

 

 

 

로그 확인

$ cat nohup.out

 

DB 연결 오류가 엄청나다.

 

DB 연결은 다음 편에서 진행하도록 하겠다.