포트포워딩이란?
포트포워딩은 네트워크에서 중요한 개념이다.
포트포워딩은 컴퓨터 네트워크에서 특정 포트로 들어오는 트래픽을 다른 포트로 전달하는 과정을 말한다.
포트포워딩을 통해 외부에서 내부 네트워크의 서비스에 접근할 수 있게 되며, 보안 설정과 네트워크 관리에 큰 도움이 된다.
우선 포트란 무엇일까?
포트는 컴퓨터 네트워크에서 특정 프로그램이나 서비스에 할당된 번호이다. 예를 들어 웹 서버는 기본적으로 80번 포트를 사용한다.
내부의 네트워크에선 여러 서비스를 각기 다른 포트로 접속하여 실행할 수 있지만 외부에서 이 서비스에 접근하기 위해선 특정 포트로 접속하는 것이 일반적인 방법이다.
따라서 외부에서 내부 네트워크의 서비스에 접근하기 위해 포트포워딩이 필요한 것이다.
요즘 내가 많이 활용하고 있는 Docker를 통해 포트포워딩에 대해 알아보겠다.
도커를 이용한 포트포워딩
우선 나는 윈도우 운영체제 기반으로 cmd창에서 작업을 실행할 것이다.
먼저 Docker Desktop에 접속을 한다. (로그인은 생략)
Docker Desktop을 키면 자동으로 docker가 실행이 된다.
이미지 다운 후 실행
우리가 잘 아는 이미지를 가져오는 명령어인 docker pull을 통해 tomcat을 pull 하겠다.
tomcat이 정상적으로 다운로드 된 것을 확인하였다. 현재 실행은 시키지 않았으므로 docker ps를 하면 아무것도 실행되어있지 않은 상태인 것을 확인할 수 있다.
이미지를 제대로 다운받았는지 확인하려면 docker images 명령어를 사용하면 된다.
쓸모없는 docker/welcome-to-docker 이미지를 지우겠다. (이건 포트포워딩과는 상관 없음)
다시 본론으로 돌아와서 이번에 tomcat을 실행하겠다.
실행된 것을 확인하였고 cmd 창을 하나 더 켜서 실행이 된 것을 확인한다. (tomcat을 실행시켜서 돌아가고 있으므로 기존 창에선 더 이상 조작 불가능)
여기서 보면 실행이 되고 있는 것을 확인했으니까 새 창을 켜서 localhost:8080 으로 들어가면 접속이 된다고 일반적으로 생각할 수 있다.
과연?
어? 연결이 되지 않는다..
여기서 포트포워딩 개념이 필요한 것이다.
그림을 통해 이해해보자.
호스트 운영체제가 있다. 윈도우에 리눅스 하위 시스템이 설치되어 있는 상황이다.
이해를 위한 모든 사진은 유튜브 메타코딩의 영상에서 따왔다.
그리고 컨테이너가 하나 있다. 톰캣이 돌고 있는 컨테이너이다.
그림 출처 : 유튜브 메타코딩
그러면 내가 지금 웹 브라우저를 저 호스트 운영체제에 연 것이다.
웹 브라우저를 열고 주소를 적고 엔터를 치면 tomcat이 아니라 호스트 운영체제에 연결이 된다.
ip 대역 대가 다른 네트워크 구성을 가지고 있어서 현재 localhost 라고 하면 호스트 운영체제를 말하는 것이다.
localhost:8080 이라 해봤자 컨테이너에 접근이 불가능하기 때문에 호스트 운영체제에 접근해서 tomcat으로 리다이렉션을 해야 한다. (리다이렉션은 클라이언트가 요청한 웹 페이지의 URL을 다른 URL로 자동으로 전환하는 프로세스이다.)
사진 순서대로 이해하면 된다. 이것이 포트포워딩이다.
이제부터 포트포워딩을 하겠다.
먼저 기존에 돌아가고 있는 tomcat을 종료하고 새롭게 다운부터 시작하자.
포트포워딩
이번엔 Apache 서버를 다운받아서 다시 실습을 해보겠다.
docker images로 확인해보면
httpd 다운로드가 된 것을 확인할 수 있다. 아파치 설치가 되었다.
포트포워딩까지 하려면 -p 명령어를 붙여야 한다.
docker run -d -p 8080:80 httpd
- -d: 컨테이너를 백그라운드에서(detached) 실행.
- -p: 호스트의 포트를 컨테이너의 포트에 매핑. -p 8080:80은 호스트의 포트 8080번을 컨테이너의 포트 80에 연결하는 것이다.
화면을 잘 보면
이렇게 화살표가 생긴 것을 확인할 수 있다. 8080으로 접속하면 내부의 80을 실행하라는 것이다.
localhost에 8080이라 해서 엔터를 치면
드디어 정상적인 접속이 가능해졌다! 포트포워딩 작업을 성공적으로 한 것이다.
좀 더 간단한 방법으로 해보자. 설치도 따로 실행도 따로 하면 너무 귀찮기에 한 번에 수행해보겠다.
Nginx 서버를 다운받고 실행하는 것을 한 번에 해보자. 8080 포트는 이미 사용 중이니까 8081로 하겠다.
docker pull을 통해 다운받지 않아도 그냥 한 번에 다운로드 받고 실행한 것이다.
- 호스트 운영 체제: Windows
- 도커 엔진을 설치하여 호스트 운영 체제 위에서 도커 컨테이너들을 관리한다.
- 도커 컨테이너: Ubuntu 기반 컨테이너들
- 도커 컨테이너 내부에서는 Ubuntu나 다른 리눅스 배포판을 사용할 수 있다. 이는 도커가 호스트 운영 체제 위에 격리된 환경을 제공하기 때문에 가능하다.
- 서비스 설치:
- 예를 들어보자. 하나의 도커 컨테이너에는 Nginx 웹 서버를 설치하고, 또 다른 도커 컨테이너에는 Apache 웹 서버를 설치할 수 있다. 각각의 컨테이너는 자신만의 네트워크 환경과 포트 설정을 가진다.
- 포트 포워딩:
- 호스트 운영 체제에서는 각 컨테이너의 서비스에 접근하기 위해 포트 포워딩을 설정할 수 있다. 예를 들어, localhost의 8081 포트를 요청하면 Nginx가 동작하는 컨테이너로 포워딩되고, 8080 포트를 요청하면 Apache가 동작하는 컨테이너로 포워딩될 수 있다.
이렇게 도커를 사용하면 하나의 호스트 운영 체제 위에서 여러 개의 격리된 운영 체제 환경을 구축할 수 있다.
테스트, 개발, 프로덕션 환경에서의 일관성 있는 배포와 관리를 가능하게 하며, 운영 체제 간 호환성 문제를 해결할 수 있는 강력한 도구가 된다!!
docker ps를 통해 확인해보면
두 서버가 모두 돌아가는 것을 확인할 수 있고
Nginx 또한 정상적으로 접속 가능한 것을 확인할 수 있다.
'가상화 > Docker' 카테고리의 다른 글
[docker] dockerfile 자세히 알아보기 (42) | 2024.07.24 |
---|---|
[docker] Volume 옵션으로 폴더 연결하기 (32) | 2024.07.19 |
[docker] exec 명령어 (33) | 2024.07.11 |
[docker] dit 옵션과 attach (27) | 2024.07.09 |
도커(Docker)란? (61) | 2024.06.11 |