본문 바로가기
IT/Docker.K8S

docker 실습 part.3

by 성준하이 2022. 4. 8.
반응형

이번 포스팅 부터 docker 프로젝트를 하나 만들어볼것이다.

 

vscode에서 원하는 위치에 폴더를 하나 생성해서 그안에 구현을 해볼것이니 각자 자유로운 위치의 폴더를 생성하도록 한다.

 

그 이후에 해당 위치에서 vscode의 터미널을 열어 nodejs 명령어로 설치를 할 예정이라 다음 명령어를 작성한다.

npm init -y

이렇게 하면 프로젝트가 초기화 되고 이어서 express 프레임워크를 활용하여 백엔드를 만든다.

npm i express

하고 나면  사진처럼 이렇게 프로젝트가 생성이 된다.

이어서 해당 위치에 index.js 를 만들어서 express 백엔드 구현을 해준다.

const express = require('express')
const app = express();
app.get('/',(req, res) => {
     res.send("practice docker");
});
app.listen(8080, () => console.log('server is running'));

실행을 하게 되면 practice docker 라는 문구가 나오는 간단한 백엔드를 구현 하였다.

 

다음 해당 파일을 node 환경에서 실행을 시킨다.

터미널에 다음과 같이 작성을 하도록 한다.

node index.js

그러면 설정해둔것처럼 server is running 이라는 콘솔이 나오고 브라우져에서 localhost:8080 을 접속하면 백엔드 환경이 잘 실행 된것을 알수 있다.

 

여기까지 하면 프로젝트가 준비가 되었다.

 

그럼 이어서 컨테이너를 만들어볼것이다.

만드는 방법은 저번 포스팅에서 말한것처럼 도커파일을 먼저 생성하는 순서부터 진행을 해볼 것이다.

index.js와 dockerfile을 만들고 난 후 프로젝트의 트리는 다음과 같이 된다.

이 도커파일 안에는 어떠한 이미지를 만들지 어떤 프로젝트를 만들지 등을 명시하게 되는데

맨 처음에는 항상 FROM baseImage 로 시작을 해야한다.

도커 이미지를 만들때 처음부터 모든것을 만드는것이 아니라 base이미지를 설정하여 그 베이스 기반으로 만들게 된다.

기본적으로는 순수 리눅스기반으로 만들기도 하고 node같은 경우는 node에서 미리 만들어둔 이미지가 있어서 그 이미지를 baseImage로 설정을 할것이다.

FROM node:16-apline

from 다음에 node를 명시해주고 바로 뒤 16은 버전 정보, apline은 최소 단위의 리눅스를 뜻한다.

그리고 command 누른상태로 Node를 눌러보면 창이 뜨는데 그 창에서는 사용할수 있는 node기반의 baseImage를 확인해볼수 있다.

 

다음은 이미지의 어떤 경로에서 해당 이미지를 실행할지 경로를 명시해 줘야한다.

참고로 workdir은 리눅스에서 cd의 의미도 갖고 있기에 /app이라는 위치로 이동이라는 뜻이 된다.

WORKDIR /app

다음은 어떤 파일들을 /app으로 복사를 해줄지를 정해준다.

현재 나의 경로에서 package.json랑 package-lock.json 파일을 /app위치로 옮겨야한다.

COPY package.json package-lock.json ./

마지막의 위치로 나열된 파일들을 복사하였다. 마지막의 ./위치는 리눅스에서 자기 자신의 위치를 말하는것과 같으며 현재 이미지 내에서 나의 위치는 /app 이므로 /app위치로 복사를 하는것이다.

 

다음은 package.json파일을 기반으로 npm install 작업을 해야한다.

참고로 npm install 과 npm ci가 있는데 이 둘의 차이는 install은 해당시점에서 명시된 파일들의 최신 버전을 받아오고

npm ci는 내가 package.json 파일에 적은 버전으로 받아와서 언제 실행을 하든 현재 나의상황과 동일한 환경과 버전으로 install을 하게 된다.

지속적으로 업데이트가 필요하다면 npm install 이 좋겠지만 현재 나와의 같은 환경에서 이미지가 만들어지고 앞으로도 그러길 원한다면 npm ci로 하는게 좋고 자잘한 버전 차이 문제로 인한 에러를 피할수 있다.

RUN npm ci

 

다음 3번째와 동일하게  index.js 파일을 현재 위치로 복사를 해오고

COPY index.js .

실행을 해주면 된다.

ENTRYPOINT를 이용하여 node 를 실행할것이고 index.js 파일을 실행해라 라는 뜻이다.

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

 

이 도커 파일들을 합쳐서 보여주면 다음과 같다.

FROM node:16-alpine

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm ci

COPY index.js .

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

dockerfile을 작성할때는 dockerfiledl layer 방식으로 동작을 하기에 위에서 부터 자주 수정이 안되는 값을 먼저 적어주는게 좋다.

즉 맨 아래 실행하는것을 놔두는것이 좋으며

중간 3-4번째 라인이 수정이 되면 1,2 라인은 이미 동작을 하고 난 후에 수정사항이 없으니 그대로 빌드가 되고 수정된 layer부터 재 빌드를 하게 되어 시간을 절약할수 있기때문이다.

 

여기까지 하면 dockerfile이 생성이 되었다.

다음 포스팅에서는 해당 dockerfile을 이용하여 이미지를 만드는 과정을 설명해볼것이다.

반응형

'IT > Docker.K8S' 카테고리의 다른 글

[Docker] Redis  (45) 2023.09.07
도커 명령어 정리  (56) 2023.09.06
docker 실습 part.4  (22) 2022.04.09
docker 실습 part.2  (36) 2022.04.07
docker 실습 part.1  (49) 2022.04.06

댓글