node.js - 가상 머신 / Docker / 포트포워딩 본문
가상 머신
기존 운영 체제(OS)안에 다른 OS(일반적으로는 리눅스)를 추가로 설치하여 운용하는 것을 가상 머신이라 한다.
가상 머신의 장단점을 나열하자면,
- 장점 : 무료(리눅스)이며 서버로 쓰기에 가장 안정적이지만,
- 단점 : 부팅을 두 번해야 할뿐더러 용량을 많이 차지하여 성능 저하가 우려된다.
Docker
위와 같은 단점을 보완하기 위해 나온 것이 Docker.
(docker 또한 기본적으로 리눅스 os를 채택함)
Docker 의 핵심적인 장점을 나열하자면
- 1. 개발 / 배포환경 통일 : 한 사람이 설치한 내용을 타인에게 파일처럼 효율적으로 공유할 수 있음
- 2. 프로그램 미리 설치 : 이미지를 저장해놓고 컨테이너로 불러와 사용하기 때문에 굳이 새로 설치할 필요 없음
- 3. 가벼운 가상컴퓨터 :커널(운영체제의 핵심기능)은 같이 쓰되 불필요한 부분은 없애, 용량을 적게 차지하며 성능 저하 없음
도커 허브
이 허브에서 필요한 자원을 가져올 수 있다.
nodejs 경우 아래와 같은 코드로 불러올 수 있다. (이때, 14는 버전)
FROM node:14
이미지 & 컨테이너
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/
'개발 > node.js' 카테고리의 다른 글
node.js - 데이터베이스 / mongoDB(&GUI) / docker-compose / mongoose 설치 (1) | 2023.01.19 |
---|---|
node.js - 비동기 프로그래밍 / callback / promise / async & await (0) | 2023.01.18 |
node.js - async-await / axios 활용 문자&메일 발송 / 환경변수 (0) | 2023.01.17 |
node.js - axios / CORS / apollo-server / graphQL-API(&docs) 생성 (0) | 2023.01.14 |
node.js - 서버 / 포트 / nodemon / API 함수 추가 /swagger (0) | 2023.01.13 |