

컴퓨터에는 port가 대략 6만5천개 있다.
port는 클라이언트의 요청을 어떤 소프트웨어와 연결할 지 정해주는 역할을 한다.
Docker를 이용하면 Web Server(httpd)는 OS가 아닌 Container 위에 설치(pull)된다.
Container가 설치된 운영체제(OS)를 Docker Host라고 부르며,
하나의 호스트에는 여러 개의 컨테이너가 존재할 수 있다.
컨테이너와 호스트 모두 '독립적인 실행 환경'이기 때문에, 각자 독립적인 port와 file system을 가진다.
여기서 아파치 웹 서버(httpd)는 80포트를 사용하고 있다.
이 포트 번호는 아파치 웹 서버를 개발자들이 정해놓은 포트 번호이다.
그리고, 컨테이너 내부에 웹 페이지를 파일로 만들어 저장 장치의 특정 디렉토리에 위치시켜 놓아야 한다.
이 저장 장치를 File System라 한다.
웹 서버가 설치된 컴퓨터의 주소를 'example.com'이라 해보자.
컨테이너를 실행하고,
$ docker run httpd
주소창에 example.com:80/index.html를 입력한 후 엔터를 쳐보면 접속이 될까?
정답은 아니다.
Host의 포트와 Container의 포트는 서로 연결되어 있지 않기 때문이다.
$ docker run -p 80:80 httpd
앞의 80은 Host의 포트, 뒤의 80은 Container의 포트
이렇게 연결된 포트로 신호를 전달하는 것을 port forwarding이라 한다.
연결되면 Host의 포트에서 Container의 포트로 요청을 보내고
Container의 포트에서 대기 중인 Web Server가 그 요청을 받는다.
Web Server는 Container 내부의 File System의 폴더에서 index.html 파일을 찾아 클라이언트에게 응답하게 된다.