728x90
1️⃣ 서버에서 실행할 Node.js 파일 만들기
기존에는 서버 내부에 Node.js를 설치해야 했지만, Docker를 사용하면 컨테이너 내에서 바로 Node.js를 실행할 수 있습니다.
// hello.js var http = require('http'); var content = function(req, resp) { resp.writeHead(200); resp.end("Hello World!\n"); } var server = http.createServer(content); server.listen(8000);
- 설명: 간단한 HTTP 서버를 포트 8000에서 실행합니다.
2️⃣ Dockerfile 생성
Dockerfile은 컨테이너 설정을 정의하는 파일입니다. Node.js 버전, 실행 명령어 등을 지정할 수 있습니다.
# 사용할 Node.js 버전 지정 FROM node:slim # 컨테이너에서 공개할 포트 EXPOSE 8000 # 실행할 파일 복사 COPY hello.js /hello.js # 컨테이너 실행 시 명령어 CMD ["node", "/hello.js"]
- FROM: Docker Hub에서 가져올 Node.js 이미지 버전
- EXPOSE: 외부와 연결할 포트
- COPY: 호스트의 파일을 컨테이너로 복사
- CMD: 컨테이너 시작 시 실행 명령
3️⃣ Docker 이미지 빌드 및 Docker Hub에 Push
- Docker 이미지 빌드
docker build -t <DockerHub_사용자명>/<이미지명>:<버전> .
- . : 현재 디렉토리에 있는 Dockerfile 사용
- 버전을 생략하면 자동으로 latest가 붙습니다.
- Docker Hub 로그인 후 Push
docker login docker push <DockerHub_사용자명>/<이미지명>:<버전>
- 이제 어느 서버에서든 Docker Hub에서 docker pull <이미지>로 이미지를 가져와 사용할 수 있습니다.
4️⃣ Kubernetes에서 실행
4-1. Pod 정의
Pod는 쿠버네티스의 최소 배포 단위입니다.
apiVersion: v1 kind: Pod metadata: name: hello-pod labels: app: hello spec: containers: - name: hello-container image: <DockerHub_사용자명>/<이미지명>:<버전> ports: - containerPort: 8000
- name: 컨테이너 이름
- image: 실행할 Docker 이미지
- containerPort: 컨테이너 내부 포트
4-2. Service 정의
Service를 만들어 외부에서 Pod로 접근할 수 있습니다.
apiVersion: v1 kind: Service metadata: name: hello-svc spec: selector: app: hello ports: - port: 8200 # 외부에서 접근할 포트 targetPort: 8000 # Pod 내부 포트 type: NodePort # 외부 IP로 접근 가능
- selector: 어떤 Pod에 연결할지 지정
- port: 외부에서 접근할 포트
- targetPort: Pod 내부 포트
- type: NodePort: 외부에서 클러스터 노드 IP와 포트로 접근 가능
5️⃣ Kubernetes 적용
kubectl apply -f pod.yaml kubectl apply -f service.yaml
- Pod와 Service가 생성되면, 브라우저 또는 curl <노드IP>:8200로 접속하여 서버가 정상 동작하는지 확인합니다.
💡 팁
- Pod를 여러 개 만들고 싶다면 ReplicaSet 또는 Deployment를 사용하는 것이 좋습니다.
- Deployment를 사용하면 자동 업데이트, Auto Healing, 확장성 등을 활용할 수 있습니다.
- Kubernetes Cluster가 없다면 Minikube 또는 k3s를 로컬에서 먼저 실습해보는 것을 추천합니다.
728x90
'k8s' 카테고리의 다른 글
| VM vs Container (0) | 2025.10.01 |
|---|---|
| kubernetes를 사용하는 이유 (0) | 2025.10.01 |
댓글