우선, nodejs 어플리케이션을 배포하기 위해선, docker, nodejs가 설치되어있어야 한다.
$ yum install -y docker
원래는 linux binarycode로 최신버전인 v18.18.0 버전으로 다운을 받아서 진행을 해보았지만,
이런 에러가 발생해서 알아보았다.
이 블로그를 통해서 알아낸 점음, v18.18.0버전보다 버전을 낮춰야 한다는 것을 알았고, 저는 v16.20.2 버전으로 다운을 받았더니 오류가 해결되었습니다.
/opt/nodejs에 설치파일들 위치시키고, dev 디렉토리를 만들어 동작 어플리케이션 파일들을 위치시켰습니다.
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
그리고 express를 사용할 것이기 때문에
$ npm install express
동작시켜보면, 3000번 포트로 nodejs 웹서버가 오픈되었습니다.
- docker ps -a # 컨테이너 모두 출력
- docker images # 이미지 모두 출력
- docker run -d -it --name 000 --gpus all \
--mount type=bind,source=(서버경로),target=(컨테이너 내부경로) (이미지 이름)- dockedocker image prune # 이름 없는 모든 이미지를 삭제한다
- docker network prune # 사용되지 않는 도커 네트워크를 모두 삭제한다.
- docker volume prune # 도커 컨테이너에서 사용하지 않는 모든 도커 볼륨을 삭제한다.
- docker system prune -a # 중지된 모든 컨테이너, 사용되지 않은 모든 네트워크, 하나 이상의 컨테이너에서 사용되지 않는 모든 이미지를 삭제
FROM node:16.20.2
WORKDIR /app
COPY app.js .
COPY package.json .
RUN npm install --save
EXPOSE 3000
CMD [ "node", "app.js" ]
node_modules
npm-debug.log
$ docker build . -t [사용자이름]/web-app
-t를 사용해서 태그를 지정하면 찾기 더 쉽다고 합니다!
docker images
$ docker run -p 49999:3000 -d root/web-app
-p 플래그는 공개 포트를 컨테이너 내의 비공개 포트로 리다이렉트합니다.
49999->3000은 이후 생성될 pod의 ip접근 방식을 나타냅니다.
pod ip:49999로 접속하면 pod의 3000번 포트로 접속하라는 뜻입니다.
$ docker ps -a | grep root
$ curl localhost:49999
하지만, 여기서 문제가 발생했다. deployment와 service를 생성해서 pods를 생성해보았지만, ErrImageNeverPull이라는 에러가 발생했다.
열심히 구글링해본 결과, 동작하는 이미지 레포지토리는 controlplane 노드에만 동작을 하고 있던 것이었다.. 만약, 워커노드 2번에만 빌드를 진행했다면, 워커노드 2번에만 pod가 할당될 것이다.
그렇다면 방법은?
- worker노드에 각각 이미지빌드를 해준다.
- dockerhub에 이미지를 등록한 후 내려받게 한다.
저는 간단하게 2번으로 진행해보겠습니다.
도커허브에 등록하려면, 사용자 이름이 맞아야 올라간다고 해서 tag를 바꾸고 올렸습니다.
$ docker image tag 981fd cometlee/web-app
음.. 따로 생성한다기 보다는 복사하는 느낌이더라구요
이 블로그를 참고하였고, 도커허브에 잘 등록시켰습니다.
# node-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web-app
spec:
selector:
matchLabels:
app: web-app
replicas: 3
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: cometlee/web-app # <--- 이름도 바꿔서 다시 해봐요!
imagePullPolicy: Always
ports:
- containerPort: 3000
# node-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-app
spec:
selector:
app: web-app
type: NodePort
ports:
- protocol: "TCP"
port: 3000
targetPort: 3000
nodePort: 30008
네, 이제 다시 배포 해보겠습니다
그리고 NodePort 형태의 서비스로 pod에 접근해보겠습니다.
$ curl [node01 ip]:30008
service내용을 접목해서 nodejs를 배포해보고 싶은 마음에 시도를 해보았는데, 자신의 어플리케이션을 이미지화하는 과정에 대해 배울 수 있었고, 많은 것을 배운 것 같다.
특히imagePullPolicy
에 대해서도 알게 되었다. MSA(Micro System Architecture)에 한 걸음 다가간 것 같아서 기분이 좋다.
블로그 - 끄적끄적
블로그 - 나름개발자의 it블로그
블로그 - 꼬예의블로그
쿠버네티스 공식홈페이지 - image