IT/DevOps

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

알 수 없는 사용자 2023. 10. 25. 18:01
반응형

목차

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

    Docker image pull 🤗

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

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

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

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

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

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

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

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


    포트포워딩이란? 😄

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

    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

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

    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

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

    이를 어쩐다..

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

    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

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

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

    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

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

    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로 받도록 설정

    포트포워딩

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

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

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

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

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

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

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

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

    정말 어마어마한 결과다. 

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

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

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

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

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


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

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


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

     

    반응형