Docker로 애플리케이션 배포하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

배포 서버에 Git Hook 설정하기

개발자 PC에서 git push 명령으로 소스를 올렸을 때 Docker 이미지를 생성하고, Docker 레지스트리 서버에 올린 뒤 각 애플리케이션 서버에 배포하도록 Git Hook을 설정합니다.


그림 8-17 배포 서버에 Git Hook 설정

다음 내용을 배포 서버의 /home/<배포 서버 사용자 계정>/exampleapp/.git/hooks 디렉터리에 post-receive로 저장합니다.

~/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)

REGISTRY=192.168.0.40:5000
APP_SERVERS=(
  "pyrasis@192.168.0.101"
  "pyrasis@192.168.0.102"
)

GIT_WORK_TREE=$APP_DIR git checkout -f

cd $APP_DIR
docker build --tag $APP_NAME:$REVISION .
docker tag $APP_NAME:$REVISION $REGISTRY/$APP_NAME:$REVISION
docker push $REGISTRY/$APP_NAME:$REVISION

SSH="ssh -o StrictHostKeyChecking=no"
for SERVER in ${APP_SERVERS[@]}
do
  $SSH $SERVER docker pull $REGISTRY/$APP_NAME:$REVISION
  $SSH $SERVER docker stop $APP_NAME
  $SSH $SERVER docker rm $APP_NAME
  $SSH $SERVER docker run -d --name $APP_NAME \
    -p 80:80 $REGISTRY/$APP_NAME:$REVISION
done
  • APP_NAME 변수에 현재 애플리케이션의 이름을 설정합니다. 이 이름은 저장소 이름과 같아야 합니다.
  • APP_DIR 변수에 저장소 디렉터리 경로를 설정합니다. 셸에서 HOME 변수에는 사용자 홈 디렉터리 경로(/home/<사용자 계정>)가 들어있습니다.
  • git rev-parse 명령으로 Push된 최신 리비전을 구한 뒤 앞의 7자리만 REVISION 변수에 저장합니다.
  • REGISTRY 변수에 Docker 레지스트리 서버의 IP 주소와 포트 번호를 설정합니다. 192.168.0.40:5000은 저의 레지스트리 서버 IP 주소이므로 이 부분은 여러분의 IP 주소를 설정합니다.
  • APP_SERVERS 변수에 애플리케이션 서버의 사용자 계정과 IP 주소를 배열 형태로 설정합니다. pyrasis@192.168.0.101, pyrasis@192.168.0.102는 저의 애플리케이션 서버 계정과 IP 주소이므로 이 부분은 여러분의 계정과 IP 주소를 설정합니다.
  • git checkout -f 명령으로 Push된 소스를 저장소 디렉터리에 받습니다. 반드시 GIT_WORK_TREE 변수를 설정해주어야 합니다.
  • exampleapp 저장소 디렉터리로 이동합니다.
  • docker build 명령으로 이미지를 생성합니다. 이미지 이름은 exampleapp이고 태그에는 방금 구한 Git 리비전을 설정합니다.
  • 레지스트리 서버에 올릴 수 있도록 docker tag 명령으로 방금 생성한 이미지를 <레지스트리 서버 주소>/exampleapp:<리비전>으로 태그를 생성합니다.
  • docker push 명령으로 이미지를 레지스트리 서버에 올립니다.
  • SSH 변수에 ssh 명령과 옵션을 설정합니다. StrictHostKeyChecking=no 옵션을 설정해야 호스트 키 경고를 무시하고 바로 명령을 실행할 수 있습니다. 그렇지 않으면 사람이 일일이 애플리케이션 서버에 접속하여 호스트 키 경고에서 yes를 입력해주어야 합니다.
  • 반복문을 이용하여 APP_SERVERS 배열에 담긴 애플리케이션 서버 주소마다 SSH로 명령을 실행합니다.
    • docker pull 명령으로 레지스트리 서버에 저장된 이미지를 받습니다.
    • docker stop, rm 명령으로 현재 실행되고 있는 Docker 컨테이너를 정지한 뒤 삭제합니다.
    • docker run 명령으로 방금 레지스트리 서버에서 받은 이미지를 컨테이너로 생성하고, -p 옵션으로 80번 포트를 연결하고 외부에 노출합니다. 이미지 이름은 <레지스트리 서버 주소>/exampleapp이고 태그에는 앞에서 구한 Git 리비전을 설정합니다.

post-receive 파일에 실행 권한을 부여합니다.

~/exampleapp/.git/hooks$ chmod +x post-receive

자동 확장
이 책에서는 애플리케이션 서버가 192.168.0.101, 192.168.0.102 두 개인 것을 기준으로 post-receive 파일을 작성하였습니다. 만약 AWS Auto Scaling 같은 서비스를 이용한다면 Auto Scaling 그룹에 속한 서버의 IP 주소를 AWS API나 CLI를 이용하여 APP_SERVERS 변수에 저장하면 됩니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014