[docker] mysql conatiner 생성시 포트포워딩 문제

2022. 12. 21. 14:16문제해결

배경

docker 엔진을 사용하여 mysql container를 생성하기 위해 다음과 같은 명령어를 실행하였습니다.

$ docker run -p 3306:3306 —name mysql_boot -e MYSQL_ROOT_PASSWORD=1 -e MYSQL_DATABASE=springboot -e MYSQL_USER=yonghwan -e MYSQL_PASSWORD=pass -d mysql

위 명령어의포트 포워딩 설정은 호스트 시스템에서 3306번 TCP 포트로 유입되는 트래픽은 모두 도커 컨테이너의 3306번 TCP 포트로 전달된다는 의미입니다.

 

문제

위 명령어를 수행시 다음과 같은 결과가 나왔습니다.

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted

 

 

문제원인

저같은 경우 호스트 운영체제가 윈도우 10인데 호스트 운영체제에서 MYSQL이 설치되어 있고 서비스를 수행하고 있기 때문에 해당 MYSQL 서비스의 3306포트가 사용되어서 실행을 못한 것이었습니다.

 

문제 해결

호스트 운영체제(윈도우10)의 3306 포트를 사용하는지 확인

PS C:\Users\qkdlf> netstat -ano | findstr 3306
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       17560
  TCP    0.0.0.0:33060          0.0.0.0:0              LISTENING       17560
  TCP    [::]:3306              [::]:0                 LISTENING       17560
  TCP    [::]:33060             [::]:0                 LISTENING       17560

위 실행결과 3306 포트를 사용하고 있고 프로세스 ID는 17560임을 알수 있습니다.

 

3306 포트를 사용하는 프로세스 제거

PS C:\Users\qkdlf> taskkill /pid 17560 /f
성공: 프로세스(PID 17560)가 종료되었습니다.

 

docker 엔진을 운영하는 우분투에서 다시 컨테이너 생성 및 실행 시도

$ docker run -p 3306:3306 —name mysql_boot -e MYSQL_ROOT_PASSWORD=1 -e MYSQL_DATABASE=springboot -e MYSQL_USER=yonghwan -e MYSQL_PASSWORD=pass -d mysql

 

컨테이너 실행 확인

yonghwan@LAPTOP-LFUMP8SR:~$ docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS                   PORTS                               NAMES
ec519f1393fc   mysql                    "docker-entrypoint.s…"   31 minutes ago   Up 4 seconds             0.0.0.0:3306->3306/tcp, 33060/tcp   mysql_boot
7fb8b3e40bb1   docker/getting-started   "/docker-entrypoint.…"   19 hours ago     Exited (0) 3 hours ago                                       eager_brahmagupta