본문 바로가기
DEV/개발환경

Docker 컨테이너 실행시 포트 충돌 해결 _ (feat. MySQL)

by EverReal 2024. 12. 14.

Docker  컨테이너 실행시 포트 충돌 해결 _ (feat. MySQL)

 

도커에서 MySQL 컨테이너를 실행하기 위해

이미지를 받아와서 docker run을 실행하였습니다.

docker run --name mysql-local -p 3306:3306/tcp -e MYSQL_ROOT_PASSWORD=test -d mysql:8

 

이미지를 잘 받아오고 컨테이너 실행까지 잘 하는 듯 하였으나... 뚜둥.. error가 떴습니다.

 

에러 내용을 확인해보면, 포트 사용이 불가능하다는 내용과 함께,

각 socket address(protocol/network address/port)의 사용은 오직 하나만 허용된다는 설명이 나옵니다.

 

이 말은, 3306:3306포트로 컨테이너 생성을 요청하였는데

이미 3306포트를 다른 무언가(?)가 점유하고 있다는 뜻인 것 같습니다.

 

일단 3306 포트를 누가 쓰고있긴아래와 같이 삭제하구요.

docker ps -a     # 도커 컨테이너 목록 로드(미실행 컨테이너까지)

docker rm <image ID>      # 해당 컨테이너 삭제

docker ps -a     # 컨테이너가 잘 삭제되었는지 확인

 

 

이제 아래 코드를 실행하여 사용중인 프로세스를 확인합니다.

netstat -ano | findstr 3306

 

분명히 컨테이너를 삭제하였지만, 3306 포트가 사용중으로 보입니다.

 

맨 우측에 6116이라고 PID No가 보이시죠? 이 PID를 통해 프로세스를 확인해보겠습니다.

이제 그럼 누가(어떤 프로세스가) 사용중인지 확인해보겠습니다.

tasklist | findstr <PID NO>

 

tasklist를 확인하면 프로세스 이름이 보입니다.

이미 로컬에서 mysql을 설치해서 사용하고 있고,

설치된 mysql이 해당 포트를 점유하고 있는 상태에 3306포트를 할당하려하여 에러가 발생한 것 입니다.

 

예상할 수 있는 해결방법은 2가지 입니다.

 1) 3306 포트를 포기 못한다면?! 기존 프로세스를 삭제하고 3306 포트를 할당한다.

    아래 taskkill 커맨드를 활용해 테스크 삭제

taskkill /pid <PID NO> /f

 

 2) 3306 포트를 포기하고 새로운 포트를 할당

docker run --name mysql-local -p 3307:3306/tcp -e MYSQL_ROOT_PASSWORD=test -d mysql:8

 

 

추가로, 포트를 변경했을 경우, MySQL에 접속하려면 아래와 같이 접속해야 합니다.

(*꼭 별도의 포트번호를 입력해주어야 하고, 그렇지 않을 경우 기본 3306 포트로 접속하게 됩니다.)

mysql -u root -h 127.0.0.1 -P 3307 -p

반응형

댓글