현재 A 서비스는 따로 docker 기반으로 운영되고 있지 않는데...이거를 차근차근 docker화 시키고 compose화 시키고 CI/CD TOOL도 붙이는 것이 1차 목표이다. 2차 목표는 설계한 환경을 그대로 쿠버네티스 환경으로 이식하는 것이다.
이것을 해보면 첫번째로 DevOps에 대한 첫 걸음은 뗄수 있을 것이라고 생각한다.
그렇기 때문에 우선 처음으로는 서비스를 이미지로 빌드하고 컨테이너까지 실행하여 로컬 환경에서 띄워보는 것이다.
우선 서비스를 이미지화 하기 위해 필요한 것은 무엇일까?
Dockerfile, .dockerignore 만 있으면 지금 현재의 서비스에서는 빠르게 이미지를 빌드하고 컨테이너를 실행할 수 있다.
지금 현재 A서비스는 Nodejs + express 환경이다. 이것도 리뉴얼할 때 NestJs 프레임워크를 이용해보는것도 좋을 것 같다.
물론 nodejs+express에서 nestJS로 갈아타려는 이유를 잘 비교해서 따져보는 것이 첫번째일 것이다. 추후에 알아봐야겟다.
다시 본론으로 돌아와서.
A서비스를 이미지로 빌드하기 위하여 Dockerfile과 .dockerignore 파일을 생성하였다.
# base Image with light size image alpine
FROM node:16-alpine
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install dependencies
COPY package.json .
RUN npm install
# Bundle app source
COPY . .
# 환경 변수 NODE_ENV의 값 development로 설정
# 실제 production 환경에서는 어떤식으로 적용시킬지에 대한 개선 필요
ENV NODE_ENV = ${NODE_ENV}
ENV NODE_PATH .
CMD [ "npm", "start" ]
# Exports
EXPOSE 8330 3000
우선 base-image는 alpine리눅스 기반의 node 16버전으로 정했다. 왜냐하면 이미지의 용량이 훨씬 가볍기 때문이다.
그리고 app의 dir을 생성하고 app의 dir을 설정하였다. 그리고 dependencies를 복사하고 RUN 명령어를 통하여 패키지를 설치하였다.
소스를 다 copy하고 환경변수를 설정하였다. 환경변수는 음... 개발환경으로 띄울꺼냐~ 실제 prod환경으로 띄울거냐~ 설정하는것이다.
그리고 EXPOSE는 어떤 포트를 열어줄 것이냐를 설정하는 것인데 개발환경은 8330 운영환경은 3000이기 때문에 8330과 3000을 설정하여 포트를 열어줬다.
이렇게만 하면 빠르게 서비스를 이미지화 시켜 컨테이너를 실행시킬 수 있다.
아 그리고 이미지 빌드할 때 사용하는 명령어들은 따로 포스팅하여 정보를 공유할 수 있도록 해보겠ㄷr.
node_modules
npm-debug.log
이미지로 빌드할 때 gitignore처럼 특정 폴더나 파일을 제외할 것인지 명시하는 파일이다.
docker build --build-arg NODE_ENV=development -t Aapp-develop:0.1 .
docker run -d -p 8080:8080 --name Aapp-develop Aapp-develop:0.1
이렇게 하면 이미지 빌드부터 컨테이너 실행까지 대 성공이다.
후후.
다음 편은 이제 docker-compose로 nginx + A서비스를 만들어 다중컨테이너를 설정해 볼 것이다.