본문 바로가기

node.js - 가상 머신 / Docker / 포트포워딩 본문

개발/node.js

node.js - 가상 머신 / Docker / 포트포워딩

자전하는명왕성 2023. 1. 17. 19:59

가상 머신

기존 운영 체제(OS)안에 다른 OS(일반적으로는 리눅스)를 추가로 설치하여 운용하는 것을 가상 머신이라 한다.

가상 머신의 장단점을 나열하자면,

  • 장점 : 무료(리눅스)이며 서버로 쓰기에 가장 안정적이지만,
  • 단점 : 부팅을 두 번해야 할뿐더러 용량을 많이 차지하여 성능 저하가 우려된다.

 

Docker

위와 같은 단점을 보완하기 위해 나온 것이 Docker.

(docker 또한 기본적으로 리눅스 os를 채택함)

Docker 의 핵심적인 장점을 나열하자면

  • 1. 개발 / 배포환경 통일 : 한 사람이 설치한 내용을 타인에게 파일처럼 효율적으로 공유할 수 있음 
  • 2. 프로그램 미리 설치 : 이미지를 저장해놓고 컨테이너로 불러와 사용하기 때문에 굳이 새로 설치할 필요 없음
  • 3. 가벼운 가상컴퓨터 :커널(운영체제의 핵심기능)은 같이 쓰되 불필요한 부분은 없애, 용량을 적게 차지하며 성능 저하 없음

도커 허브 

이 허브에서 필요한 자원을 가져올 수 있다.

 

nodejs 경우 아래와 같은 코드로 불러올 수 있다. (이때, 14는 버전)

FROM node:14

https://hub.docker.com 

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

 

이미지 & 컨테이너

Docker 를 제대로 활용하기 위해서는 이미지 & 컨테이너에 대한 개념을 이해할 필요가 있다.

  • 이미지는 우리가 저장한 '가상 머신'을 저장하는 '것'에 가깝고,
  • 컨테이너는 저장한 이미지를 불러와 운용하는 컴퓨터와 같다.

따라서, 컨테이너가 존재하기 위해선 필수 조건으로 이미지가 존재해야 함을 기억해두자.

 

Docker 명령어 (dockerfile)

# COPY : 복사하고자하는 파일을, 원하는 폴더에 복사
ex) COPY ./package.json /myfolder/ // package.json을 myfolder로

# WORKDIR : 작업을 하기 위한 커서위치 지정
ex) WORKDIR /myfolder/

# RUN : 해당 명령 실행 결과까지 이미지로 저장
ex) RUN yarn install  	// yarn install 에서 설치된 내용을 저장

# CMD : CMD 명령 이전까지만 이미지로 저장(따라서 한번밖에 저장 불가) / 단, 프로그램을 실행시킬 때 실행
ex) CMD yarn start:dev	// 이때 start:dev 는 node 서버 여는 명령어로, 
						// 해당 이미지가 콘테이너화되어 실행 시, 서버를 바로 열게 하기 위함

Docker 명령어 (터미널)

 

// 생성 관련 명령
# docker build . : 도커 생성
# sudo docker images : 도커 내 이미지 목록 열기
# sudo docker run 이미지ID : 도커 컨테이너 실행
# docker ps : 도커 프로세스 진입  // "다른 터미널" 진행
# sudo docker exec -it 컨테이너ID /bin/bash : 컨테이너 내부 명령
# cat 파일명 : docker 이미지 내 파일 열기

// 삭제 관련 명령 **(실행하고 있는 내용은 사라지지 않음)
# docker ps =>
# sudo docker stop 컨테이너ID : 컨테이너 종료
# docker ps -a : 꺼져 있는 모든 컨테이너 확인
# docker rm 컨테이너ID : 꺼져있는 컨테이너 종료
# docker ps -a -q : 꺼져있는 모든 컨테이너 아이디
# docker rm `docekr ps -a -q` : 컨테이너 모두 삭제 응용
# docker rmi `docker images -q` : 이미지 모두 삭제
# docekr system prune -a : 실행하는 컨테이너 제외 모든 것들 삭제 (y/N 한번 더 물어봄)

// 포트 포워딩
# docker run -p '도커 외부 포트 번호' : '도커 내부 포트 번호'

 

포트포워딩

localhost 와 docker 내 컨테이너가 연결되지 못해, 

사용자가 직접 docker 내외부로 포트를 열어주는 방식을 포트 포워딩이라고 한다.

이때 사용자는 외부 포트, 내부 포트 번호를 모두 지정해줄 수 있으며 연결해줄 수도 있다.

 

위에 언급하긴 했지만 해당 명령어는 아래와 같다.

# docker run -p '도커 외부 포트 번호' : '도커 내부 포트 번호'

아무리 가상 머신을 잘 구현했다고 하더라도, 포트 포워딩이 제대로 되지 않으면 말짱도루묵이니 신경써서 기억해두도록 하자.

아무튼, 위의 명령어를 입력 후, 프로세스를 확인해주면 내외부 포트가 2500:3000으로 설정된 것을 확인할 수 있다.

 

우리, 따로 설치해요

그러나 문제는 여기서 발생된다.

포트만 변경하고 이미지를 다시 build 시켰을 뿐인데 너무 많은 파일들을 다시 저장한다.

이를 수정하기 위해서는 docker에 대한 약간의 이해가 필요하다.

 

FROM node:14

COPY . /myfolder/
WORKDIR /myfolder/
RUN yarn install

CMD yarn start:dev

위와 같은 docker 이미지 구현을 위한 코드가 작성되어 있다고 할 때, 이 코드는 언제나 그렇듯 위에서 아래로 읽히게 된다.

그리고 이 과정에서 '읽힌 코드'는 '캐시메모리에 존재하는 코드'와 대조되고,

변경되지 않은 부분이 있다면 캐시메모리에 존재하는 코드를 불러와 사용, 

변경된 부분이 있다면 새로 재설치를 시작한다.

 

다만, 변경된 부분이 상대적으로 윗 코드 부분에서 발견되게 된다면 아래 코드 역시 재설치를 해야만 한다.

그 이유는 당연하게도 '변경된 코드'가 아래 코드에 어떤 영향력을 끼칠지 알 수 없기 때문이다.

 

때문에 컴퓨터보다 똑똑한 우리들은 '변경되지 않은 파일'을 먼저 대조시키는 방식으로 이 문제를 해결할 수 있다.

아래 소스코드는 위 예시로 들었던 코드를 수정한 코드이다.

이렇게 수정함에 따라, rebuild를 통한 불필요한 파일의 재설치를 최소화하여 이미지를 구현할 수 있었다.

FROM node:14

# 변경되지 않은 부분은 빼내어 따로 저장해 둠
COPY ./package.json /myfolder/		// 'package.json'을 'myfolder' 안으로 복사
COPY ./yarn.lock /myfolder/			// 'yarn.lock'을 'myfolder' 안으로 복사
WORKDIR /myfolder/					// 커서 위치는 myfolder
RUN yarn install					

# 이 부분은 포트번호 변경으로 캐시가 깨져 재 실행하는 부분
COPY . /myfolder/

 

 

Comments