이전 글에 이어서 deploy관련 sh 스크립트와 docker compose 설정파일에 대해서 설명하겠다.
우선 들어가기 앞서 docker와 docker compose가 설치되어 있지 않다면 배포 대상서버에 설치하길 바란다.
#!/bin/bash
IS_GREEN=$(docker ps | grep green) # 현재 실행중인 App이 blue인지 확인합니다.
if [ -z $IS_GREEN ];then # blue라면
echo "### BLUE => GREEN ###"
echo "1. get green image"
docker compose pull green # green으로 이미지를 내려받습니다.
echo "2. green container up"
docker compose up -d green # green 컨테이너 실행
while [ 1 = 1 ]; do
echo "3. green health check..."
sleep 3
REQUEST=$(curl http://127.0.0.1:8080) # green으로 request
if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
echo "health check success"
break ;
fi
done;
echo "4. reload nginx"
sudo cp -p /etc/nginx/nginx-green.conf /etc/nginx/nginx.conf || exit 1
sudo sudo systemctl restart nginx || exit 1
if [ "$(docker ps -q -f name=blue)" ]; then
echo "5. blue container down"
docker compose stop blue
fi
else
echo "### GREEN => BLUE ###"
echo "1. get blue image"
docker compose pull blue
echo "2. blue container up"
docker compose up -d blue
while [ 1 = 1 ]; do
echo "3. blue health check..."
sleep 3
REQUEST=$(curl http://127.0.0.1:8081) # blue로 request
if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
echo "health check success"
break ;
fi
done;
echo "4. reload nginx"
sudo cp -p /etc/nginx/nginx-blue.conf /etc/nginx/nginx.conf || exit 1
sudo sudo systemctl restart nginx || exit 1
if [ "$(docker ps -q -f name=green)" ]; then
echo "5. green container down"
docker compose stop green
fi
fi
위의 로직을 설명하면 이렇다.
1) green 컨테이너가 실행되고 있다면 blue 컨테이너를 실행
2) nginx port를 blue로 바라보게 copy
3) green 컨테이너를 다운시킨다.
4) blue 컨테이너가 실행되고 있다면 위의 로직을 반대로 설정
이렇게 하면 사용자는 nginx가 restart되는 아주 찰나의 시점을 제외하고는 무중단으로 홈페이지를 사용할 수 있게 된다.
위의 스크립트에서 nginx 없이 아래와 같이 시도해보았지만 중단 시간이 5초 이상으로 생각보다 길었다. 1) green 컨테이너가 실행되고 있으면 green 컨테이너를 다운
2) blue 컨테이너 실행
3) blue 컨테이너가 실행하고 있으면 blue 컨테이너 다운
4) green 컨테이너 실행
따라서 더 짧은 중단시간을 위해 nginx가 필요한 것이다.
이를 위해 docker compose 파일(docker-compose.yml)은 아래와 같다.
version: '3.3'
services:
green:
container_name: green
image: jaypark/image
ports:
- "8080:8080"
blue:
container_name: blue
image: jaypark/image
ports:
- "8081:8080"
위 코드에서도 짧지만 정말 많은 시행착오를 겪었다.
1. 우선 version: '3.3' 부분은 본인이 설치한 docker compose 버전에 호환되게 넣어줘야 한다. 그렇지 않으면 에러가 발생한다.
2. 줄간격 맞추는 부분도 정확하게 해야지 에러가 발생하지 않는다.
3. image: jaypark/image 부분은 본인의 docker hub repository 명을 넣어야 한다. 그렇지 않으면 에러가 발생한다.
4. ports: 부분은 8081:8080으로 설명하자면 docker container의 외부 port는 8080이며, 내부적으로 사용되는 호스트포트는 8081이란 의미이고, 이 둘을 연결한다고 보면 된다.
지난번 포스트에서 nginx를 80 port로 listen하고 green, blue에 맞게 호스트 port를 각각 8080, 8081로 연결하기 때문에 외부 요청이 블루 그린배포시 다른 포트로 들어올 수 있다. 이 부분이 정말 헷갈렸다...
해당 내용은 고등학생이 웬만한 대기업 직장인의 월급 이상을 번다는 내용이다. 안본 개발자가 있다면 꼭 시청하길 바란다.
이렇게 알 수 있듯이 시대가 이미 변했다. 돈 버는 규칙이 바뀌었고, 이미 직장인, 대기업, 공기업 등 모든 부모님들이 바라는 안정적인 직업의 개념은 사라졌다.
<가장 유리한 포지션 : 개발자>
현 시대에서 가장 유리한 사람들이 개발자이다. 대부분의 사람들이 인터넷으로 나름의 플랫폼을 꿈꾼다. 하지만 대부분 실패한다. 그 이유가 플랫폼 개발은 투자를 받아서 어떻게든 개발하는데, 이후 운영하는 노하우가 없기 때문이다. 운영하면서 또 막대한 자본이 들어가고 결국 적자로 해당 사업이 실패한다.
개발자는 어떻게 다를까?
1. 직접 화면과 기능을 설계해서 구현할 수 있다.
2. 인프라를 구축해 해당 웹 소스를 배포할 수 있다.
3. 웹 기능을 운영하며, 중간 중간 필요한 부분을 수정하고, 에러에 대응할 수 있다.
<막연한 두려움>
AWS에 소스 올리면 해킹 당하는거 아니야?
AWS에서 해킹당하면 돈 폭탄 나와서 망하는거 아니야?
나 개발은 많이 했는데 클라우드, docker 이런거 하나도 모르는데?
실제 필자가 스스로에게 말했던 이야기이다. 이렇게 유리한 포지션임에도 위와 같은 막연한 두려움을 갖고 아이디어는 있지만 실제 행동에 옮기지 못한다. 우리가 10여년간 받은 주입식 교육 때문에 실행에 옮기는 것이 익숙하지 않을수도 있다. 이 두려움만 깨버릴 수 있다면 로우 리스크로 하이 리턴의 비지니스를 직접 운영할 수 있다.
필자의 경우 3대 SI 기업에서 4~5년간 개발을 진행했고, 마지막 1년은 개발과 PM업무를 동시에 진행했다. 이후 막연한 두려움을 깨버리고자 아무것도 모른체 클라우드 쪽으로 부서를 옮겼다. 처음엔 엄청난 도전이었다. 아무것도 모르니 잘할 수 있을까? 지금까지 한게 개발인데 적응할 수 있을까? 등등 또 부정적인 질문들이 온 몸을 감쌌다.
하지만 지금은 도전하지 않았으면 큰일날뻔 했다고 생각한다. 직장에 다니면서도 웹 비지니스를 구축했다. 리스크는 아예 없었다.
현재는 AWS, Docker, fastapi, github, github action 등을 이용하여 웹 비지니스를 운영하고 있다.
개발도 직접하고, 개발 소스를 github action, aws codepipeline을 통해 CI/CD하고, 운영자로서도 역할을 수행하고 있다.
나같은 겁쟁이가 단 한번의 용기로 이를 이루어낸 것이다.
<리스크는 없다>
나같은 겁쟁이 비전공자도 해냈다. 아무 리스크없이 월 100~200만원씩 들어오는 비지니스를 만들었다. 유일한 투자는 바로 나의 시간이다. 운영 비용도 1년에 10만원 아래이다.
혹시 이 글을 본 사람들이 있다면 그들을 위해서 개발부터 운영까지 모든 것을 담아서 글만 따라서 하기만 하면 바로 내가 구현한 웹의 전부를 따라할 수 있도록 글을 써보려고 한다. 관심있으신 분들이 있으면 댓글에 메일을 남겨주시길 바란다.