Docker로 Spring 웹 애플리케이션 배포하기 (2) - Docker 컨테이너에 배포
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를 다운받는다.
다운받은 폴더를 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 연결은 다음 편에서 진행하도록 하겠다.