-
스프링 부트 + Mysql 도커로 띄우기프로젝트/WebRTC 화상통화 프로젝트 2022. 7. 21. 11:20
(1) Window에서 도커로 MySQL + SpringBoot 띄우기
(2) Ubuntu에서 Spring,MySQL, Redis Docker Compose로 배포하기
(3) Jenkins로 Gitlab CI/CD 구축하기(Spring + MySQL + JenKins + Redis + Nginx)
개요
Spring Boot App과 Mysql을 띄워서 관리하고 싶은 상황입니다.
도커를 활용하여 작업을 수행해보려고 합니다.
도커 설치
springboot 설정 파일 예시
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://db-mysql:3306/mydb?useSSL=false username: user password: user jpa: hibernate: ddl-auto: create properties: hibernate: format_sql: true dialect: org.hibernate.dialect.MySQL5InnoDBDialect
datasource의 url부분에서 호스트 부분 설정을 잘해야 합니다.
현재 호스트가 db-mysql으로 되어 있습니다.
이 호스트명은 앞으로 도커 환경에서 mysql이 구동되는 컨테이너의 이름입니다.
도커 이미지 빌드를 위한 Dockerfile 작성
FROM openjdk:11-jdk ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
gradle기준으로 작성된 Dockerfile입니다.
도커 네트워크 생성
도커 환경에서 여러 컨테이너를 동일한 환경에서 연동시키기 위해서 네트워크 설정이 필요합니다.
MySQL과 Springboot app이 동일한 네트워크에서 구동되도록 해주어야 합니다.
네트워크 생성
$ docker network create springboot-mysql-net
생성된 네트워크 확인
$ docker network ls
DockerHub에서 mysql 이미지 가져온 후 실행
docker run --name db-mysql -p 3306:3306 --network springboot-mysql-net -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=mydb -e MYSQL_USER=user -e MYSQL_PASSWORD=user -d mysql
--name : 컨테이너명 설정
-p : 포트매핑
--network : 네트워크 설정
-e : 환경변수 설정
-d : 백그라운드로 컨테이너 실행
위의 명령어의 환경변수 설정은 다음과 같습니다.
root의 비밀번호는 root
DB이름은 mydb
User이름은 user
User의 비밀번호는 user
이때 다음과 같은 에러가 발생할 수 있습니다.
docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
이미 3306 포트를 사용하고 있어서 불가능하다는 메시지입니다.
해당 포트를 사용하고 있는 pid를 제거하거나 다른 포트번호로 실행시키면 실행 가능합니다.
사용 중인 3306 포트 제거법
3306 포트를 쓰는 PID 찾기
netstat -ano | find "LISTENING" | find "80"
PID가 5916인 프로세스를 확인하기
tasklist /FI "PID eq 5916"
PID가 5916인 프로세스를 죽인다
taskkill /F /PID 5916
만약 위와 같은 액세스 거부가 나타나면 관리자 권한으로 cmd를 실행하면 됩니다.
도커 환경에서 springboot app 구동
우선 프로젝트의 경로로 이동합니다
프로젝트에는 Dockerfile이 존재합니다.
cd 프로젝트 경로 cd C:\Users\babab\Documents\zipzong\backend
Dockerfile을 이용한 이미지 빌드
docker build -t springboot-mysql .
맨 마지막의 .은 Dockerfile의 경로로 현재 경로를 의미합니다.
springboot-mysql이라는 이름의 이미지가 생성됩니다.
빌드된 이미지로 컨테이너 구동
docker run -p 8080:8080 --name springboot-mysql --network springboot-mysql-net -d springboot-mysql
디버깅
만약 docker ps를 했을 때 아무것도 보이지 않을 수 있습니다.
이때 -a 옵션을 사용하면 모든 컨테이너를 볼 수 있습니다.
docker ps -a
STATUS는 Exited(1)입니다.
Exited(1)은 빌드하는 과정에서 오류가 나 컨테이너가 정상적으로 작동하지 않는 것입니다.
다음은 명령어를 통해 자세한 에러를 확인해봅니다.
docker logs [container]
위의 3가지 중 하나를 지정해야 한다고 합니다.
위에서 MYSQL_ROOT_PASSWORD를 지정한 줄 알았지만 오타가 발생했었습니다.(PASSWORLD..)
오타 수정 후 docker ps로 컨테이너가 잘 동작하는 것을 확인할 수 있습니다.
Public key retrieval is not allowed 에러
mysql 8.0 이상 버전으로 접속하려고 할 때 위와 같은 에러가 발생할 수 있습니다.
에러가 발생하는 원인은 useSSL=false로 설정하고 allowPublicKeyRetrieval 설정을 하지 않은 경우입니다.
jdbc:mysql://localhost:3306/test_db?useSSL=false&allowPublicKeyRetrieval=true
접속하는 datasource URL에 쿼리 파라미터로 위와 같이 설정해주시면 됩니다.
출처
https://www.javainuse.com/devOps/docker/docker-mysql
'프로젝트 > WebRTC 화상통화 프로젝트' 카테고리의 다른 글
JPA Entity 연관관계 구현하기(양방향 연관관계 List Empty 문제 해결) (0) 2022.07.29 Controller 단위테스트 하기 (0) 2022.07.26 Spring Rest Docs 적용하기 (0) 2022.07.21 Spring Security Oauth2.0 로그인 단위테스트 (0) 2022.07.20 Spring Security와 Oauth 2.0으로 로그인 구현하기(SpringBoot + React) (13) 2022.07.19