Docker를 처음 배우면 가장 많이 보는 명령어 중 하나가 이것이다.
docker run -p 8080:8080 hello-world
근데 처음 보면 솔직히 헷갈린다.
왜 8080을 두 번 쓰지?
오늘은 이 개념을 진짜 직관적으로 이해해보자.
Docker 컨테이너는 단순한 프로그램이 아니라:
격리된 작은 리눅스 환경
이라고 생각하면 이해가 쉽다.
즉:
내 PC
≠
Docker 컨테이너 내부
서로 네트워크 공간도 다르다.
예를 들어 Spring Boot 앱이 있다고 해보자.
server:
port: 8080
그러면 앱은:
컨테이너 내부의 8080 포트
에서 실행 중이다.
하지만 여기서 문제 발생.
컨테이너 안의 8080은
내 컴퓨터 브라우저가 직접 접근 못함
즉:
localhost:8080
을 브라우저에 입력해도 안 보인다.
왜냐면:
내 PC의 8080
컨테이너의 8080
은 서로 다르기 때문
이걸 연결해주는 옵션이 바로:
-p
이다.
예시:
docker run -p 8080:8080 hello-world
의 의미:
내 컴퓨터 8080
→
컨테이너 내부 8080
이다.
그림으로 보면:
브라우저(localhost:8080)
↓
내 컴퓨터의 8080 포트
↓
Docker가 전달
↓
컨테이너 내부 8080 포트
↓
Spring Boot 앱
형식은 항상 이렇다.
-p [호스트포트]:[컨테이너포트]
즉:
-p 8080:8080
은:
호스트(내 PC) 8080
→
컨테이너 8080
이라는 뜻.
예를 들어:
docker run -p 9090:8080 hello-world
도 가능하다.
이 의미는:
내 컴퓨터 9090
→
컨테이너 내부 8080
즉 Spring Boot는 여전히:
컨테이너 안에서 8080으로 실행
중이다.
하지만 브라우저에서는:
localhost:9090
으로 접속해야 한다.
이유는 엄청 중요하다.
내 PC에서 이미 8080 사용 중이라면:
-p 9090:8080
처럼 바꿔서 실행 가능.
예시:
docker run -p 8081:8080 app1
docker run -p 8082:8080 app2
docker run -p 8083:8080 app3
모든 앱은 내부적으로 8080 사용하지만:
외부에서는 다른 포트로 접근
가능하다.
Dockerfile에서 자주 보이는 이것:
EXPOSE 8080
은:
이 컨테이너는 8080 포트를 사용합니다~
라고 알려주는 메타데이터 느낌이다.
실제 연결은 아니다.
진짜 외부 연결은:
-p
가 한다.
즉:
EXPOSE = 설명
-p = 실제 연결
-p 8080:8080
=
내 컴퓨터 8080 요청을
컨테이너 내부 8080으로 전달
-p [호스트포트]:[컨테이너포트]
docker run -p 9090:8080 my-app
의 의미:
localhost:9090
↓
컨테이너 8080
↓
Spring Boot 실행
Docker에서 포트 개념은 진짜 중요하다.
왜냐면 이후에 배우게 될:
전부 결국:
트래픽을 어디로 전달할 것인가
를 다루는 개념이기 때문이다.
즉 8080:8080 하나 안에:
컨테이너 네트워크의 핵심 개념
이 들어있다.