로컬PC를 서버로 만드는 작업을 하고 있습니다. 이번에는 호스트PC에서 VM머신으로 통신하는 방법에 대해 알아보겠습니다.
목표
사용자가 윈도우10 로컬PC의 아이피 주소로 요청을 하면 VM Main에 설치되어 있는 프로젝트 서버가 응답하는 것을 목표로 합니다.
사용자 요청 (외부) -> 호스트PC -> VM Main 순으로 데이터가 요청됩니다.
호스트PC : Windows 10
VM Main : Ubuntu 22.04.3
프로젝트 준비
- VM 머신을 설치합니다. (VM 머신을 설치하는 방법은 다른 블로그 참조)
- Nginx, Apache 등의 프로그램을 쉽게 관리하고 구동하기 위해 Docker를 이용하겠습니다.
- Ubuntu에서 도커를 설치하는 방법은 다음과 같습니다.
# 도커 APT 저장소 추가
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 도커 설치하기
# install the docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 도커 설치 확인
# check the docker
docker -v
4. docker를 이용해 Apache를 설치합니다. 8081번 포트의 접속은 도커의 80번 포트로 연결됩니다.
docker run --name apache -d -p 8081:80 httpd
외부에서 호스트PC 접근하기
클라이언트 호스트PC로 데이터 요청 -> 서버 응답
실습을 위해 도커를 이용하겠습니다.
표준 포트
# docker 이미지 가져오기
docker pull nginx
# web이라는 이름으로로 nginx 구동하기
docker container run --name web nginx
호스트PC에서 localhost:80에 접속했을 때 다음과 같은 화면이 나오면 nginx가 잘 설치 된 것입니다.
이제 외부(스마트폰)에서 호스트 PC로 접속해보겠습니다. 호스트 PC로 접속하기 위해 호스트 PC의 공인 IP주소를 이용합니다. 공인 IP주소는 네이버에 “내 아이피 주소”를 검색하면 쉽게 찾을 수 있습니다.
이제 이 주소를 이용하여 외부에서 호스트 pc로 접속해보겠습니다. 주소에 200.100.100.1:80 형식의 IP를 입력합니다. 포트번호를 입력하지 않아도 기본적으로 80번 포트로 연결됩니다.
비표준 포트
추가적으로 다음과 같이 Jenkins를 설치하여 호스트PC에 접속해보겠습니다.
docker run -d -p 8080:8080 jenkins/jenkins
호스트의 공인 IP주소:8080를 이용하여 접속을 시도해보면 서버에 접속할 수 없습니다. 라우터는 표준 포트에 대한 트래픽은 자동으로 전달하지만 8080 포트는 표준 포트가 아니기 때문에 데이터 요청을 원하는 포트로 전달해주는 포트 포워딩이라는 작업이 필요합니다.
KT공유기 기준 http://172.30.1.254/ 에 접속하여 포트포워딩을 설정해주겠습니다. 내부 IP 주소는 cmd창에 ipconfig (window), ifconfig(리눅스, 맥) 을 통해 확인할 수 있습니다. 유선 연결은 이더넷에 있는 IPv4 주소이며, 와이파이 연결은 무선 LAN 어댑터 부분의 IPv4주소를 확인하시면 됩니다.
외부포트는 진입 지점을 지정한다고 생각하면 됩니다. 9000번 포트로 진입하면 내부의 8080포트와 매칭시켜주겠습니다.
이제 호스트의 공인 IP주소:9000을 입력하여 접속하면 jenkins 화면으로 접속됨을 확인할 수 있습니다.
호스트PC에서 VM머신 접근하기
이제 호스트PC에서 VM머신에 접근해보겠습니다. 호스트PC에서 호스트IP:8081을 입력하면 VM의 8081번 포트로 연결 되지 않습니다.
이는 공유기가 VM을 식별할 수 없기 때문입니다. 따라서 호스트PC로 온 8081요청을 VM머신의 8081로 포워딩해주어야 합니다. 이렇게 하나의 요청을 포트와 매핑시켜 다른 곳으로 넘겨주는 작업을 포트 포워딩이라고 합니다.
VM 환경설정 -> 네트워크 -> 포트 포워딩
다음과 같이 호스트 IP와 포트 번호 그리고 게스트 IP를 적어줍니다.
VM의 가상머신은 ifconfig를 입력한 후에 enp0s3의 inet항목을 입력하면 됩니다.
이제 호스트PC에서 호스트IP:8081로 접속해서 다음과 같은 화면이 나오면 끝입니다.
정리
이번에는 다음의 내용을 정리했습니다.
- 외부에서 호스트PC로 데이터 요청하기
- 호스트PC에서 VM으로 데이터 요청하기
외부 -> 호스트 PC -> VM으로의 데이터 전달이 어색하지 않나요? 다음 포스팅에서는 외부 -> VM으로의 데이터 요청을 할 수 있는 방법에 대해 알아보겠습니다.