포스트

[Azure/Spring] SpringBoot와 MySQL 컨테이너화시키기

[Azure/Spring] SpringBoot와 MySQL 컨테이너화시키기

SpringBoot 컨테이너화

JAR 파일 생성

1
mvn clean package
  • 해당 명령어를 통해 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/

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.