[Docker] 8. Git과 도커로 애플리케이션 배포하기

서버를 운영하고 애플리케이션을 배포하는 방법은 서비스 환경, 구축하는 사람에 따라 다양한 방법이 나올 수 있다. 이번 글에서는 분산형 버전 관리 시스템 Git과 Docker를 이용한 애플리케이션 배포 방법을 알아보겠다.

참고 도서: 가장 빨리 만나는 Docker (이재홍)

* 서버 한 대에 애플리케이션 배포하기

대략적인 순서는 다음과 같다.

1) 개발자 PC에서 애플리케이션 개발
2) git push 명령으로 소스를 서버에 업로드
3) 서버에서 저장소에 git push 명령이 발생하며 git hook을 실행
4) git hook에서 도커 이미지를 생성, 이미지를 컨테이너로 실행

이제 본격적으로 배포하는 과정을 알아보자.

1. 개발자 PC에서 Git 설치, 저장소 생성

개발자 PC에 Git을 설치한다. ( http://git-scm.com )
우분투, CentOS에서 install git 명령어를 사용해도 상관없다. 필자는 윈도우의 Git Bash로 실습하겠다.

Git Bash를 실행하고 명령어로 Git 저장소를 생성하고, 저장소 디렉토리로 이동한다.

git init exampleapp
cd exampleapp
cs

git config 명령으로 이메일, 이름을 설정한다.

git config --global user.email zini@example.com
git config --global user.name "zini"
cs


2. 개발자 PC에서 Node.js로 웹 서버 작성 및 도커파일(Dockerfile) 작성

개발자 PC에서 간단히 Node.js로 웹서버를 작성한다. 그 내용을 app.js로 저장한다.

app.js
var express = require('express');
var app = express();
 
app.get(['/''/index.html'], function (req, res) {
  res.send('Hello Docker');
});
 
app.listen(80);
 
cs

Node.js npm 패키지 사용을 위해 다음과 같이 작성하고 package.json로 저장한다.

package.json
{
  "name""exampleapp",
  "description""Hello Docker",
  "version""0.0.1",
  "dependencies": {
    "express""4.4.x"
  }
}
 
cs

이제 도커파일을 작성하자. 서버에서 도커 이미지를 생성할 수 있도록 개발자 PC에서 Dockerfile을 작성한다. 다음 내용을 Dockerfile로 저장한다.

Dockerfile
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y nodejs npm
ADD app.js /var/www/app.js
ADD package.json /var/www/package.json
WORKDIR /var/www
RUN npm install
CMD nodejs app.js
 
cs

모든 파일(js, json, Dockefile)은 git 디렉토리의 exampleapp에 위치시킨다.

git add, git commit 명령으로 개발자 PC의 exampleapp 저장소에 파일을 커밋한다.

git add app.js package.json
git commit -"add source"
git add Dockerfile
git commit -"add Dockerfile"
 
cs


3. 개발자 PC에서 SSH 키 생성

개발자 PC에서 ssh-keygen 명령을 실행하여 SSH키를 생성한다.

ssh-keygen
cs

명령어 실행시 나오는 문장에서는 모두 Enter로 넘어간다.
이제 /home/(사용자 계정)/.ssh 디렉토리에 id_rsa, id_rsa.pub 파일이 생성되었다.


4. 서버에 Git 설치 및 저장소 생성

이제 서버를 설정하자. Docker가 리눅스 전용이므로 리눅스 서버에서 작업하자.
필자는 우분투를 사용하겠다. 서버에 Git을 설치하는 것부터 시작하자.

sudo apt-get install git
cs

현재 리눅스 계정의 홈 디렉토리(/home/<사용자 계정>)에 exampleapp 저장소를 생성한다. 그리고 개발자 PC에서 push한 소스를 받을 수 있도록 receive.denycurrentbranchignore로 설정한다.

git init exampleapp
git config receive.denycurrentbranch ignore
cs


5. 서버에 Docker 설치 및 SSH 키 설정

이제 서버에 Docker를 설치한다. 설치되어 있다면 넘어가자.

sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
cs

서버의 /home/<서버 사용자 계정> 디렉토리에 .ssh 디렉토리를 생성 후 권한을 설정한다.

mkdir .ssh
chmod 700 .ssh
cs

필자는 .ssh 폴더가 왜인지 모르게 이미 존재해서 따로 설정하지 않았다.
.ssh 디렉토리에 authorized_keys 파일을 생성한다(vi 명령어로). 개발자 PC에서 생성한 id_rsa.pub 파일의 내용을 (메모장으로 열어) 복사해서 authorized_keys 파일에 붙여넣는다.

ssh-rsa ~ 형식의 내용일 것이다. authorized_keys 파일도 권한을 설정한다.

chmod 600 authorized_keys
cs

이제 개발자 PC에서 비밀번호 없이 git push 명령을 사용할 수 있다.


6. 서버에 Git Hook 설정

개발자 PC에서 git push 명령으로 소스를 올리면 Docker 이미지, 컨테이너를 생성하도록 Git Hook을 설정한다.

다음 내용을 /home/<서버 사용자 계정>/exampleapp/.git/hooks 디렉토리에 post-receive로 저장한다.

#!/bin/bash
 
APP_NAME=exampleapp
APP_DIR=$HOME/$APP_NAME
REVISION=$(expr substr $(git rev-parse --verify HEAD) 1 7)
 
GIT_WORK_TREE=$APP_DIR git checkout -f
 
cd $APP_DIR
docker build --tag $APP_NAME:$REVISION .
docker stop $APP_NAME
docker rm $APP_NAME
docker run ---name $APP_NAME -80:80 $APP_NAME:$REVISION
 
cs

이제 post-receive 파일에 실행권한을 부여한다.

chmod +x post-receive
cs

Git Hook 설정이 끝났다.


7. 개발자 PC에서 소스 Push

이제 개발자 PC로 돌아와서 exampleapp 저장소 디렉토리로 이동한 뒤 git remote add 명령어로 origin 주소를 설정한다.

git remote add origin 서버사용자계정@IP주소/도메인:exampleapp
cs

git push 명령으로 소스를 서버에 업로드한다.

git push origin master
cs

명령 출력 결과에서 Docker 이미지와 컨테이너가 생성되는 모습을 볼 수 있다. git push 명령어 완전히 끝나면 웹 브라우저를 실행하여 IP 주소를 입력해보자. Hello Docker가 표시된다. 소스를 수정한 뒤 서버에 Push 하면 새 Docker 컨테이너가 생성된다.

댓글 없음:

Powered by Blogger.