우선 mysqldump를 활용하는 것이 더 무결하게 데이터를 백업할 수 있는 방법이지만 아래 이유로 해당 방법을 실행하지 않았다.
굉장히 마음이 불편하지만 지금 시기는 앞단 퍼널의 기술적 요구사항을 해결하는 것이 맞다고 생각한다.
docker volume create --name test-volume
tikkle-mysql-volume을 test-volume으로 복사
docker run --rm -v tikkle-mysql-volume:/from -v test-volume:/to alpine ash -c "cd /from && cp -a . /to"
docker run
: 새 Docker 컨테이너를 실행하는 명령.-rm
: 컨테이너 실행이 완료된 후 자동으로 컨테이너를 삭제. 이 옵션은 일시적인 작업에 유용하며, 작업 후 정리 과정을 자동화.v tikkle-mysql-volume:/from
: tikkle-mysql-volume
이라는 Docker 볼륨을 컨테이너의 /from
디렉토리에 마운트합니다. 이 볼륨에는 복사하려는 데이터가 들어 있습니다.v test-volume:/to
: test-volume
이라는 또 다른 Docker 볼륨을 컨테이너의 /to
디렉토리에 마운트합니다. 이 볼륨은 복사된 데이터를 받을 대상입니다.alpine
: 사용할 Docker 이미지. Alpine은 경량화된 Linux 배포판으로, 간단한 작업에 적합하다.ash -c
:ash
는 Alpine Linux에 내장된 셸입니다. c
옵션은 뒤따르는 문자열에 포함된 명령어를 실행하도록 지시합니다."cd /from && cp -a . /to"
: cd /from
은 컨테이너 내에서 /from
디렉토리(즉, tikkle-mysql-volume
볼륨)로 이동합니다. &&
는 첫 번째 명령어가 성공적으로 실행된 후에 뒤따르는 명령어를 실행하도록 합니다. cp -a . /to
는 /from
디렉토리에 있는 모든 파일과 하위 디렉토리(.
)를 재귀적으로(-a
) /to
디렉토리(즉, test-volume
볼륨)로 복사합니다.init.sql을 copy하는 부분을 제거하고 image를 build
# Dockerfile
# MySQL 이미지를 기반으로 이미지 생성
FROM mysql:5.7.12
# 환경 변수 설정
ENV LC_ALL C.UTF-8
# 포트 설정 (기본 MySQL 포트는 3306)
EXPOSE 3306
docker build -t volume-test .
해당 이미지로 test-volume을 마운트하여 도커 실행
docker run --name volume-test-container -v test-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=[비밀번호] -p 3307:3306 -d volume-test
위와 같이 정상적으로 데이터가 복원된것을 확인할 수 있다.
위에서 테스트한 복사과정을 아래와 같이 스크립트로 만들 수 있다.
backup.sh
#!/bin/bash
# Docker 볼륨 이름
SOURCE_VOLUME="tikkle-mysql-volume"
# 백업 볼륨 이름
TARGET_VOLUME="backup-volume"
# 기존 백업 볼륨이 있으면 삭제
if docker volume ls | grep -q $TARGET_VOLUME; then
docker volume rm $TARGET_VOLUME
fi
# 새로운 볼륨 생성
docker volume create --name $TARGET_VOLUME
# 데이터 복사
docker run --rm -v $SOURCE_VOLUME:/from -v $TARGET_VOLUME:/to alpine ash -c "cd /from && cp -a . /to"
리눅스 크론탭(Linux Crontab) 사용법 :: JDM's Blog
스크립트 저장: 위 스크립트를 backup.sh
파일로 저장
실행 권한 부여: chmod +x /path/to/backup.sh
명령으로 스크립트에 실행 권한을 부여
**chmod +x [backup.sh파일 경로]**
Cron 작업 추가: crontab -e
를 사용하여 2일마다 스크립트가 실행되도록 Cron 작업을 설정
javascriptCopy code
0 0 */2 * * /path/to/backup.sh