[대기열 시스템] Windows Docker 환경에서 MySQL 설치 및 연결
여전히 저는 환경 설정에 머물러 있습니다..
Redis와 달리 유난히 연결되지 않았던 MySQL, YourSQL이 될 뻔하다 다시 찾은 MySQL..
Docker에서 MySQL 설치 후, 포트가 사용 중이라 오류가 났던 부분과 SpringBoot에 연결하면서 이 비밀번호는 맞는데 자꾸 틀리다고 오류가 났던 부분까지의 과정을 남겨봅니다.
1. MySQL 이미지 다운로드
docker pull mysql:8
2. MySQL 컨테이너 생성
docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql:8
은 실패
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
기존 Window에 설치된 MySQL이 3306 포트를 사용하고 있기에 컨테이너에 3306 호스트 포트를 할당할 수 없다는 오류가 발생하였습니다.
netstat -ano | findstr 3306
# TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 6628
# 0.0.0.0:3306: IPv4에서 모든 네트워크 인터페이스에 대해 이 포트를 열어 놓고 있음
# 6628: 모든 관련 포트를 점유하고 있는 프로세스의 PID
# TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 6628
# TCP [::]:3306 [::]:0 LISTENING 6628
# IPv6에서 모든 네트워크 인터페이스에 대해 이 포트를 열어 놓고 있음
# TCP [::]:33060 [::]:0 LISTENING 6628
# 33060: MySQL에서 제공하는 X Protocol(엑스 프로토콜)을 사용하는 통신에 사용
# 기존의 SQL 기반 통신 방식과는 다른, JSON 기반 데이터 처리를 지원하기 위해 만들어짐
# JSON 데이터를 쉽게 저장하고 다룰 수 있는 NoSQL 기능을 추가한 것
호스트 운영체제(윈도우)에서 3306 포트를 사용하는지 확인하면 3306 포트가 열심히 듣고있는 걸 확인할 수 있습니다.
프로세스 제거해서 도커가 3306 포트를 사용할 수 있게 해줍니다.
askkill /pid 6628 /f
오류: 프로세스(PID 6628)를 종료할 수 없습니다.
원인: 액세스가 거부되었습니다.
은 실패
→ cmd를 관리자 권한으로 실행해서 해당 프로세스를 kill해주면 됩니다.
하지만, 저는 컨테이너에 다른 포트르 할당하여 생성해볼 예정입니다.
docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3307:3306 mysql:8
# docker run Docker 컨테이너를 실행하는 기본 명령
# -e MYSQL_ROOT_PASSWORD=password: MySQL의 루트 계정(root user) 비밀번호를 지정하는 환경 변수
# -d: Detached mode로 컨테이너를 실행, 터미널에서 실행 로그를 출력하지 않고, 백그라운드에서 컨테이너를 실행
# -p 3307:3306: 포트 포워딩을 설정
# 호스트의 3307 포트를 컨테이너 내부의 3306 포트로 연결
# 로컬 머신에서 localhost:3307로 docker 컨테이너의 MySQL 서버에 접근할 수 있음
처음 명령어와 달리진 점은 포트 포워딩 부분이 달라졌다는 것인데, 호스트의 3307 포트를 컨테이너 내부의 3306 포트로 연결했습니다.
3. SpringBoot 연결
그 다음은 Springboot에서 properties 파일에 MySQL 설정을 해야합니다.
spring:
datasource:
url: "jdbc:mysql://localhost:3306/fastsns"
username: root
password: password
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
위의 설정 파일로는 MySQL을 만날 수 없습니다.
심지어 틀린 부분이 2개나 있습니다.
오류 메시지는 단 하나 뿐😲
하지만, 원인은 자그마치 2개😲!
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
🚨 1. 비밀번호 설정 규칙
대문자, 소문자, 숫자, 특수문자를 포함한 암호 길이 8자 이상으로 설정해야 연결이 제대로 됨
기존에는 비밀번호가 password였는데, Springboot에 MySQL을 연결하고 싶다하면 password123! 정도는 설정해줘야 합니다..🍂
🚨 2. 포트번호 확인
로컬 컴퓨터가 쓰고 있던 포트를 빼앗고 싶지 않았던 전 로컬 3307포트를 사용했었습니다.즉, datasource의 포트번호는 3307이 되야 합니다.
⭐ 최종
spring:
datasource:
url: "jdbc:mysql://localhost:3307/fastsns"
username: root
password: password123!
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
+ 사실은 하나 더 있던 오류😲
Caused by: org.hibernate.HibernateException:
Unable to determine Dialect without JDBC metadata
(please set 'jakarta.persistence.jdbc.url' for common cases
or 'hibernate.dialect' when a custom Dialect implementation must be provided)
원인: Spring Boot 컨테이너가 MySQL Dialect 설정을 못 찾음
해결: dialect 설정 추가
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
📑
참고 자료
Chat GPT
https://yonghwankim-dev.tistory.com/570
https://m.blog.naver.com/gingsero/222350441743
https://velog.io/@jiwonblue/Spring-Boot%EC%99%80-MySQL-%EC%97%B0%EB%8F%99-%EC%98%A4%EB%A5%98
https://luna-archive.tistory.com/17