gitlab 프로젝트 CI/CD환경 구축하기 7편 -jenkins 이용해서 node.js backend 서버 docker image로 빌드하기-

node.js - express backend같은 경우는 spring boot나 react와는 다르게 특별히 빌드해주는 방법이 없다

 

일반적으로 backend내의 모든 파일을 docker image화 시켜서 빌드한다고 한다

 

 

1. docker pipeline 설치

 

docker 이미지 빌드를 위해 docker pipeline이라는 플러그인 설치

 

 

 

2. docker hub 가입

 

docker hub 페이지로 들어가서 가입하고 

 

Docker Hub

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

 

 

레포지토리를 하나 적당히 생성

 

 

 

3. credential 등록

 

jenkins 관리 > manage credentials 이동

 

 

아래쪽 stores scoped to jenkins에 global을 눌러 global credentials로 들어가기

 

우측 상단에 +add credentials로 들어가 credentials 추가

 

 

kind에서 username with password로 선택

 

username은 docker hub의 id, password는 docker hub의 password, id, description은 아무거나 입력

 

 

 

4. dockerfile 작성

 

backend 내에 Dockerfile이라는 확장자 없는 파일을 생성

 

그리고 파일 내에 자신의 상황에 맞는 Dockerfile 코드를 작성

 

나 같은 경우는 node.js와 python 프로그램을 모두 수행해야한다.

 

기본적인 docker 문법은 공부할 수 있는 기회가 있으면 공부해보기로 하고

 

여러 주워들은걸로만 간단하게 복기해보면

 

0번째 FROM으로는 node.js 가 구성된 base image를 활용

 

모든 내용을 복사하고 npm install로 설치

 

그 위에 1번째 FROM으로 python이 구성된 base image를 쌓고, 

 

copy --from=0으로 0번째 node 단계에서 build한 내용을 모두 복사한다

 

그리고 나머지 필요한 내용을 수행

 

서버 실행에는 npm start니까 CMD에 ["npm", "start"]라고 작성

 

FROM node:16.18

WORKDIR /SubPjt2/backend/

COPY . .

RUN npm install

FROM python:3.8

WORKDIR /SubPjt2/backend/

COPY --from=0 . .

RUN pip install --upgrade pip
RUN pip install tensorflow
RUN pip install CMake
RUN pip install dlib
RUN pip install torch
RUN pip install torchvision

EXPOSE 3001

CMD ["npm", "start"]

 

FROM절을 여러개 쓰는 방법을 multi-stage build라고 한다

 

특히 copy --from=0로 이전 단계의 내용을 복사해와야한다.

 

0은 stage-0를 가리키는듯?

 

 

Multi-stage builds | Docker Documentation

 

Multi-stage builds

 

docs.docker.com

 

도커 이미지 잘 만드는 방법 :: 조은우 개발 블로그 (jonnung.dev)

 

조은우 개발 블로그

조은우 개발자 블로그

jonnung.dev

 

 

5. jenkins에서 빌드해보기

 

dockerfile을 작성하고 jenkins에서 빌드를 수행해본다.

 

docker image를 빌드하는 명령어는..

 

$ docker build -f Dockerfile -t server .

 

경로 내에 Dockerfile을 빌드하고 이름을 server로 한다는 뜻인듯

 

마지막 .은 현재 위치를 뜻하는듯

 

근데 빌드해보면 docker가 없다고 나옴

 

6. docker in docker

 

현재 jenkins가 docker image화된 jenkins인데.. 이렇게 docker image로 된 컨테이너에서 docker를 수행하는 것을

 

docker in docker라고 부른다고 한다.

 

이를 수행할려면 jenkins를 수행하는 host의 docker를 빌려와서 수행해야한다고 한다

 

방법이 여러가지가 있는것 같은데..

 

https://kanoos-stu.tistory.com/53

 

[Docker] 도커 컨테이너에서 도커 이미지 빌드 (with jenkins)

