DevOps/Docker

[Docker] Spring Boot 배포하기

석석's 2021. 10. 20. 14:27

개발환경별로 어플리케이션을 배포하는게 참 할때마다 힘들었다... 

윈도우에서 개발하고 리눅스로 배포하고 ... 

 

하지만 도커를 이용하면 동일한 환경에서 하는 것 처럼 배포가 가능해진다.

 

먼저 Spring boot를 배포하기 위해서는 프로젝트 jar 파일이 필요하다. 

 

1. jar 파일 만들기

   - 인텔리제이에서 gradle - Tasks - build - bootJar

   - 프로젝트 위치에서 build - lib 밑에 jar 파일이 생성된걸 확인 할 수 있다.

 

2. 특정위치로 jar파일을 옮기기

   - 특정위치에 jar파일을 옮긴다.

   - volume mount 할 폴더들도 미리 만들어두자!!

        images : 파일 업로드 기능에서 사용 될 폴더와 동기화될 폴더 

        mydb : mysql 데이터베이스 와 동기화 될 폴더

 

3. 터미널을 열어 위에서 정한 특정위치로 이동하기

 

 

4. Dockerfile 작성하기

   - Springboot 파일이 들어있는 이미지를 만들 용도로 쓰일것이다.

   - 작성 후 아까 위에있는 특정위치에 같이 넣어두자!!(나 같은경우 E:\mydocker\myspring)

 

FROM williamyeh/java8

docker search java8 명령어로 찾은 java 이미지 중에 하나인 "williamyeh/java8" 을 기본이미지로 설정하겠다는 의미이다.

 

COPY *.jar app.jar

현재 위치에 있는 ".jar" 가 들어있는 파일을 app.jar라는 이름으로 복사해오겠다는 뜻이다.

여기서 .jar가 들어간 파일은 아까 1번에서 만든 프로젝트 jar파일이다.

 

 

ENTRYPOINT ["java","-jar","app.jar"]

해당 이미지를 가지고 컨테이너에 넣고 실행시 바로 실행되는 명령어를 적은것이다

java -jar app.jar 명령어가 실행된다.

 

FROM williamyeh/java8
COPY *.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]

Dockerfile 코드 최종본!

 

 

 

5. docker-compose yml 파일 작성하기

   - 여러 이미지를 한번에 연결시켜(spring boot + mysql) 편하게 실행시키려고 만든 것이다.

   - 이 파일 역시 작성 후 아까 위에있는 특정위치에 같이 넣어두자!!(나 같은경우 E:\mydocker\myspring)

   - 작성일 기준 3.9버전 까지 나와있는데 그냥 3.8이 편해 3.8하였다.

 

 

 

docker-compose 파일은 현재 3가지로 나누어 작성했다. 

  1. version - compose파일의 버전
  2. services - 실행될 컨테이너에 관한 설정
  3. networks - 커스텀 네트워크 생성

 

services 에는 두가지로 나뉘는데 

하나는 db인 mysql 이고 다른 하나는 web인 spring boot jar 파일을 담은 java8 이미지 이다.

 

 

mysql

db:
    
    image: mysql:5.7  				#이미지의 이름
    container_name: db 				#컨테이너의 이름 
    volumes:  					#동기화 할 폴더
      - ./mydb:/var/lib/mysql 
    restart: always 				#db가 죽었을때 되살리는 빈도   
    environment:  				#환경설정
      MYSQL_DATABASE: minijpa  			# 생성할 database
      MYSQL_ROOT_PASSWORD: pass 		# root의 password
      MYSQL_TCP_PORT: 3307 			# 동작포트  
    ports: 					#호스트와 컨테이너의 동작포트 연결
      - "3307:3307"   
    command: 					#옵션!(인코딩 설정..) 
      - --character-set-server=utf8mb4 
      - --collation-server=utf8mb4_unicode_ci 
    networks: 					#커스텀 네트워크에 연결
      - app_network

 

 

spring-boot

webapp:    
    build: 				#컨테이너에 담길 이미지 설정부
      context: .			#Dockerfile 이 있는 위치(현재 E:\mydocker\myspring) 
      dockerfile: Dockerfile 		#Dockerfile 의 이름
      
    image: my/spring:v1 	 	#생성될 이미지의 이름(위에서 build옵션으로 이미지 이름을 못정해서 사용)
    container_name: app      		#컨테이너명
    volumes:				#동기화 할 폴더
      - ./images:/images  
    ports:				#호스트 포트와 컨테이너 동작포트 연결
      - "8080:8080"
    networks:				#커스텀 네트워크에 연결
      - app_network  
    environment:			#톰캣 로그볼때 한글이 깨져서 도커엔진에 인코딩설정
      - LC_ALL=C.UTF-8

 

network

networks:	#커스텀 네트워크생성부
  app_network:	#네트워크명

 

 

최종본

version: '3.8'
services:
  db:
    image: mysql:5.7
    container_name: db
    volumes:
      - ./mydb:/var/lib/mysql
    restart: always
    environment:
      MYSQL_DATABASE: minijpa
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_TCP_PORT: 3307
    ports:
      - "3307:3307"   
    command:
      - --character-set-server=utf8mb4 
      - --collation-server=utf8mb4_unicode_ci 
    networks:
      - app_network  

  webapp:    
    build:
      context: .
      dockerfile: Dockerfile
    image: my/spring:v1 
    container_name: app  
    volumes:
      - ./images:/images  
    ports:
      - "8080:8080"
    networks:
      - app_network  
    environment:
      - LC_ALL=C.UTF-8  

networks:
  app_network:

 

 

여기까지 잘 따라했으면 현재 아래 사진과같이 폴더와 파일이 모두 있어야한다!

만약 하나라도 없다면 처음부터 다시 천천히 따라해보길...

 

그럼 이제 docker 컨테이너로 띄우기만 하면 끝이다!!

터미널 쉘로 돌아와서 해당 명령어를 입력하자

docker-compose up -d

 

그럼 아래와 같이 이미지를 빌드와 동시에 컨테이너에 넣어 실행할것이다.

(webapp 쪽에 error나는게 이미지 이름부분 때문에 나는건데 동작하는데 아무런 문제가없어서 진행했다)

 

컨테이너가 잘 실행되었는지 확인해보자

 

 

자!! 그럼 웹페이지가 제대로 뜨나 한번 보러가보자 !!

 - 127.0.0.1:8080

 

 

DB 테이블도 잘  만들어졌는지 workbench를 통해 접속해보자