인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

라쿠라쿠님의 프로필 이미지

작성한 질문수

docker redis와 window redis 포트가 동일할 때 충돌이 나지 않는 이유

작성

·

39

·

수정됨

0

안녕하세요. redis를 공부하던 중 궁금한 점이 생겨서 질문드립니다.

 

개발상황

window10

springboot 3.4.3

티스토리를 참고해서 redis 설치

window for docker 설치

 

문제상황

docker의 compose.yml을 생성해서 docker 이미지(springboot와 redis)를 생성해서 동작을 시켰습니다. 이때 window에서 동작 중인 redis를 중지시키지 않았지만 docker의 redis는 포트 충돌 없이 정상적으로 동작합니다. window와 docker에서 redis가 여전히 동작 중인 것은 확인했습니다.

 

Dockerfile

FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

compose.yml

services:
  api-server:
    build: .
    ports:
      - 8080:8080
    depends_on:
      cache-server:
        condition: service_healthy
  cache-server:
    image: redis
    ports:
      - 6379:6379
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 5s
      retries: 10

 

docker와 window에서 redis 서버를 동작시키는 상황에서 Windows 명령 프롬프트에서 netstat 명령어를 통해서 포트번호와 IP를 확인했습니다.

C:\Users>netstat -ano | findstr :6379
  TCP    0.0.0.0:6379           0.0.0.0:0              LISTENING       15492
  TCP    0.0.0.0:6379           0.0.0.0:0              LISTENING       19004
  TCP    [::]:6379              [::]:0                 LISTENING       15492
  TCP    [::1]:6379             [::]:0                 LISTENING       3800

아래는 docker redis만 동작시켰을 때 상황입니다.

C:\Users>netstat -ano | findstr :6379
  TCP    0.0.0.0:6379           0.0.0.0:0              LISTENING       15492
  TCP    [::]:6379              [::]:0                 LISTENING       15492
  TCP    [::1]:6379             [::]:0                 LISTENING       3800

아래는 window redis만 동작시켰을 때 상황입니다.

C:\Users>netstat -ano | findstr :6379
  TCP    0.0.0.0:6379           0.0.0.0:0              LISTENING       19004

 

질문

  1. redis는 docker와 window가 다른 네트워크 인터페이스를 가지고 있어서 포트 번호가 같아도 충돌이 나지않는걸까요?

  2. 그렇다면 왜 springboot 어플리케이션은 같은 포트로 동작시켰을 때 포트 충돌이 발생하지 않아야하는거 아닐까요? springboot 어플리케이션은 포트 충돌로 인해 docker 또는 window 둘 중 하나에서만 실행시킬 수 있습니다.

 

docker, redis에 깊은 이해를 하고 있지 않아서 많이 어려운 것 같습니다. 문제 접근 방식이 잘못된건지 저에게는 어렵네요

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

라쿠라쿠님, 질문해주신 상황에 대한 답변입니다:

  1. 네트워크 인터페이스: Docker는 기본적으로 호스트 시스템과는 별도로 격리된 네트워크 환경에서 실행됩니다. 즉, Docker의 컨테이너는 자체 네트워크 인터페이스를 사용하기 때문에, 같은 포트 번호를 사용하더라도 호스트 시스템의 네트워크와는 격리되어 있어 충돌이 발생하지 않습니다. Docker는 내부적으로 IP 주소를 다르게 할당하고, 네트워크를 격리하여 내부의 서비스나 애플리케이션이 서로 다른 네트워크 상에서 동작하도록 합니다.

  2. Spring Boot 애플리케이션 포트 충돌: Spring Boot 애플리케이션이 호스트인 Windows 환경과 Docker 컨테이너에서 동시에 같은 포트로 실행될 때 포트 충돌이 발생하는 이유는, 두 애플리케이션이 같은 네트워크 인터페이스(즉, 호스트 네트워크)를 사용할 수 있기 때문입니다. 따라서, 같은 포트를 사용하려 하면 충돌이 발생할 수밖에 없습니다. Docker를 사용하여 Spring Boot 애플리케이션을 실행할 때, “host” 네트워크 모드가 아닌 “브리지” 네트워크 모드를 사용하면 서로 다른 네트워크 스페이스에서 실행되기 때문에 포트 충돌 없이 실행할 수 있습니다.

Docker의 네트워크 격리 개념을 이해하면 위 상황이 좀 더 명확하게 다가올 수 있습니다. 추가적으로 Docker의 네트워크 설정에 대해 더 깊이 학습하신다면 도움이 될 것입니다.

도움이 되셨길 바랍니다! 추가 문의 사항이 있다면 언제든지 질문해 주세요.

참고한 자료: Docker Compose와 Spring Boot 컨테이너 준비 상태 체크