[Docker] Spring Boot 배포하기
개발환경별로 어플리케이션을 배포하는게 참 할때마다 힘들었다...
윈도우에서 개발하고 리눅스로 배포하고 ...
하지만 도커를 이용하면 동일한 환경에서 하는 것 처럼 배포가 가능해진다.
먼저 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가지로 나누어 작성했다.
- version - compose파일의 버전
- services - 실행될 컨테이너에 관한 설정
- 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를 통해 접속해보자