nodejs와 nginx 의 도커 자동화 배포여정…

DG
8 min readFeb 5, 2020

--

저번에 개발한 성서봇 웹 페이지의 Dockerizing을 무사히 성공하였다. 이후의 배포과정이 간단해져서 만족스러웠지만, 이곳에서 만족할 순 없다. Docker와 함께쓰는 배포 자동화를 진행해보려 한다. 우선 그러기 위해선 꼭 필수적인 요소는 아니지만 Dockerhub 를 이용하도록 하겠다. Github 만을 이용해도, Dockerfile 만 제대로 받아온다면 배포환경에서 직접 이미지를 만들어서 돌려주어도 좋지만, 그래도 편한게 좋은거니깐.. 우선 그동안 만들었던 서버들을 Dockerfile 을 이용해 이미지로 만들어주었다.

Nginx React Dockerfile

FROM node:10 as builder# 작업 폴더를 만들고 npm 설치RUN mkdir /usr/src/appWORKDIR /usr/src/appENV PATH /usr/src/app/node_modules/.bin:${PATH}COPY package*.json /usr/src/app/package.jsonRUN npm install --silent# 소스를 작업폴더로 복사하고 빌드COPY . /usr/src/appRUN npm run buildFROM nginx:1.13.9-alpine# nginx의 기본 설정을 삭제하고 앱에서 설정한 파일을 복사RUN rm -rf /etc/nginx/conf.dCOPY conf /etc/nginx# 위에서 생성한 앱의 빌드산출물을 nginx의 샘플 앱이 사용하던 폴더로 이동COPY --from=builder /usr/src/app/build /usr/share/nginx/html# 80포트 오픈하고 nginx 실행EXPOSE 80CMD [ "nginx", "-g", "daemon off;" ]

Nodejs Web Server Dockerfile

FROM node:10WORKDIR /usr/src/appCOPY package*.json ./RUN npm installCOPY . .RUN npm run buildEXPOSE 4001CMD ["yarn", "docker"]

Nginx React Application 이미지 만들기

#React Application 경로에서
docker build . -t donggyu9410/kbucard

Nodejs Web Server 이미지 만들기

#Nodejs Web Server 경로에서
docker build . -t donggyu9410/kbu-admin-management-server

docker hub에 배포하기

docker push donggyu9410/kbu-admin-management-server
docker push donggyu9410/kbucard

이제 기존 배포서버에서 사용하던 모든 컨테이너들과 이미지들을 지워주도록 하겠다. 그리고 배포서버내에서는 이미지들만 받아서 컨테이너에서 구동시켜주면 되므로, 프로젝트 코드들도 모두 지워주도록 하겠다. 서버의 메모리 용량은.. 소중하니깐..

모두 지워주고 왔다.

dan@dan:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dan@dan:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

이제 배포서버내에는 어떤 코드도, 이미지도, 컨테이너도 존재하지 않는다. (뭔가 방청소를 방금 끝내고 나온듯한 개운함이 든다. 근데 내 방청소는 언제…)

위에 대문작만하게 걸어놓은 사진을 보면 알 수 있겠지만 배포의 자동화를 위한 툴로써는 Jenkins 를 이용하도록 하겠다. Jenkins를 컨테이너로 감싸서 구동시키도록 하겠다. 그러면 컨테이너 안의 Jenkins 에서 컨테이너화 된 프로그램을 띄우는 방식이 되게 된다. Docker in Docker.근사하지 않은가?

Jenkins 이미지를 다운받아준다.

sudo docker pull jenkins

jenkins를 컨테이너로 담아서 돌려준다.

sudo docker run -d -p 8081:8080 -v /home/dan/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins

/home/dan/jenkins 디렉토리와 컨테이너 내부의 /var/jenkins_home 디렉토리의 볼륨을 매칭시켜주고, Jenkins 컨테이너 내부에서 또 안의 nodejs 컨테이너를 돌려야 하기 때문에,/var/run/docker.sock:/var/run/docker.sock 이 부분도 추가를 해준다. Jenkins의 기본 포트번호인 8080 포트를 사용하고 싶지만, 현재 서버 내에서 이미 누군가가 사용하고 있는 포트번호이기 때문에 8081 포트번호로 돌려준다. 그리고 root 계정으로 구동을 시키기 위해서 위와 같이 적어주었다.

배포 서버내의 jenkins 컨테이너가 잘 돌아가고 있음을 확인할 수 있다. Jenkins 를 설치하고 돌려보면 log가 주루룩 나오는데, 거기서 admin 계정의 비밀번호를 알려준다.

sudo docker logs ee9719450b85

로그 뒷부분을 보다보면 password 가 나온다. 해당 password 를 가지고 Jenkins 플러그인 설치페이지로 들어가도록 하자.

자동화툴 플러그인을 설치할 수 있는 페이지까지 오게 되었다. 설치해주자.

Install suggested plugins 로 설치하도록 하겠다.

대충 5분 정도의 시간이 흐르면 된다.

한개의 플러그인 빼고는 전부 설치를 못하였다. 이럴거면 왜 설치한다고 한거람. 우선 넘어가준다.

첫번째 어드민계정을 생성하고 들어가면 다음과 같은 창이 뜬다. create new jobs 를 클릭해준다.

item 이름을 적당히 알아보기 쉽게 정해주고 Freestyle project 를 눌러준다.

Execute shell 을 눌러서 원하는 shell 명령어들을 기입해준다.

docker pull 비밀이야/비밀이야docker rm -f kbu-cafeteria-serverdocker run -d -p 4001:4001 --name kbu-cafeteria-server 비밀이야/비밀이야

Save 버튼을 누르고 한번 빌드를 수행해보도록 하자.

제대로 수행되어지지 않아서 console output 부분을 살펴보니 docker 라는 명령어를 알아먹지 못하고 있다. 컨테이너 내부에 들어가서 docker 를 설치해주도록 하자.

sudo docker exec -it docker_container_id /bin/bashcurl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz
tar xzvf docker-17.04.0-ce.tgz

해당 명령어로 도커를 설치해주도록 하자.

mv docker/docker /usr/local/bin

명령어로 도커를 쉽게 실행시킬 수 있게 하기 위해서 docker 파일을 /usr/local/bin 위치에 옮겨주고,

rm -r docker docker-17.04.0-ce.tgz

Jenkins 컨테이너 내부의 용량을 줄여주기 위해서 이전에 다운 받았던 알집과 폴더를 지워주도록 한다.

그리고 컨테이너 내부에서 docker의 원활한 사용을 위해서 docker 에 로그인을 해준다.

docker login

이제 컨테이너안에서 나와서 Jenkins 를 다시 빌드시켜줘보도록 하자.

현재 내 웹서버는 database 까지만 연결이되면 정상적으로 동작한다고 볼 수 있는 상태인데,

Jenkins 컨테이너 내부에서 제대로 웹서버를 구동하고 있는 모습을 볼 수 있다. 하지만 아직 배포의 자동화를 이뤄냈다고 말을 할 순 없다. 배포 자동화 기법중에 가장 단순하고 쉬운 원격 배포를 실행해줘보도록 하자.

configure 부분에 보면 Build Triggers 부분이 있다. 첫번째의 Trigger builds remotely 를 체크해주고, Authentication Token 을 주자.

저장하게 되면 JENKINS_URL/job/kbu-cafeteria-server/build?token=TOKEN_NAME url 로 언제든지 원격으로 배포를 자동화시킬 수 있다.

--

--

DG
DG

Written by DG

한국의 iOS 개발자이다. 강아지와 운동을 좋아함. github: https://github.com/donggyushin

No responses yet