Cloud/Docker & Kubernetes

Dockerfile로 이미지 생성

DGO 2023. 4. 21. 11:03

공식 허브의 이미지를 내려받아 사용하는 것 이외에 Dockerfile로 이미지 생성이 가능하다.

 

도커파일은 이미지를 생성하기 위한 용도로 작성하는 파일로 패키지, 소스코드, 명령어, 환경변수 등의 이미지의 세부 사항

 

등 을  포함함.

 

예제로 웹페이지에서 비디오를 재생하는 간단한 node.js 프로그램을 dockerfile을 통해 이미지로 생성.

 

 

파일 구성

 

index.js

express 모듈을 사용해 웹페이지에서 sample.mp4 파일을 재생

const express = require("express");
const fs = require("fs");

const app = express();
const port = 3000;

app.get("/video", (req, res) => {
  const path = "video/sample.mp4"; // video 폴더의 샘플 재생
  fs.stat(path, (err, stats) => {
    if (err) {
      console.error("error");
      res.sendStatus(500);
      return;
    }

    res.writeHead(200, {
      "Content-Length": stats.size,
      "Content-Type": "video/mp4",
    });
    fs.createReadStream(path).pipe(res);
  });
});

app.listen(port, () => {
  console.log(`listening on port ${port}`);
});

 

Dockerfile

FROM node:12.18.1-alpine 

WORKDIR /usr/src/app 

COPY package*.json ./

RUN npm install --only=production

COPY ./src ./src

COPY ./video ./video

CMD npm start

 

FROM : 이미지를 만들기 위한 base 이미지로 바탕이 될 이미지이다. base 이미지의 경우 일반적으로 도커 허브와 같은 공개 이미지를 사용하는 경우가 많으며 해당 앱에서는 node.js 이미지를 사용한다.

 

WORKDIR : 컨테이너 상에서 작업 디렉터리를 설정하며 /usr/src/app으로 설정하였고 이후 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 등의 명령문은 해당 디렉터리를 기준으로 실행된다.

 

COPY : 호스트 컴퓨터에 있는 파일이나 디렉토리를 이미지에 복사한다. package.json, 소스코드, 앱을 실행하는데 필요한 파일 등을 복사한다.

 

RUN : 쉘에서 커맨드를 실행하는 것처럼 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해 사용하며 보통 이미지 안에 특정 소프트웨어를 설치하기 위해 많이 사용된다. package.json파일을 가져온 상태이기 때문에 npm install 을 통해 운영 환경에 필요한 모듈(--only=production)만 설치한다.

 

CMD : 해당 이미지를 컨테이너로 띄울 때 기본적으로 실행할 커맨드로 node.js 앱을 시작하는 npm start를 설정

 

사용한 명령어 외에도 아래와 같은 명령어들이 존재한다.

 

EXPOSE : 컨테이너의 포트와 프로토콜을 지정할 수 있으며 프로토콜 미지정시 TCP가 기본값으로 사용된다.

EXPOSE <port>/<protocol>
EXPOSE <port>

 

ENTRYPOINT : 컨테이너로 띄울 때 실행되는 커맨드를 지정한 것으로 CMD 명령과 비슷해 보이나 CMD 명령문은 상황에 따라 파라미터를 추가 입력하여 컨테이너를 실행할 경우 입력된 파라미터가 우선순위를 갖게된다. 하지만 ENTRYPOINT의 경우 컨테이너가 실행시 항상 실행이 된다.

ENTRYPOINT ["<command>", "<command>"] //ENTRYPOINT ["npm", "start"]

ARG : docker build로 이미지 빌드시 --build-arg 옵션을 통해 넘길 수 있는 인자를 설정한다. Dockerfile 내에서 ${arg} 형태로 사용 가능하다.

ARG <arg name>
ARG <arg name>=<default>

ex)
ARG port 설정 시
docker build --build-arg port=8000 . 으로 port 값을 넘길 수 있으며

ARG port=8000 으로 설정하면 인자가 넘어오지 않았을 때 기본값으로 사용할 수 있다.

 

ENV : 환경 변수를 설정하기 위해 사용하며 ARG와 다르게 이미지 빌드 외에 컨테이너에서 실행되는 애플리케이션도 접근 가능하다.

ENV <env name>=<value>

 

Dockerfile이 존재하는 디렉토리에서 docker build를 실행한다.

docker bulid -t <image name> --file Dockerfile .

 

build가 완료되고 image 생성이 확인되었으므로 해당 이미지로 web_test 컨테이너를 생성하고 정상 구동 되는지 확인한다.

index.js 에서 port=3000으로 설정하였기 때문에 해당 포트와 호스트의 포트를 연결하였다.

 

localhost:3000/video에 접속하면 앱이 정상적으로 서비스 되는 것을 확인 가능하다.

 

docker exec 명령으로 컨테이너에 접속해 Dockerfile에서 설정한 대로 빌드 되었는지 디렉토리 확인이 가능하다.