반응형
Dockerfile로 도커 이미지 만들기
- 우선 현재 만들어진 코드 폴더에서 코드를 작성하기
- Dockerfile로 이름을 작성 후, 내 프로그램 구동시 어떤 것을 할 것인지 작성해야 함.
- 즉, 밀키트 레시피를 작성해야 함.
- 어떤 os를 사용할 것인지
- 설치할 프로그램
- 어떤 터미널 명령어를 실행할 것인지
- 어떤 파일을 추가할 것인지
- 우선 강의에서는 이전 node 강의 시 작성한 코드를 가져왔던데
- 따로 설명이 없어서 아래 순서로 작성하기(node.js 설치 되어있어야함.)
- console 창 열어서
- npm init -y 입력해서 package.json과 package-lock.json 만들기
- 이후 npm i express 입력해서 설치하면서, node_modules 생성된 것 확인하기
- 이후 server.js 파일을 만들어서 아래와 같이 작성하기
const express = require("express"); const app = express(); app.listen(8080, () => { console.log("서버 실행중 <http://localhost:8080>"); }); app.get("/", (req, res) => { res.send("안녕"); });
- console 창 열어서
- 이후 Dockerfile에 코드 작성하기
- FROM 이미지
- 이미지에는 보통 OS정도 설치된 이미지를 기입.
- 즉, 리눅스OS나 윈도우OS 가 설치된 이미지를 기입
- 윈도우 → windows 입력
- 리눅스 → devian, ubuntu, alpine (서버비가 적게 들어 주로 사용함)
- 이미지는 docker hub에서 설치
- 현재는 리눅스OS에 nodejs 설치된 이미지를 사용할 것이기에
- node 입력 후 설치하기
- 강의에선 node.js 20번대 버전을 사용하기에 20-slim을 설치
- 나도 20번대라 같은 걸 설치
- slim: 필요없는 내용 지운 Debian linux
- alpine: 용량 가장 작은 linux
- 설치할 것을 작성
- 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 한다는 뜻
- WORKDIR /app ← 이렇게 작성 후 COPY . . 을 한다면
- RUN 이후 설치할 라이브러리를 설치
- FROM 이미지
- 이제 코드를 모두 본다면 아래와 같음
FROM node:20-slim
WORKDIR /app
COPY . .
RUN npm install
- 다만 위와 같이 RUN을 작성하게 되면
- OS에 있는 기본 shell을 이용해서 실행하라는 뜻으로
- /bin/sh -c npm install 이 실행됨
- 따라서 shell에서 제공되는 프로그램과 기능이 필요하지 않다면 비추
- 또한 OS 마다 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에 들어가보면
- 작성한 이미지명으로 만들어진 것을 확인할 수 있음
'Docker&Container' 카테고리의 다른 글
Docker&Container - Network 1. nginx 만들기 (0) | 2024.12.14 |
---|---|
Docker&Container - Docker hub, push, pull (0) | 2024.11.30 |
Docker&Container - 성능을 위한 Dockerfile 작성법 (1) | 2024.11.29 |
Docker&Container - 컨테이너 다루기 (0) | 2024.11.29 |
Docker&Container - 시작하기 & 설치 & 이미지와 컨테이너 개념 (0) | 2024.11.28 |