Docker&Container

Docker&Container - Dockerfile로 도커 이미지 만들기

hminor 2024. 11. 29. 01:08
반응형

Dockerfile로 도커 이미지 만들기

  • 우선 현재 만들어진 코드 폴더에서 코드를 작성하기
  • Dockerfile로 이름을 작성 후, 내 프로그램 구동시 어떤 것을 할 것인지 작성해야 함.
  • 즉, 밀키트 레시피를 작성해야 함.
    • 어떤 os를 사용할 것인지
    • 설치할 프로그램
    • 어떤 터미널 명령어를 실행할 것인지
    • 어떤 파일을 추가할 것인지
  • 우선 강의에서는 이전 node 강의 시 작성한 코드를 가져왔던데
  • 따로 설명이 없어서 아래 순서로 작성하기(node.js 설치 되어있어야함.)
    1. console 창 열어서
      • npm init -y 입력해서 package.json과 package-lock.json 만들기
    2. 이후 npm i express 입력해서 설치하면서, node_modules 생성된 것 확인하기
    3. 이후 server.js 파일을 만들어서 아래와 같이 작성하기
    const express = require("express");
    const app = express();
    
    app.listen(8080, () => {
      console.log("서버 실행중 <http://localhost:8080>");
    });
    
    app.get("/", (req, res) => {
      res.send("안녕");
    });
    
    
  • 이후 Dockerfile에 코드 작성하기
    1. FROM 이미지
      • 이미지에는 보통 OS정도 설치된 이미지를 기입.
      • 즉, 리눅스OS나 윈도우OS 가 설치된 이미지를 기입
        • 윈도우 → windows 입력
        • 리눅스 → devian, ubuntu, alpine (서버비가 적게 들어 주로 사용함)
      • 이미지는 docker hub에서 설치
      • 현재는 리눅스OS에 nodejs 설치된 이미지를 사용할 것이기에
      • node 입력 후 설치하기
        • 강의에선 node.js 20번대 버전을 사용하기에 20-slim을 설치
        • 나도 20번대라 같은 걸 설치
          • slim: 필요없는 내용 지운 Debian linux
          • alpine: 용량 가장 작은 linux
    2. 설치할 것을 작성
      • RUN 이후 설치할 라이브러리를 설치
        • ex) RUN npm install express
        • 다만 위와 같이 작성하게 되면 엄청나게 설치할 것이 많을 경우와
        • 버전이 상이할 수 있기에 좋지 않다
      • 그래서 package.json을 다른 컴퓨터에 복사 후
        • 해당 컴퓨터에서 npm install만 터미널에 입력하면 됨.
        • 이렇게 하면 package.json에 있던 버전으로 라이브러리를 설치할 수 있어서 안전하고 효율적임.
      • 따라서 나의 컴퓨터에 있는 package.json 파일을 복사하는 방법은
        • COPY {어떤 파일을 옮길지에 대한 경로} {이미지를 컴퓨터의 어디에 옮길지에 대한 경로}
        • 따라서 COPY . . ← 이렇게 작성하게 되면
        • 현재 경로에 있는 package.json을 현재 경로에 복사한다는 뜻
        • 다만 node_modules나 Dockerfile 까지 복사할 필요가 없기에
        • .dockerignore 파일을 생성 후 복사할 필요 없는 요소를 입력.
        node_modules
        Dockerfile
        
      • 만약 폴더 경로를 이동하여 복사하고 싶다면
        • WORKDIR /app ← 이렇게 작성 후 COPY . . 을 한다면
          • app 폴더를 생성 후 copy 한다는 뜻
  • 이제 코드를 모두 본다면 아래와 같음
FROM node:20-slim
WORKDIR /app
COPY . .
RUN npm install
  • 다만 위와 같이 RUN을 작성하게 되면
    • OS에 있는 기본 shell을 이용해서 실행하라는 뜻으로
      • /bin/sh -c npm install 이 실행됨
    • 따라서 shell에서 제공되는 프로그램과 기능이 필요하지 않다면 비추
    • 또한 OS 마다 Shell버전이 다른 것으로 호환성 문제가 발생할 수도 있음 .
  • 그래서 아래와 같이 작성하는 것이 기본적으로 추천하는 방식이라고 함
FROM node:20-slim
WORKDIR /app
COPY . .
RUN ["npm", "install"]
  • 이후 실행하는 코드는 RUN이 아닌 CMD로 마지막 터미널 명령어를 작성
    • ENTRYPOINT를 작성해도 됨.
    • 차이점으로는
      • CMD: 컨테이너가 실행될 때 기본적으로 시행할 명령을 지정
      • ENTRYPOINT: 컨테이너 실행 시 반드시 실행해야 하는 명령을 지정.
    • 즉, docker run 뒤에 추가 명령을 붙여도
      • CMD는 덮어씌워져서 별도의 실행이 없지만
      • ENTRYPOINT는 전달되는 기본 인수로 동작하기에 실행 후 뒤 명령 실행.
FROM node:20-slim
WORKDIR /app
COPY . .
RUN ["npm", "install" ]
CMD ["node", "server.js" ]
  • 이후 EXPOSE를 추가해서, 어떤 포트를 열어서 사용하겠다는 코드를 작성해야 함.
  • 그래서 현재 사용할 포트를 입력하여 작성
  • 다만, 기능적으로는 따로 없기에 단순 메모용.
FROM node:20-slim
WORKDIR /app
COPY . .
RUN ["npm", "install" ]
EXPOSE 8080
CMD ["node", "server.js" ]
  • 다만 지금까지 작성한 코드는 터미널에 docker init 을 작성해도 자동으로 채워짐.
  • 이후 이미지를 생성하기 위해서 터미널에 docker build -t 이미지명:태그명 경로 ← 작성하기
    • 현재 경로는 현재 위치를 나타내는 것으로 . 을 사용
docker build -t nodeserver:v1 .
  • 이후 docker desktop에 들어가서 images에 들어가보면
    • 작성한 이미지명으로 만들어진 것을 확인할 수 있음