저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Docker로 애플리케이션 배포하기
이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20
배포 서버에 Git Hook 설정하기
개발자 PC에서 git push 명령으로 소스를 올렸을 때 Docker 이미지를 생성하고, Docker 레지스트리 서버에 올린 뒤 각 애플리케이션 서버에 배포하도록 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 공유는 허용합니다.