MySQL을 Docker 컨테이너로 패키징하여 데이터 지속성과 자동 백업을 구현한 프로젝트
# 1. MySQL 8.0 이미지 설치 및 컨테이너 실행 (Volume 마운트)
docker pull mysql:8.0
docker run -d --name mysql-test -e MYSQL_ROOT_PASSWORD=root -v mysql_data:/var/lib/mysql mysql:8.0
# 2. Dockerfile 작성
cat <<EOF > Dockerfile
FROM mysql:8.0
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=testdb
ENV MYSQL_USER=testuser
ENV MYSQL_PASSWORD=testpass
EOF
# 3. 데이터베이스 및 테이블 생성
docker exec -it mysql-test mysql -uroot -proot -e "CREATE DATABASE testdb; USE testdb; CREATE TABLE users(id INT PRIMARY KEY, name VARCHAR(50)); INSERT INTO users VALUES (1,'leejeongyi');"
# 4. MySQL 컨테이너 접근
docker exec -it mysql-test mysql -uroot -proot
# 5. Volume 확인
docker volume ls
docker volume inspect mysql_data
# 6. 자동 백업 스크립트 작성 및 실행 권한 부여
sudo mkdir -p /home/ubuntu/mysql_backups
cat <<EOF | sudo tee /home/ubuntu/mysql_backups/mysql_backup.sh
#!/bin/bash
BACKUP_DIR="/home/ubuntu/mysql_backups"
DATE=\$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="\$BACKUP_DIR/backup_\$DATE.sql"
docker exec mysql-test mysqldump -uroot -proot --all-databases > \$BACKUP_FILE
find \$BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm {} \;
echo "[\$(date)] MySQL backup completed: \$BACKUP_FILE"
EOF
sudo chmod +x /home/ubuntu/mysql_backups/mysql_backup.sh
# 7. 크론탭 등록 (매일 새벽 3시)
(crontab -l 2>/dev/null; echo "0 3 * * * /home/ubuntu/mysql_backups/mysql_backup.sh >> /home/ubuntu/mysql_backups/backup.log 2>&1") | crontab -
# 8. 이미지 빌드 및 컨테이너 실행
docker build -t leejeongyi/mysql-test:1.0 .
docker run --name mysql-test -d -v mysql_data:/var/lib/mysql -p 3307:3306 mysql
docker start mysql-test
# 9. Docker Hub 업로드
docker commit mysql-test leejeongyi/mysql-test:with-backup
docker push leejeongyi/mysql-test:with-backup
# 10. 컨테이너 및 이미지 삭제
docker rm -f mysql-test
docker rmi leejeongyi/mysql-test:with-backup
# 11. Hub에서 이미지 pull & 실행
docker pull leejeongyi/mysql-test:with-backup
docker run -d --name mysql-test-verify -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 leejeongyi/mysql-test:with-backup
docker exec -it mysql-test-verify mysql -uroot -proot