본문 바로가기
가상환경

Docker 컨테이너 생성 시 "bind: address already in use" 에러 해결 방법

by E_van 2021. 11. 29.

Docker에서 컨테이너를 생성할 때 아래와 같은 오류를 만날 수 있습니다:

docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:xx: bind: address already in use.

이 오류는 컨테이너가 사용하려는 포트가 이미 다른 프로세스에서 사용 중일 때 발생합니다.

이번 글에서는 이 문제를 해결하는 방법을 단계별로 정리했습니다.

---

1. 문제 원인

Docker는 컨테이너와 호스트 시스템 간 통신을 위해 특정 포트를 바인딩합니다. 하지만 해당 포트가 이미 다른 애플리케이션에서 사용 중이라면 Docker 데몬이 포트를 바인딩할 수 없어서 에러가 발생합니다.

---

2. 해결 방법

 

2.1 사용 중인 포트 확인

터미널에서 포트 상태를 확인합니다.

아래 명령어를 실행하여 현재 사용 중인 포트를 확인할 수 있습니다:

netstat -anv | grep LISTEN

출력 예시:

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN

위 결과에서, 80번 포트와 8080번 포트가 사용 중임을 알 수 있습니다.

---

2.2 특정 포트의 PID 확인

lsof 명령어를 사용하여 해당 포트를 점유하고 있는 프로세스를 찾습니다. 예를 들어, 8080번 포트를 점유 중인 프로세스를 확인하려면 아래 명령어를 실행하세요:

sudo lsof -i :8080

 

출력 예시:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 12345 root 6u IPv4 123456 0t0 TCP *:8080 (LISTEN)

 

위 결과에서 PID가 12345인 프로세스가 8080번 포트를 사용 중임을 알 수 있습니다.

---

2.3 프로세스 종료

해당 프로세스를 강제로 종료하려면 kill 명령어를 사용합니다.

아래와 같이 프로세스 ID(PID)를 입력하여 실행하세요:

sudo kill -9 12345

이 명령어로 8080번 포트를 점유 중이던 프로세스가 종료됩니다.

---

2.4 컨테이너 재생성

이제 다시 Docker 컨테이너를 생성합니다.

예를 들어, 8080번 포트를 사용하는 컨테이너를 생성하려면 아래 명령어를 실행합니다:

docker run -d -p 8080:8080 your_image_name

 

포트 충돌 문제가 해결되었기 때문에 컨테이너가 정상적으로 생성될 것입니다.

---

3. 주의 사항

  • 포트 변경 고려

동일한 포트를 사용하는 다른 프로세스를 종료하지 않고, Docker 컨테이너가 사용할 포트를 변경하는 것도 방법입니다.

예를 들어, 8080번 포트가 사용 중이라면 다른 포트(예: 8081)를 사용하도록 아래와 같이 설정합니다:

docker run -d -p 8081:8080 your_image_name

 

  • 중복 실행 방지

동일한 컨테이너를 여러 번 실행하면서 포트가 중복으로 할당되는 경우도 있습니다. 이런 경우, 중복 실행된 컨테이너를 종료하거나 제거하세요:

docker ps -a # 실행 중인 컨테이너 확인
docker stop [CONTAINER_ID] # 컨테이너 중지
docker rm [CONTAINER_ID] # 컨테이너 제거
  • Docker Compose 사용

여러 컨테이너를 관리하는 경우 Docker Compose를 활용하여 포트 설정을 명확히 관리할 수 있습니다.

---

4. 결론

Docker 컨테이너 생성 시 발생하는 "bind: address already in use" 에러는 포트 충돌로 인해 발생합니다.

이 문제는 사용 중인 포트를 확인하고 프로세스를 종료하거나, 컨테이너 포트를 변경하는 방식으로 쉽게 해결할 수 있습니다.