Dockerfile 작~성~하~기~

amazing_hamster·2023년 10월 28일

Docker

목록 보기
1/2

알리에서 38000원에 파는 도커 휴지케이스

예전에 어디서 도커 휴지케이스 협찬받았다는걸 봤음 저도 주세요

각설하고~ 이번 프로젝트에서 배포는 도커로 진행하게 되었음

도커 편하다 편하다~ 하고 도커에 대해서 깔짝 거려보긴 했지만 그래서 뭐 어떻게 쓴다는거지 싶었는데 이번에 사용하면서 이렇게 쓰는거구나~ 하고 알게되었다. 아주 쪼금?


이건 프로젝트의 간략한 구조

front랑 back은 docker로 띄워주고 서버에 nginx를 둬서 uri에 따라 front는 3000번 포트로 backend는 5001번 포트로 가게끔 해줬다.

서버는 Ubuntu Focal 20.04 (LTS)

docker 설치는 아래 링크 참고해서 설치! 설치하는 것도 글로 썼으면 좋았을텐데 오늘을 dockerfile에 조금 더 집중하고 다음에 설치 관련해서 글쓰는걸로..
https://docs.docker.com/engine/install/ubuntu/#installation-methods

Dockerfile 기본 구문 간단하게 정리

찾아보면 많이 나올텐데 나는 찾아봐도 엥.. 그래서 이게 뭐지 싶었던게 많아서 나름 내가 이해한 걸 추가해서 덧붙임.

  • FROM : 베이스 이미지
    -> 베이스 이미지라는 말이 처음에 무슨말인지 잘 와닿지 않았는데 직접 사용하다보니 애플리케이션의 환경? 정도로 인식하게 되었다.
  • WORKDIR : 작업 디렉토리
    -> 이것도 처음에 작업 디렉토리라는데 어디의 뭔 작업 디렉토린가 했는데 도커 컨테이너가 생성되고나서 컨테이너 내부의 작업 디렉토리를 말한다.
  • RUN : 명령 실행
    -> 어플리케이션이 돌아가기 위해서 해주는 명령어 git pull 해오고 npm install 먼저 해주는 느낌처럼?
  • COPY : 파일 복사
    -> 컨테이너로 내부로 필요한 파일을 복사 해주는 것!
  • EXPOSE : 포트 노출
    -> 말그대로 사용해줄 포트번호
  • CMD : 컨테이너 실행 명령
    -> 만들어진 애플리케이션 돌아가게끔 해주는 것!

이 외에도 여러가지가 있지만 내가 사용해본 것 위주로 정리했고 앞으로 추가예정

backend

FROM node:lts

WORKDIR /usr/src/app

COPY package*.json ./

RUN  install

COPY . .

EXPOSE 5001

CMD [ "yarn", "start" ]

실제로 작성했던 backend Dockerfile 이건 최종본이 아니고 여기저기 찾아보면서 복붙해서 만들었던 것. 그리고 yarn start로 실행해주는 것보다는 build해서 실행시켜주는게 더 안정적이라는 말을 듣고 Dockerfile로 build 해준 후 실행시키기로 함

⬇️

변경 후

FROM node:lts as builder

WORKDIR /usr/src/app

COPY . .

RUN ["/usr/local/bin/npm","install"]
RUN ["/usr/local/bin/npm","run","build"]

FROM node:alpine

WORKDIR /app

COPY --from=builder /usr/src/app/dist ./dist
COPY --from=builder /usr/src/app/package*.json .
COPY --from=builder /usr/src/app/.env .
COPY --from=builder /usr/src/app/prisma ./prisma


RUN npm install 
RUN npx prisma generate

EXPOSE 5001
CMD ["npm", "run", "server"] 

FROM node:alpine 를 기준으로 앞 부분이 build 해주는 과정이다.
첫번째 FROM은 node:lts이고 두번째 FROM은 node:alpine인데 두번째 alpine은 첫번째에 비해서 가벼운 버전.
build 후에 실행 할때는 가벼운 곳에서 돌리는게 이미지 용량도 작아지고 더 좋다고 해서 build 후 환경은 alpine을 선택했다.

처음에 dockerfile을 작성했을 땐 RUN npx prisma generate를 빼놓고 작성했었는데 계속 컨테이너가 죽어버렸나? 컨테이너는 잘 떴는데 통신이 안됐나 그랬음.
docker logs 컨테이너ID 명령어를 입력해서 보니 prisma generate가 안돼서 생긴 문제 그래서 RUN npx prisma generate 명령어를 추가해줌

그렇게 하고나니 제대로 돌아감!

frontend

FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "npm", "start" ]

backend와 마찬가지로 Dockerfile에서 build도 같이 해주기로 했다.

⬇️

변경 후

# 첫 번째 단계: Node.js를 사용하여 React 애플리케이션 빌드
FROM node:lts as builder

WORKDIR /usr/src/app

COPY package*.json ./

RUN yarn install

COPY . .

RUN yarn build

# 두 번째 단계: Nginx로 빌드된 애플리케이션 서빙
FROM nginx:latest

COPY nginx/nginx.conf /etc/nginx

WORKDIR /app

COPY --from=builder /usr/src/app/build ./build

CMD ["nginx", "-g", "daemon off;"]

백엔드랑 마찬가지로 첫번째 단계에서 build 해주었다. nginx 설정은 container 내부에 접속해서 설정을 따로 해주기보다는 conf 파일을 미리 만들어주고 복사해주는 형식으로 진행! ~.~

Dockerfile을 한 번에 잘 돌아가게끔 만들어주면 좋겠지만 아무래도 지금 단계에서는 그냥 여러번 build 해주고 docker logs 찍어주고 docker exec로 내부도 들어가보면서 체크하는게 최선인 것 같다.

그리고 docker compose도 만드는대로 추가할 예정..

0개의 댓글