Docker 외부에서 내부 DB 자동 백업 빈도 설정하기(cron)

Ssol·2022년 5월 30일
0

Docker

목록 보기
2/2
post-thumbnail

이번 글에서는 이전 글에서 했었던 DB 백업 과정이 주기적으로 돌아가도록 자동화 해보려고 한다.

MySQL 백업 쉘스크립트

# db_dump.sh
echo "Backup start!"

current=$(date +"%Y%m%d")

exec mysqldump -u root --password="{DB비밀번호}" --all-databases > /db_dump/mysql_$current.sql

echo "Backup complete. Check the path 저장경로"

위 스크립트는 덤프 파일명에 스크립트가 실행되는 날짜가 붙어서 모든 스키마의 덤프를 생성하도록 하는 명령 스크립트이다.

이 쉘스크립트는 docker-compose의 볼륨으로 잡혀는 로컬의 db_dump 폴더와 동기화 되어 있는 컨테이너 안에 db_dump 폴더 안에 들어있다.
(동기화이므로 로컬의 db_dump 안에 생성하면 자동으로 컨테이너 안의 db_dump 안에도 같은 파일이 생성이 됨. docker-compose에 대해선 나중에 다뤄 보겠다)

이제 이 파일을 도커 컨테이너 외부에서 도커로 접속하여 주기적으로 실행시키기만 하면 자동 백업 주기 설정이 되게 되는 것!

Ubuntu 위에 돌아가는 도커 컨테이너로 접속하기

다시 말해 도커 밖 ubuntu에서 MySQL 컨테이너로 접속해 내부 db_dump 경로안에 있는 db_dump.sh를 실행하려한다.

docker 밖에서 도커 내부로 들어가는 명령어는

sudo docker exec -it db bash

여기서 도커 내부의 명령파일이 있는 경로로 들어가 실행 시켜줘야 하므로
(참고로 -i 플래그는 interactive라는 뜻으로, 컨테이너와 상호적으로 주고받고 하겠다는 뜻이고, -t 플래그는 tty라는 뜻으로 tty를 사용한다는 뜻, 즉 터미널과 비슷한 환경을 조성해주는 것)

sudo docker exec db sh -c "cd db_dump; sh db_dump.sh"
# 리눅스 -c 플래그는 뒤에 오는 String 명령을 실행

해당 경로로 접근하는 명령과 sh를 실행시키는 명령어를 주고
docker 터미널을 직접 열어서 사용할 것이 아니므로 -it 옵션과 bash는 빼주면 된다.

Linux의 기본 스케줄러 cron

위 명령을 리눅스 내에 있는 기본 잡 스케줄러 기능인 cron을 이용해서 원하는 때마다 실행시키게 만들면 주기적으로 DB 백업이 실행되는 기능이 완성되게 된다.

root/etc/crontab

cron을 사용하는 방법은 /root/etc 경로에 있는 crontab 파일을 편집기로 열어서 원하는 스케줄을 설정해주면 되는데, 아래의 그림과 같이 스케줄 실행할 시간을 지정하고 root 권한으로 명령어를 실행하도록 하면 된다.


cron 사용 방법은 crontab 주석에 상세히 적혀있다.

# 매일 0분 0시에 실행
# 명령 실행은 root로
# docker exec db sh -c "cd db_dump; sh db_dump.sh" 명령 실행
0 0 * * * root docker exec db sh -c "cd db_dump; sh db_dump.sh"

※ 위 명령어를 cron으로 바로 실행하는게 아닌 sh로 만들고 그 sh 파일을 cron으로 실행시키게 되면, sh파일을 실행할 때에만 root로 실행되고 sh가 실행되어 docker 내부로 들어갈 때에는 root 권한이 없는 상태라 비밀번호가 필요하게 된다.(sudo로 임시 root 권한을 줘도 비밀번호가 필요)
= 도커 접근이 안됨😫

그래서 도커 내부 접속 명령을 root로 실행할 수 있는 cron에 넣은 것

이제 cron 서비스를 재시작 해주면 스케쥴러 적용 끝!!

sudo service cron restart

오래된 백업 파일 자동 삭제

이제 20일이 지난 백업 파일을 자동 삭제하도록 해보자.

echo "============= 20일 지난 데이터 삭제 시작 ============="
# 20일이 지난건 지워버림
DEL_FILE=`date -d '20 days ago' +%Y%m%d`

rm -rf /home/openeg/db_dump/mysql_${DEL_FILE}.sql
echo "============= 20일 지난 데이터 삭제 완료 ============="

이 스크립트를 db_dump.sh에 추가해주면 된다.
20일 전 날짜인 덤프 파일명이 있으면 해당 파일을 삭제 🫥


참고 블로그: https://eyeballs.tistory.com/49 (Docker container 바깥에서 명령 내리기)

profile
Junior Back-end Developer 🫠

0개의 댓글