본문 바로가기

IT

리눅스에서 도커(Docker) 활용하기 3(node.js설치 및 이미지 생성, 실행)

728x90

리눅스에 node.js express를 설치하고 index.js에 express를 활용하여 8080에 서버를 코드를 작성한다. 이것을 이미지로 생성하고 실행하는 작업을 진행하려한다. 

 

방화벽 끄기

  • 기본 제공되는 보안 firewall을 off
  • sudo systemctl stop firewalld 
  • sudo systemctl disable firewalld

프로젝트 폴더생성 및 이동

  • sudo mkdir -p /docker_projects/node_1/project
  • cd /docker_projects/node_1/project

소스코드

  • vim index.js (권한 수정이 안되면 chown으로 권한을 부여하거나 앞에 sudo를 붙인다)
const express = require("express");

const port = "8080";

const app = express();

app.get("/", (req, res) => {
  res.send("Hello Node");
});

app.listen(port);
console.log(`server running on ${port}`);

nodejs 설치

  • sudo yum install nodejs -y

express 설치

  • sudo npm install express
  • package.json 파일 생성됨
    • 자바스크립트 버전의 build.gradle 파일
    • 각종 의존성에 대한 정보가 기술된다.
  • node_modules 폴더 생성됨
    • 실제 라이브러리들(express)이 저장되는 폴더

실행

  • node index.js

express 정상 실행

 

 

이미지 제작은 사실상 VB에 스냅샷이랑 비슷함 

원본 이미지 => 실행 => 컨테이너 생성 => 작업 => 스냅샷 => 새로운 이미지

이 제작에 사용되는 것이 Dockerfile 이다. 

 

Dockerfile 생성

  • vim Dockerfile
# 최신 node 이미지로 부터 시작
FROM node

# Working Directory 지정
# 도커 컨테이너의 작업폴더를 지정
WORKDIR /usr/src/app

# COPY package.json ./
# 앞의 ./는 HOST OS의 현재 폴더를 의미
# 뒤의 ./는 컨테이너의 현재 폴더(WORKDIR)를 의미
# 즉 외부에서 만들어둔 package.json 파일을 컨테이너 내부로 복사하겠다는 의미
COPY ./ ./

# node의 종속성 다운로드
# RUN 명령어는 컨테이너에서 실행
RUN npm install

# 안해도 되지만, 하는게 좋습니다.
# 이 컨테이너는 8080 포트를 사용한다는 의미 입니다.
EXPOSE 8080

# docker run 명령에서 실행항 명령이, 이 명령어 부터는 제작타임이 아닌 런타임에서 실행됨
CMD ["node", "index.js"]

1. node.js 까지 완벽하게 설치되어있는 것이 도커 허브에 이미 존재함  

FROM node

2. 원본이미지로 부터 새로운 파일을 집어넣을 작업 폴더(컨테이너안에 있는)를 지정 

WORKDIR /usr/src/app

3. 필요한 파일을 골라서 COPY

COPY ./ ./

ls

사실 다 필요는 없다. index.js와 package.json만 있으면 된다. 깃허브에 내 프로젝트 올릴 때 gitignore에 node_modules, package-lock.json등을 추가했었다. 그렇지 않으면 무게만 무거워 졌었다. 어차피 받아서 실행시키면 자동으로 생성되었었다. 그 원리와 같이 COPY 할 때도 마찬가지이지만 필자 편리함을 위해 모든 것을 COPY 하였다.

 

4. 컨테이너 안에서 RUN이 실행됨 

RUN npm install

5. 안내메시지 - 내부적으로 8080을 사용한다. 여기까지가 컴파일 타임(이미지를 만드는 과정)

EXPOSE 8080

6. 지금부터는 런타임, docker build를 하면 이전까지 실행됨, run을 하면 아래 명령어가 실행됨 

CMD ["node", "index.js"]

 

도커 이미지 생성 

  • docker build -t examhello . => examhello라는(tag) 도커 이미지를 현재 폴더에 생성

생성된 도커 이미지 확인

  • docker images
    • examhello 확인
    • node:latest 도 확인됨 => 원본으로 사용한 node 이미지
      • 이미지 제작과정에서 다운로드 됨

docker images

 

 

 

참고 **필자는 제대로 확인하기 위해 도커와 관련된 모든 것들을 다 삭제하고 다시 시작한다. 

# 컨테이너 삭제 docker rm -f $(docker ps -qa)

# 이미지 삭제 docker rmi -f $(docker images -qa)

# 안쓰는 네트워크 삭제 docker network prune -f

# 안쓰는 볼륨 삭제 docker volume prune -f

 

생성한 도커 이미지 실행

docker run \
  --name=examhello_1 \
  -p 8080:8080 \
  --rm \
  -d \
  examhello
  • 도커 실행 
  • 컨테이너 이름은 examhello_1로 
  • 외부 포트와 내부 포트를 8080
  • 종료 시 깔끔하게 삭제 
  • 백그라운드
  • 실행이 안되면 도커 자체를 restart => sudo systemctl restart docker 

도커 이미지 실행 결과

 

도커 이미지 종료

  • docker stop examhello_1
  • docker kill examhello_1