사이드 프로젝트 - forYourRecipe (No1. Recipe) - Docker Build
이번 프로젝트를 진행하면서 인프라 관련해서 4가지 정도의 목표를 잡았었다.
첫번째. backend Docker에 올린 후 EC2에서 실행시키기.
두번째. docker 관련 script 만들어서 명령어 하나로 관리되도록 하기
세번째. github Actions 를 사용하여 자동 배포 시스템 만들기.
네번째. EC2가 버텨준다면.. 프론트도 EC2로 옮겨서 하나의 EC2에서 프론트, 백 관리 (여기서 Nginx 다뤄보기)
세번째, 네번째의 경우 여유가 된다면이라는 조건을 두고 첫번째, 두번째는 무조건 하기로 했다.
조건을 둔 이유는 각자의 회사 업무도 있고, 이 프로젝트의 기간의 경우 정말 길어봐야 한달을 잡았기 때문에 시간적 여유가 되면하기로 했다.
회사에서 도커 컨테이너 기반으로 빌드, 배포를 하고 있는데 항상 세팅되어있는 것을 사용하다보니 빌드 및 배포 관련해서 부장님께 너무 의존하는 형태가 되어버린게 싫었다.
설정 파일, 명령어 등 모든게 익숙하지 않아서 어렵게 느껴져서 도커를 사용해보기로 했다.
도커의 경우 먼저 docker hub를 사용하여 진행할 것이다.
dcoker hub 에서 no1recipe-server라는 레포지토리를 만들었다.
오른쪽에 보면 Pro tip으로 명령어가 나와있다.
# local-image:tagname 기존이미지:tag
# new-repo:tagname 레포지토리이름:tag
docker tag local-imgae:tagname new-repo:tagname
# 이미지를 레포지토리에 push
docker push new-repo:tagname
이미지를 레포지토리에 push 하는데 필요한 명령어이다.
현재는 레포지토리만 만들었기 때문에 이미지가 없다.
도커 이미지 조회
docker images
도커 컨테이너를 만들기 위한 이미지를 만들어보자.
우리의 프로젝트의 구조는 아래 이미지처럼 되었있다.
루트 위치에 docker 라는 디렉토리를 만들어서 그 안에서 Dockerfile을 만들어 주었다.
💡 Dockerfile 이란?
docker 에서 이미지를 생성하기 위한 용도로 작성하는 파일이다.
만들 이미지에 대한 정보를 기술해 둔 템플릿(template) 이라고 보면 된다.
추후에 front도 도커에 올릴 계획이여서 2 개의 Dockerfile로 구분해주었다.
일단 백엔드만 올릴 것이기 때문에 백엔드만 작성해본다.
FROM node:16-alpine
RUN mkdir -p /app
WORKDIR /app
COPY ../backend .
RUN npm ci
RUN npm run build
ENV NODE_EMV production
EXPOSE 3666
CMD ["npm", "run", "start:prod"]
간다한게 설명한다면 FROM을 통하여 node16 버전으르 다운로드 하고,
WORKDIR 로 /app을 사용하는데
COPY 를 통하여 루트 위치에 있는 backend 디렉토리를 복사한다. 여기서 주의할 점은 마지막에 . 을 주어 현재 위치라는 기준을 잡아준다.
RUN 은 우리가 npm run 할 때의 그 run이고 EXPOSS의 경우 이 이미지의 포트 번호를 3666 포트를 사용하겠다 라는 명시이다.
작성된 파일을 기준으로 이미지를 생성해보자.
도커 이미지 생성
docker build --file docker/back.Dockerfile -t dahoon226/no1recipe-server .
기본 명령어로는 docker build 인데 우리는 docker 디렉토리 안의 back.Dockerfile 을 사용할 것이기 때문에 --file 옵션을 통하여 파일 위치를 지정해주고 -t 옵션을 통하여 이미지를 dahoon226/no1recipe-server로 지정해 주었다.
❗ 주의 마지막에 . 찍어야한다
생성한 이미지를 docker hub의 레포지토리에 push 할 것이다.
아까 레포지토리를 생성할 때 봤던 tip을 사용하면 된다.
docker push 레포지토리명
이렇게 push를 해준다면 레포지토리에 한번에 올라가진다면 좋겠지만 역시 에러를 볼 수 있다...
❗ denied: requested access to the resource is denied
이 에러가 발생하는 이유는 2 가지가 있다.
1. docker hub에 로그인을 하지 않았을 경우
2. user name과 로그인한 docker hub ID 가 일치하지 않을 경우
먼저 도커 허브에 로그인을 해줘야한다.
docker login -u 도커허브계정
# 패스워드 입력창이 나옴
> password:
로그인이 정상정으로 되었다면 Login success 문구를 볼 수 있다.
그 다음 다시 push를 해주면 정상적으로 push가 되는 것을 볼 수 있다.
지금에야 push가 되지만 처음 했을때는 로그인을 해줬음에도 불구하고 계속 에러가 발생했었다...
그때는 dahoon226/no1recipe-server 의 이름이 아닌 recipe로만 만들어서 push를 했었는데 안됐는데 알고보니까 허브에 push를 할때는 이름을 서로 맞춰줘야한다더라...
push가 되었다면 레포지토리에 올라가져있을 것이다.
레포지토리에 올려놓은 이미지를 pull 해서 가져올 수도 있다.
docker pull 레포지토리명
근데 여기서도 쉽지 않았다..ㅎㅎ
처음 pull을 받을 때 또 에러가 발생...
❗Error response from daemon: manifest for hyperledger/fabric-peer:latest not found: manifest unknown: manifest unknwon
pull 하는 과정에서 tagname을 입력하지 않으면 latest 로 가져와지게 되는데, latest 태그를 가진 컨테이너가 존재하지 않아서 발생하는 문제였다.
나는 1.0.0으로 push를 해놓았기 때문에 pull 할 때 1.0.0이라는 태그를 명시해줘야한다.
이 과정은 EC2에 올리기 위한 연습 정도로 생각하면 될 것 같다. 이제 EC2로 접속하여 도커를 올려볼 것이다.
EC2에 도커를 설치하는 건 어렵지 않게 찾을 수 있다.
sudo apt-get update
# Docker Install
sudo apt-get install docker.io
💡 apt-get update
운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트하는 명령어
설치되어 있는 패키지를 최신으로 업데이트하는 것이 아닌 설치가능한 리스트를 업데이트하는 것!!
이전 로컬 환경에서 해줬던 작업을 EC2에서 똑같이 해주면 된다.
1. 도커 허브 로그인
2. 도커 허브에 있는 레포지토리 pull
3. 도커 build
4. 도커 image 생성
5.
docker run -d -i -t --name backend -p 80:3666/tcp 도커허브계정/레포지토리:태그이름
여기서 -d 옵션의 경우 백그라운드에서 실행시키겠다는 옵션
-d 를 빼고 실행시킬 경우 터미널을 빠져나오게 되면 종료가된다.
'개발노트 > Note' 카테고리의 다른 글
No.1Reciepe - 서버 다운.. (3) | 2023.03.23 |
---|---|
사이드 프로젝트 - forYourRecipe (No1. Recipe) - CI / CD (0) | 2023.03.11 |
사이드 프로젝트 - forYourRecipe (No1. Recipe) - vue 3 (0) | 2023.03.06 |
사이드 프로젝트 - forYourRecipe (No.1 Recipe) - 프로젝트 계획 (0) | 2023.03.05 |
사이드 프로젝트 - forYourRecipe - 시작 (0) | 2023.02.16 |