[Docker] MySQL 설치하고 접속하기(feat. Access denied for user 'root'@'localhost' 에러 해결)

2025. 8. 29. 17:35·DevOps

로컬 환경에 DB를 설치하지 말고, Docker를 이용해서 컨테이너로 관리해 보자.

 

🔵 Docker에서 MySQL 이미지 다운로드하기

8.0.34 버전을 지정해서 다운로드했다. 태그에 버전을 지정하지 않으면 최신 버전을 다운로드한다.

$ docker pull mysql:8.0.34

 

다음 명령어로 다운로드한 도커 이미지를 확인할 수 있다.

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        8.0.34    59ae56ac42c6   2 years ago   783MB

 

🔵 MySQL 이미지를 바탕으로 도커 컨테이너 생성 및 실행

$ docker run -d --name mysql -p 3306:3306 \
-e MYSQL_DATABASE=test \
-e MYSQL_ROOT_PASSWORD=root \
mysql:8.0.34

각각의 옵션을 살펴보면 다음과 같다.

  • -d : 컨테이너를 백그라운드에서 실행한다. 터미널이 종료되어도 컨테이너는 계속 실행된다.
  • --name : 컨테이너에 이름을 지정한다.
  • -p : 포트 포워딩 옵션이다. 내 PC의 3306번 포트와 컨테이너의 3306번 포트를 연결한다.
  • -e : 컨테이너 내부에 환경변수를 설정한다.
    • MYSQL_DATABASE=test : test라는 이름의 데이터베이스를 생성한다.
    • MYSQL_ROOT_PASSWORD=1111: root 사용자의 비밀번호를 "root"로 설정한다.
  • mysql:8.0.34 : 가져올 이미지의 이름과 태그다. 만약에 이미지가 없으면 도커 허브에서 자동으로 다운로드한다.

 

🔵 Docker 내부에 접속하기

위에서 준 도커 컨테이너 이름을 이용해서 도커 컨테이너 내부에 접속할 수 있다.

-it에서 -i는 interactive의 약자로, 표준 입력을 유지하여 사용자가 컨테이너와 상호작용할 수 있게 한다.

-t는 tty의 약자로, 가상 터미널을 할당하여 Shell 인터페이스를 제공한다.

$ docker exec -it mysql bash
bash-4.4#


이제 도커 내부에서  MySQL에 접속해 보자.

나는 root 계정으로 접속하려고 한다. 아래 명령어를 입력해 준 뒤, 위에서 설정했던 root 계정의 비밀번호를 입력해 주면 mysql에 접속할 수 있다.

$ mysql -u root -p
Enter password: root
mysql>

 

💥 인텔리제이에서 연결할 때 에러 발생!

인텔리제이에서 데이터베이스를 연결해 두고 보면서 개발하려고 했더니 Access denied for user 'root'@'localhost' 에러가 발생했다. 비밀번호를 잘못 쳤을 때 나오는 에러인데, 나의 경우에는 비밀번호도 올바르게 입력했고 심지어 터미널에서는 접속도 잘 되는데... 유독 인텔리제이에서 연결이 안 됐다.

 

권한도 바꾸고 비밀번호도 바꾸고... 등등 여러 가지를 해본 결과, 원인은 단순했다.

3306번 포트를 mysql과 Docker(WSL) 모두 이용하고 있었기 때문!

윈도우 터미널(posershell)에서 3306번 포트를 이용 중인 프로세스들을 검색해 보니... 3306 → 33060 포트가 있었다...

$ netstat -ano | findstr 3306

TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 12144 
TCP 127.0.0.1:3306 0.0.0.0:0 LISTENING 11692 
TCP 127.0.0.1:3306 127.0.0.1:50553 TIME_WAIT 0 
TCP 127.0.0.1:33060 0.0.0.0:0 LISTENING 11692 
TCP [::]:3306 [::]:0 LISTENING 12144

여기서 저 33060를 쓰는 11692번 프로세스를 kill 해준 뒤 인텔리제이에서 다시 데이터베이스를 연결해 보니... 성공!

taskkill /PID 11692 /F

 

하지만 매번 도커를 실행할 때마다 3306번 포트를 두개씩 잡게 되었다. 이 33060은 MySQL X Plugin 포트로, MySQL 서버가 SQL 이외에 X Protocol (Document Store, MySQL Shell, X DevAPI) 기능을 지원하기 위해 자동으로 여는 포트라고 한다.

즉, 일반 JDBC나 MySQL Workbench 연결에는 전혀 안 쓰인다. 불편하니... 이럴 땐 docker run 옵션으로 아래를 추가해주자.

-e MYSQLX_DISABLE=1

✅ 정리

docker pull mysql:8.0.34

docker run -d --name mysql -p 3306:3306 -e MYSQL_DATABASE=test -e MYSQL_ROOT_PASSWORD=root mysql:8.0.34
저작자표시 비영리 변경금지 (새창열림)
'DevOps' 카테고리의 다른 글
  • 무중단 배포 - 롤링, 블루-그린, 카나리 배포
  • 단일 장애 지점(SPOF)과 이에 대응하는 방법들
  • [AWS] ALB 이용해서 AWS로 서비스 배포하기
챙구리
챙구리
우당탕탕 개발자로 진화하기 (‘•̀ ▽ •́ )✎
  • 챙구리
    study log ꕤ*.゚
    챙구리
  • 전체
    오늘
    어제
    • ⋆。゚★⋆⁺₊⋆ ゚☾ ゚。⋆ ☁︎。₊⋆ ゚ (19)
      • Spring Boot (4)
      • Database (3)
      • DevOps (4)
      • Algorithms (5)
      • 약간의 AI (0)
      • 약간의 Front-end (1)
      • etc (2)
  • 인기 글

  • 태그

    도커
    lombok
    스프링입문
    db모델링
    인텔리제이
  • hELLO· Designed By정상우.v4.10.6
챙구리
[Docker] MySQL 설치하고 접속하기(feat. Access denied for user 'root'@'localhost' 에러 해결)
상단으로

티스토리툴바