현제의 현재이야기
[DevOps] nginx를 이용한 무중단 배포 본문
1. 도커 컴포즈 설치
2. docker-compose 작성
- 중요한 점은 deploy.sh와 같은 곳에 위치해야함
- /home/ec2-user/
version: '3'
services:
green:
container_name: green
image: hjdeploy/test
ports:
- "8080:8080" # green은 8080 포트를 열어줍니다.
environment:
- DATASOURCE_URL=
- DATASOURCE_USERNAME=
- DATASOURCE_PASSWORD=
blue:
container_name: blue
image: hjdeploy/test
ports:
- "8081:8080" #blue는 8081 포트를 열어줍니다.
environment:
- DATASOURCE_URL=
- DATASOURCE_USERNAME=
- DATASOURCE_PASSWORD=
- 몰랐던 것은 docker compose를 사용하면 기존의 sub module이 작동하지 않고, environment를 통해서 넘겨주어야 한다는 것이다.
- 이렇게 되면 application.yml에 밑과 같은 식으로 작성해주어야 하는데, 이렇게 되면 도커 이미지 빌드할 때 test통과가 되지 않는다. 조금더 고민해보아야겠다.
spring:
config:
activate:
on-profile: prod
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${DATASOURCE_URL}
username: ${DATASOURCE_USERNAME}
password: ${DATASOURCE_PASSWORD}
3. deploy.sh 작성
IS_GREEN=$(docker ps | grep green) # 현재 실행중인 App이 blue인지 확인합니다.
DEFAULT_CONF=" /etc/nginx/nginx.conf"
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://localhost:8080) # green으로 request
if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
echo "health check success"
break ;
fi
done;
echo "4. reload nginx"
sudo cp /etc/nginx/nginx.green.conf /etc/nginx/nginx.conf
sudo nginx -s reload
echo "5. blue container down"
docker-compose stop blue
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://localhost:8081) # blue로 request
if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
echo "health check success"
break ;
fi
done;
echo "4. reload nginx"
sudo cp /etc/nginx/nginx.blue.conf /etc/nginx/nginx.conf
sudo nginx -s reload
echo "5. green container down"
docker-compose stop green
fi
- 원리는 이렇다. 전 컨테이너가 블루면 그린을 pull 받고, 헬스체크 후, nginx.green.conf를 nginx.conf로 복사한다.
- 그리고 리로드하여 80포트로 들어가면 8080으로 들어가게 해줌. 반대도 마찬가지다.
4. nginx.blue.conf, nginx.green.conf 작성
- 기본 nginx.conf에다가 서버주소와 포트만 작성하면 된다.
listen 80;
server_name 3.39.192.173;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://localhost:8081;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
- 이렇게 이부분 chage! 이렇게 되면 80이 들어올 때, 8081로 매핑해준다.
- 반대도 마찬가지이다.
5. 중요한 것들
sudo service nginx restart -> 변경사항 저장 후, 재시작 해주어야 한다.
vi, :q!, :wq 등등 많은 리눅스 명령어들,,
sudo cp nginx.conf.default /etc/nginx/nginx.conf 복사
docker-compose up -> 도커 컴포즈 있는 곳에서 모든 컨테이너를 띄운다.
-결과화면-
덕분에 리눅스랑도 많이 친해지고, 도커에 대해서 조금 더 알게되고, docker compose도 알게되고, nginx도 알게되고,, 삽질을 정말 많이 하였지만 값진 시간이었다.
-레퍼런스-
https://blockdmask.tistory.com/25
https://mr-popo.tistory.com/230
'Infra' 카테고리의 다른 글
[Devops] [Error]docker-compose : Unsupported config option for services service: 'platform' 해결 (0) | 2023.07.19 |
---|---|
[DevOps] Docker compose 환경변수 (1) | 2023.05.22 |
[docker] GitHub submodule (0) | 2023.05.16 |
[docker] GitHub actions CI CD (1) | 2023.05.13 |
[docker] 도커 ec2 배포 및 rds 연동 (0) | 2023.05.12 |
Comments