
문제 상황

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

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

그러나 dbeaver에서 해당 MySQL컨테이너에 연결하려고 하니
패스워드가 틀려서 Access denied가 된 것으로 보이는 상황이 발생했다.

혹시나 해서 기존 로컬 MySQL에서 사용하던 비밀번호를 입력하니 연결이 된다.
따라서 두 가지 경우의 수를 의심해보았다.
원인 1
이전에 도커에서 MySQL을 실행한 적이 있다.
그때의 비밀번호가 캐싱되어서
혹은 이미 저장된 비밀번호가 있으니 새로운 비밀번호로 연결하지 않을 수 있겠다.
원인 2
도커로 실행한 MySQL 서버로 연결이 안 되고, 기존 로컬의 MySQL 서버로 연결이 되는
포트 충돌이 있을 수 있다.
둘 다 3306 포트이기 때문이다.
해결 방법 1
가정 1(이전에 다른 비밀번호가 저장됨)에 대한 해결책을 세워 보자.

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

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

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

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

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

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

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

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

실패다. 두 번째 문제 원인에 대한 해결법으로 넘어가 보자.
해결 방법 2
가정 2에 대한 해결책을 세워 보자.

내 로컬에서는 MySQL서버가 이미 실행 중이다.
해당 커맨드는 OS마다 상이하다.
필자는 MAC M2 환경에서 진행했다.

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

이렇게 설정하면 Docker MySQL 컨테이너에 DBeaver로 정상적으로 연결할 수 있다.
🧩 마무리하며
이번 문제는 단순한 비밀번호 오류처럼 보였지만, 실제로는 볼륨의 잔재, 포트 충돌까지 원인이 다양할 수 있는
문제였다.
실제 실무나 테스트 환경에서 같은 포트를 사용하는 로컬 서비스와 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 |