로컬 환경에 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