SpringBoot 컨테이너화
JAR 파일 생성
Issue - Java 버전이 맞지 않을때
JDK17의 경로를 확인
1
| /usr/libexec/java_home -v 17
|
반환된 JDK17의 경로를 바탕으로 JAVA_HOME을 설정
1
2
| export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH=$JAVA_HOME/bin:$PATH
|
→ 이렇게하고 다시 maven 빌드를 시도하면 빌드가 성공적으로 진행된다.
Dockerfile 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 자바 버전
FROM openjdk:17-jdk
# 컨테이너에서 작업할 기본 디렉토리
WORKDIR /app
# 현재 만들어진 .jar를 기본 디렉토리 /app 에서 app.jar로 사용함
COPY target/EnjoyTrip_SpringBoot-0.0.1-SNAPSHOT.jar app.jar
# 외부 포트 설정
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
|
도커 이미지 빌드
1
| docker build -t springboot-app .
|
도커 파일 실행
1
| docker run -d -p 80:8080 --name my-springboot-app springboot-app
|
- 해당 매핑은 클라이언트의 80(공개 포트)를 도커 이미지의 8080포트로 매핑한다는 의미
- 즉
localhost
로 접속시 자동으로 80으로 매핑되고 이건 도커 컨테이너의 8080포트로 이동한다.
- docker-desktop에서 실행하여 확인한다.
MySQL 컨테이너화
MySQL을 빌드하고 이미지화 하기
mysql:5.7
는 Mac OS에서 오류가 발생한다.
1
2
3
4
5
6
7
8
9
| docker run -d \
--name mysql-db \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=1001 \
-e MYSQL_DATABASE=ssafytrip \
-e MYSQL_USER=ssafy \
-e MYSQL_PASSWORD=ssafy \
-p 3305:3306 \
mysql:8.0
|
- 로컬의 MySQL과 포트가 겹치지 않기 위해
3305
로 설정
컨테이너 환경의 MySQL에 접속하기
1
2
3
| docker exec -it mysql-db my-mysql -u root -p -A
docker exec -it my-mysql mysql -u user -p
|
대용량 SQL 실행
1
2
3
4
5
6
7
|
docker cp /Users/gimgyuhyeong/Desktop/바탕화면/공부/여행지니/journeyjinni-backend/resources/DDL/DBDump.sql mysql-db:/large_file.sql
# 도커의 SQL에 접속한다.
# 원하는 데이터베이스를 선택한다.
source /large_file.sql
|
외부 접속 하기
유저 만들기
1
| create user 'user'@'%' identified by '1001';
|
원격 접속 허용하기
1
| grant all privileges on *.* to 'user'@'%';
|
Issue - 컨테이너 (SpringBoot → MySQL) 접속 안됨
- 컨테이너 환경에서의 springboot에서
localhost
이용시 docker내의 localhost
로 이동 됨 - 즉 컨테이너 → 로컬 → 컨테이너로 이동하지 않음
- docker compose로 db를 지정하기로 함
Docker Compose 설정
homebrew로 docker-compose
설치
1
| brew install docker-compose
|
프로젝트 상단에 docker-compose.yml
작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: my-mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: ssafytrip
MYSQL_USER: ssafy
MYSQL_PASSWORD: ssafy
ports:
- "3305:3306"
networks:
- my-network
volumes:
- mysql-data:/var/lib/mysql
app:
build:
context: .
dockerfile: Dockerfile
container_name: my-spring-boot-app
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://my-mysql:3306/ssafytrip
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 1001
ports:
- "80:8080"
depends_on:
- mysql
networks:
- my-network
networks:
my-network:
volumes:
mysql-data:
|
설정이 끝났으면 빌드
1
| docker-compose -p app up --build
|
그러나 여전히 비밀번호가 맞지 않는다고 인증이 되지 않았다. local에서 docker내의 mysql에 접근해본 결과 전혀 다른 ID : root
PW : root
로 아이디와 비밀번호가 설정되어 있어서 결국 스프링쪽에서 계정 정보를 설정한 결과 둘의 통신이 완료되었다. 추후 공부 필요
1
2
| curl http://my-spring-boot-app:8080/
|