IT/DevOps

[Docker] Docker container port forwarding(feat. Windows 10)

알 수 없는 사용자 2023. 10. 25.

호스트 OS(로컬PC)에 Docker를 올려서 이미지를 pull 받아서 아주 손쉽게 컨테이너를 띄워서 프로그램을 실행할 수 있다.

Docker image pull 🤗

아래 명령어를 통해 apache webserver를 띄울 수 있다.(사실 이 마저도 생략할 수 있다.)

docker pull httpd #apache webserver image를 pull
docker images #다운받은 이미지 목록 출력
docker run httpd #apache webserver 실행

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - Docker image pull 🤗

이 상태에서 웹서버를 호출하기 위해 localhost:80를 브라우저에 입력하면 index.html이 표시가 안된다.

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - Docker image pull 🤗

내 컴퓨터에 apache가 돌아가고 있고 포트가 80으로 되어 있다면 표시가 될거다.

하지만 현재 apache를 띄운 곳은 내 컴퓨터안의 Docker라는 별도의 영역에서 실행중이다.

그래서 외부에서 localhost:80으로 호출하면 Docker안의 WebServer가 호출되도록 추가 설정이 필요하다.

외부에서 호출하는 서비스의 포트를 이용해서 분배를 시킬건데 이를 포트 포워딩이라고도 한다.

위키백과를 링크 시켰는데 역시 백과를 보면 쉽게 이해가 안된다. 😑


포트포워딩이란? 😄

알고 있는 지식을 최대한 동원해서 쉽게 설명하면 내가 우편 배달부라고 가정해보자.

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - 포트포워딩이란? 😄
image source:https://images.unsplash.com/photo-1490670096971-8005fec55d50?auto=format&fit=crop&q=80&w=2070&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D

나는 방화벽이라는 성 안에 거주하는 사람들에게 우편을 배달해야 한다.

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - 포트포워딩이란? 😄
image source:https://images.unsplash.com/photo-1580677616212-2fa929e9c2cd?auto=format&fit=crop&q=60&w=500&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MTh8fGNhc3RsZXxlbnwwfHwwfHx8MA%3D%3D

하지만 나는 성 안의 거주민들 집주소는 알지 못한다.

이를 어쩐다..

다행히도 나는 전체 집주소는 알지 못하지만 집에 붙어 있는 창문번호는 알고 있다.

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - 포트포워딩이란? 😄
image source:https://plus.unsplash.com/premium_photo-1664359131585-20f760907632?auto=format&fit=crop&q=80&w=2072&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D

이 창문번호를 통해서 거주민들에게 우편을 전달할 수 있다.

라우터(공유기)라는 곳에 가서 창문번호를 불러주면 창문번호와 매핑된 내부 집으로 안내해준다.

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - 포트포워딩이란? 😄
image source:https://plus.unsplash.com/premium_photo-1661589670435-65cfb3224205?auto=format&fit=crop&q=80&w=1932&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D

라우터라는 감사한 분을 통해서 나는 무사히 성 안의 주민들에게 우편물을 배달 할 수 있게 되었다.

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - 포트포워딩이란? 😄
image source:https://plus.unsplash.com/premium_photo-1663134275544-7d83fcfa0e54?auto=format&fit=crop&q=80&w=2070&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D

네트워크 지식이 깊지 않기에 포트포워딩을 할 때 내부적으로 정확히 어떤 프로세스를 타는지 알지는 못하지만 큰 그림만 최대한 그려보았다.

외부에서 내부의 주소를 알지는 못해도 포트를 통해서 방화벽안에 있는 내부 서버에게 갈 수 있다.

실제로 예전에 회사에서 포트포워딩을 통해서 로컬에 띄운 tomcat을 회사밖에서 테스트 하곤 했었다.

Docker port forwarding 😊

이제 이미지를 컨테이너화 할 때 포트포워딩을 해서 띄워보겠다.

docker run -p 9080:80 httpd #외부에서 9080port로 호출하면 80port로 받도록 설정

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - Docker port forwarding 😊
포트포워딩

브라우저에서 localhost:9080으로 호출하자 예상한데로 Docker의 apache webserver의 index.html이 표시되었다.

그러나 지금은 포그라운드로 띄운거라 백그라운드로 띄워야 한다.

터미널이 종료되면 서비스도 종료된다는 의미다.

포트포워딩을 통해 백그라운드로 컨테이너화하는 전체 명령어는 아래와 같다.

docker run -d -p 9080:80 httpd # 웹서버를 포트포워딩(-p 옵션)해서 백그라운드(-d 옵션)로 실행

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - Docker port forwarding 😊

첫번 째 입력했던 명령어와 차이가 있다면 docker pull...을 통해서 이미지를 pull받는 명령어가 생략되었다.

docker run 할 때 이미지가 없으면 pull을 받아와서 실행하기에 이 명령어가 더 효율적이다.

이 때 latest 버전으로 받아오니까 특정 버전을 실행하고 싶으면 이미지명에 추가 옵션을 붙여야 한다.

정말 어마어마한 결과다. 

[Docker] Docker container port forwarding(feat. Windows 10) - undefined - Docker port forwarding 😊

apache web server를 띄우려면 설치프로그램 다운로드 해서 서비스 실행 명령어를 통해 실행, 경우에 따라 config도 변경해야 되는 경우도 있는데 이것도 대략 빨라도 10~15분 잡아먹는다.

그런데 Docker를 통해선 명령어 한줄에 단 몇 초만에 apache web server가 실행이 되었다.

돌도끼를 사용하다가 불을 발견하면 이런 느낌이라고 해야 될까?

도커를 이제 막 공부하기 시작했지만 이것도 열심히 공부해야 겠다.

공부할 게 참 많지만 즐겁다.


개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.

틀린 점 있을 경우 댓글 부탁드립니다.


reference: https://www.youtube.com/watch?v=dZ89MJZ4vJw

 

댓글