발단 docker 환경에서 jenkins를 이용하여 pipeline구축 시 docker 이미지를 빌드해야하는 경우가 생긴다. 이때 jenkins를 docker로 실행시키지 않는다면 권한 부여만으로 해결이 가능하지만 jenkins를 docker이

kanoos-stu.tistory.com

 

 

누군가가 이미 설정을 완료해놓아 빌드해놓은 jenkins 이미지를 pull받아 수행

 

그대로 복사해서 입력하면 로컬에 없어도 알아서 pull받아옴

 

한줄로 칠려하면 오히려  에러나더라..

 

docker run \
  -d \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  -u root \
  mbodji/jenkins-withdocker:v1.0

 

그리고 여기서 -d가 중요하다

 

detach mode라고 jenkins를 백그라운드에서 실행할 수 있게 해준다

 

쓰지 않으면 shell에서 계속 수행하는데.. 이 shell에서 ctrl+c로 꺼버리면 jenkins도 꺼진다

 

이 말은 -d를 꼭 써줘야 shell을 끄더라도 jenkins container를 내리지 않는 이상 계속 수행된다는 소리

 

사람들이 만들어놓은 도커 이미지에서 사용한 jenkins 버전에 따라.. 실행해보면 jenkins가 플러그인을 설치하지 못할 수도 있거든

 

예를 들어 누군가 2.2버전으로 사용해서 이미지화 해놓았는데 그 경우 플러그인 설치를 못하더라고..

 

2.3버전 이상을 요구한다나 뭐라나

 

참고로 docker ps를 이용하면 현재 실행되고 있는 컨테이너 확인 가능하다

 

 

 

 

 

그런 경우에 도커 허브에 들어가서 원하는 이미지 검색해가지고 최신거 찾아서 바꿔주면 될듯

 

그리고 mbodji/jenkins-withdocker:v1.0 경우에

 

v1.0이 태그로 붙어있는데 이걸 안쓰고 mbodji/jenkins-withdocker 라고 하면 

 

기본 태그를 latest라고 인식하는데.. 만약 만든 사람이 이를 사용하지 않았다면 에러남

 

 

그런 경우에 직접 들어가봐서 Tags 버튼 누르면 태그를 볼 수 있다.

 

여긴 v1.0이 태그라 내가 mbodji/jenkins-withdocker:v1.0라고 썼다..

 

아니 근데 아무튼 이러면... 지금까지 해놓은 설정 다 사라지는거임..? oh my god

 

 

후우... 정신을 가다듬고 처음부터 다시 세팅해보자..

 

이미 했던거니까 어렵지 않다

 

어떻게든 설정해보고.. 실제로 docker image로 백엔드를 빌드해보자..

 

 

 

어찌저찌 잘 되는듯... 

 

배포해보기 전까지는 이미지로 잘 만든건지를 모르겠다..

 

 

7. backend와 frontend 동시에 자동 빌드

 

모든 세팅을 완료하고 backend용 프로젝트, frontend용 프로젝트를 만들고

 

webhook을 건 다음에 push해서 자동으로 빌드되는지 테스트해본다

 

 

 

frontend는 빌드하면 폴더 내에 build 폴더가 생기지만..

 

backend는 빌드하면 EC2 서버 내에 build된 이미지가 생긴다

 

 

 

 

참고

 

EC2 우분투에 python 설치

 

ubuntu(AWS EC2)에서 원하는 Python버전 다운받기 (tistory.com)

 

ubuntu(AWS EC2)에서 원하는 Python버전 다운받기

AWS EC2를 사용하는 과정에서 Python 원하는 버전을 맞추는데 어려움을 겪었습니다. 그래서 이번에 특정 버전을 설치하는 방법을 적어보도록 하겠습니다. Python 홈페이지에 들어가서 원하는 버전을

mungto.tistory.com

 

 

TAGS.

Comments