실습: 단일 VM에 웹 서비스 배포하기
이 실습에서는 카카오 클라우드에서 단일 VM을 생성하고, 해당 VM에 간단한 웹 애플리케이션을 배포한 후 외부에서 접속하는 방법을 학습합니다.
- 카카오 클라우드 계정 필요
- SSH 클라이언트 (Windows: PuTTY 또는 WSL, macOS/Linux: Terminal) 프로그램 필요
1. VPC 및 서브넷 생성 (권한이 없으므로 생략)
2. 보안 그룹 생성 (권한이 없으므로 생략)
3. VM 인스턴스 생성 및 퍼블릭 IP 할당
3-1. VM 인스턴스 생성
[인스턴스 생성] 버튼 클릭해서 새로운 인스턴스를 생성하자

아래 내용을 기반으로 인스턴스를 생성
- 이름: test-instance-yji ※ 임의 입력
- 개수: 1
- 이미지: Ubuntu 24.04
- 인스턴스 유형: t1i.small
- 루트 볼륨: 10GB
- 키 페어 생성하기:
- 키 페어 이름 입력: test-keypair-yji ※ 임의 입력
- 키 페어(.pem 파일)가 자동으로 다운로드됨 ※ 안전하게 보관해야 함
- VPC: sfacspace-default ※ 카카오 클라우드 설정 참고
- 서브넷: main ← Public Subnet ※ 카카오 클라우드 설정 참고
- 보안 그룹: default ※ 카카오 클라우드 설정 참고


3-2. 퍼블릭 IP 할당
인스턴스 상세 페이지로 들어가서 [인스턴스 작업 > 퍼블릭 IP 연결]을 선택해 퍼블릭 IP 할당


4. VM에 접속하여 예제 웹 애플리케이션 배포
1. SSH로 VM 접속
VM에 SSH 연결하는 가이드라인은 다음과 같다. Mac/Linux 환경에서는 이대로 따라하기만 하면 된다.

하지만 나는 Windows 환경이므로 PuTTY를 이용해 SSH 연결을 해야 한다.
🧩 PuTTY를 이용해 SSH 연결하는 방법에 대해서는 아래 링크에 정리해두었다.
Windows 환경에서 PuTTY를 이용해 ssh 접속하기
상황실습을 위해 카카오클라우드에 VM인스턴스를 생성했다. (Ubuntu 24.04)이 VM에 접속하고 싶다. 그러나 내 PC는 Windows 환경이고...Windows 환경에서 리눅스에 SSH 접속하기 위해서는 PuTTY를 이용해야
tierr.tistory.com
2. 기본 패키지 업데이트
sudo apt update
sudo apt upgrade -y
3. 리눅스 기초 실습
🧩 리눅스 명령어에 대해서는 아래 링크에 정리해두었다.
💻 자주 쓰는 리눅스 명령어 정리
alias, cat, cd, chmod, cp, curl, cut, df, done, echo, find, free, grep, head, history, htop, ip, jobs, kill, ll, ls, man, mkdir, mv, nano, netstat, nslookup, ping, ps, pwd, rm, sleep, sort, sudo, tail, tar, top, traceroute, tree, uname, unzip, vi, zip🔹
tierr.tistory.com
4. Docker 설치
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker ubuntu
5. 예제 웹 애플리케이션 배포해보기
# 간단한 Node.js 웹 애플리케이션 파일 생성
mkdir -p ~/web-app
cd ~/web-app
cat > package.json << 'EOF'
{
"name": "simple-web-app",
"version": "1.0.0",
"description": "A simple web application",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
EOF
cat > app.js << 'EOF'
const express = require('express');
const app = express();
const port = 80;
app.get('/', (req, res) => {
res.send(`
<html>
<head>
<title>카카오 클라우드 - 단일 VM 웹 서비스</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
text-align: center;
}
h1 {
color: #FF7E00;
}
.container {
background-color: #f9f9f9;
border-radius: 10px;
padding: 20px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.info {
text-align: left;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1>🎉 성공적으로 배포되었습니다!</h1>
<h2>카카오 클라우드 VM에서 실행 중인 웹 서비스</h2>
<div class="info">
<h3>서버 정보:</h3>
<ul>
<li>호스트명: ${require('os').hostname()}</li>
<li>플랫폼: ${require('os').platform()} ${require('os').release()}</li>
<li>메모리: ${Math.round(require('os').totalmem() / (1024 * 1024 * 1024))} GB</li>
<li>현재 시간: ${new Date().toLocaleString()}</li>
</ul>
</div>
</div>
</body>
</html>
`);
});
app.listen(port, () => {
console.log(`웹 애플리케이션이 포트 ${port}에서 실행 중입니다...`);
});
EOF
# Dockerfile 생성
cat > Dockerfile << 'EOF'
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 80
CMD [ "node", "app.js" ]
EOF
6. Docker 이미지 빌드 및 컨테이너 실행
sudo docker build -t simple-web-app .
sudo docker run -d -p 80:80 --name my-web-app simple-web-app
5. 웹 브라우저에서 접속 테스트
http://[퍼블릭_IP]
or
http://[퍼블릭_IP]:80
## 80포트는 자동으로 redirecting 되기에 상관없음

본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.
'학습일지 > K-Digital Traing' 카테고리의 다른 글
| [KDT] AIaaS 마스터클래스 3주차 - 쿠버네티스 실습 (0) | 2025.04.09 |
|---|---|
| [KDT] AIaaS 마스터클래스 2주차 - 3 Tier Application 배포 실습 (0) | 2025.04.04 |
| [KDT] AIaaS 마스터클래스 2주차 - Prometheus, Grafana 실습 (0) | 2025.04.02 |
| [KDT] AIaaS 마스터클래스 1주차 - 네트워크 프로토콜 (0) | 2025.03.28 |
| [KDT] AIaaS 마스터클래스 1주차 - Docker 실습 (0) | 2025.03.27 |