MinimiProject/아이돌 티켓팅 접속자 대기열 시스템

[대기열 시스템] Windows Docker 환경에서 MySQL 설치 및 연결

HJ0216 2025. 1. 12. 14:13

 

여전히 저는 환경 설정에 머물러 있습니다..

 

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

 

[docker] mysql conatiner 생성시 포트포워딩 문제

배경 docker 엔진을 사용하여 mysql container를 생성하기 위해 다음과 같은 명령어를 실행하였습니다. $ docker run -p 3306:3306 —name mysql_boot -e MYSQL_ROOT_PASSWORD=1 -e MYSQL_DATABASE=springboot -e MYSQL_USER=yonghwan -e MY

yonghwankim-dev.tistory.com

https://m.blog.naver.com/gingsero/222350441743

 

taskkill 액세스가 거부되었습니다.

어라? 80포트로 뭔가 떠있는데 해당 프로세스가 taskkill로 죽여보니 액세스가 거부된다. 기억은 안나지만 ...

blog.naver.com

https://velog.io/@saintho/Error-%EB%8F%84%EC%BB%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%83%9D%EC%84%B1%EC%8B%9C-%ED%8F%AC%ED%8A%B8-%EC%B6%A9%EB%8F%8C

 

[Error] 도커 컨테이너 생성시 포트 충돌

docker Error invoking remote method 'docker-start-container': Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0

velog.io

https://velog.io/@saintho/Error-%EB%8F%84%EC%BB%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%83%9D%EC%84%B1%EC%8B%9C-%ED%8F%AC%ED%8A%B8-%EC%B6%A9%EB%8F%8C

 

[Error] 도커 컨테이너 생성시 포트 충돌

docker Error invoking remote method 'docker-start-container': Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0

velog.io

https://velog.io/@jiwonblue/Spring-Boot%EC%99%80-MySQL-%EC%97%B0%EB%8F%99-%EC%98%A4%EB%A5%98

 

Spring Boot와 MySQL 연동 오류

Spring Boot와 MySQL연동 시 발생한 오류Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persi

velog.io

https://luna-archive.tistory.com/17

 

Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 해결하기

이번 글에서는 spring boot에서 RDB 세팅을 하다가 겪었던 에러 사항 및 해결 방법에 대해 남기려고 합니다. 최근 spring batch작업을 위해 RDB 연동을 하는데, 아래와 같은 에러를 마주쳤다. Caused by: java.

luna-archive.tistory.com

https://kjy1ho.tistory.com/18

 

[mysql] java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

이클립스와 mySQL을 연동하는데 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 이런 에러가 떴다. 에러 이유를 알아보니 root 계정에 접속할 비밀번호가 틀려서 나온 에러라고

kjy1ho.tistory.com