내일배움캠프 TIL 17일차 - 숙련 주차 프로젝트 트러블 슈팅 - Docker

TIL (Today I Learned)

목록 보기
126/127
post-thumbnail

[트러블슈팅] Docker Compose 앱 서버 띄울 때 포트 충돌 (port is already allocated)

상황

멀티 서버 구성(app1: 8080, app2: 8081, mysql: 3306, redis: 6379)을 위해
docker-compose up -d --build를 실행했는데, 다음 에러가 발생했다.

Error response from daemon: failed to set up container networking:
driver failed programming external connectivity on endpoint redis
Bind for 0.0.0.0:6379 failed: port is already allocated

원인

이전에 개별적으로 docker run으로 띄워뒀던 my-redis, mysql(또는 test) 컨테이너가
이미 각각 6379, 3306 포트를 점유하고 있었다.
Docker Compose가 새로운 redis, mysql 컨테이너를 만들려고 하니 같은 호스트 포트를 쓰려다 충돌한 것.

해결

docker stop my-redis
docker stop test
docker rm my-redis
docker rm test

기존 개별 컨테이너를 정리한 뒤 다시 실행.

두 번째 문제: docker-compose down 후에도 남는 문제

포트를 비웠는데도 이번엔 app1이 mysql이라는 호스트명을 못 찾는 에러가 발생했다.

Caused by: java.net.UnknownHostException: mysql: Name does not resolve

docker ps로 확인해보니 mysql, redis 컨테이너는 떠 있는데 app1, app2는 어느새 죽어 있었다.
원인은 이전 시도에서 꼬였던 네트워크 설정이 그대로 남아있었기 때문으로 추정.

docker-compose down       # 컨테이너 + 네트워크까지 완전히 제거
docker-compose up -d --build

네트워크를 포함해 완전히 초기화한 뒤 다시 올리니,
app1이 mysql이라는 서비스 이름으로 정상 접속에 성공했다.

배운 점

  • 개별 docker run 컨테이너와 docker-compose가 관리하는 컨테이너는 서로 다른 존재라,
    같은 포트를 쓰면 그대로 충돌한다.
  • 문제가 안 풀릴 때는 docker-compose down으로 네트워크까지 깨끗하게 지우고 다시 올리는 것이 생각보다 효과적이었다 (단순 재시작보다 네트워크 초기화가 핵심이었음).
profile
내배캠 Unity_9기 / 게임 서버 단기 심화_9기

0개의 댓글