문제 상황

`도커 MySQL을 실행`하기 위해서 비밀번호를 1108로 설정하고 `호스트 포트와 컨테이너 포트를 연결해서 RUN`을 해준 상황이다.
실행 중인 컨테이너를 확인해 보니 c64 MySQL 컨테이너가 정상적으로 실행 중이다.

`실행 중인 해당 컨테이너에 접속`해서, 환경변수 `MYSQL_ROOT_PASSWORD`를 확인해 보니
RUN에서 지정해 준 1108로 세팅되어 있음을 확인했다.

그런데, dbeaver에서 해당 Docker MySQL에 연결하려고 하니
패스워드가 틀려서 Access denied가 된 것으로 보이는 상황이 발생했다.

혹시나 해서 기존 로컬 MySQL에서 사용하던 비밀번호를 입력하니 연결이 된다.
따라서 두 가지 경우의 수를 의심해보았다.
해결 과정 1
이전에 도커로 MySQL을 실행한 적이 있다.
`그때의 비밀번호가 캐싱되어서` 혹은 `이미 저장된 비밀번호가 있으니 새로운 비밀번호로 연결하지 않을 수 있다.`

도커 컨테이너를 확인해 보면 이전에 사용하던 MySQL 컨테이너가 남아있다.

중지된 모든 컨테이너를 삭제한다.

현재 실행 중인 컨테이너가 남아있다. 중지시키고 삭제한다.

도커 볼륨을 확인해 보니 많은 게 남아있다.

도커 볼륨을 전부 삭제해 준다.
docker volume prune는 사용하지 않는 익명 볼륨만 삭제한다.

삭제가 되지 않은 이름이 지정된 볼륨이 남아있다.
해당 볼륨을 참조하는 컨테이너가 있거나, docker-composer 파일 등에서 명시적으로 관리되고 있었기 때문이다.

개별적으로 이름이 지정된 볼륨도 삭제해 준다.

다시 MySQL을 실행해 보고 볼륨이 하나 생성된 것을 확인한다.
이제 다시 연결해 보자.
결과는?

실패다.
해결 과정 2
Dbeaver의 localhost:3306 으로의 연결이 `도커 MySQL 서버`가 아닌, `로컬 MySQL 서버`가 되어버릴 수 있다. (포트 충돌)
둘 다 `localhost:3306`로 실행 중이기 때문이다.


- 실행 중인 도커 컨테이너를 확인해 보니 3306:3306으로 Running
- 로컬 프로세스에서도 MySQL이 3306에서 실행 중

Docker 컨테이너 실행 시 다른 포트를 매핑(-p 3307:3306) 한 후, DBeaver에서도 포트를 3307로 변경한다.

이렇게 설정하면 Docker MySQL 컨테이너에 DBeaver로 정상적으로 연결할 수 있다.
localhost:3307로 연결하여 도커 컨테이너 내부의 3306 포트에 위치한 MySQL로 연결이 된 것.
마무리하며
해당 문제는 단순한 비밀번호 오류처럼 보였지만, 실제로는 `볼륨의 잔재, 포트 충돌까지 원인이 다양할 수 있는` 문제였다.
실제 실무나 테스트 환경에서 같은 포트를 사용하는 로컬 서비스와 Docker 서비스가 충돌하는 경우는 자주 발생한다.
이럴 땐, 명확한 포트 매핑과 컨테이너/볼륨 상태 점검을 통해 `하나씩 원인을 좁혀가는 것`이 핵심일 것이다.
어떤 서비스가 돌아가고 있는지, 포트는 어디에 연결돼 있는지, 진짜 그 컨테이너에 접근하고 있는 게 맞는지를 확인하자.
이번 경험은 Docker 기반 개발 환경을 보다 안정적으로 구성하는 데 좋은 학습이 되었고,
향후 비슷한 문제가 발생했을 때 훨씬 빠르게 대처할 수 있을 것 같다.
'Infra & Messaging' 카테고리의 다른 글
| 불필요한 에러 로그는 이제 그만 – Docker Compose 환경에서 실행 순서를 제어하는 방법 (0) | 2025.03.31 |
|---|---|
| 슬랙(Slack) 봇이 배포 알람을 보내도록 만들어보자. (0) | 2025.02.20 |
| 카프카(Kafka) 서버를 구축해보자 (0) | 2024.07.05 |
| 효율적인 Docker 빌드: 캐시를 활용한 속도 개선 (0) | 2024.06.27 |