Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

5 Commits
Β 
Β 

Repository files navigation

πŸš€ μžλ™ν™”λœ MySQL 데이터 보호 μ‹œμŠ€ν…œ ꡬ좕

πŸ“Œ ν”„λ‘œμ νŠΈ κ°œμš”

Docker Composeλ₯Ό μ΄μš©ν•˜μ—¬ MySQLκ³Ό Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰ν•˜κ³ , 1λΆ„λ§ˆλ‹€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ°±μ—…ν•΄μ£ΌλŠ” μžλ™ν™” μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜λŠ” 것이 λͺ©ν‘œλ‹€. πŸ› οΈ

  • docker-compose.yml을 μ΄μš©ν•΄ λ°μ΄ν„°λ² μ΄μŠ€μ™€ λ°±μ—…, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ»¨ν…Œμ΄λ„ˆν™” πŸ’Ύ
  • jpa.jar μžλ™ μ‹€ν–‰μœΌλ‘œ Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ 🌱
  • backup.sh & cron을 ν™œμš©ν•œ 1λΆ„ λ‹¨μœ„ MySQL μžλ™ λ°±μ—… πŸ•
  • Docker λ„€νŠΈμ›Œν¬λ₯Ό ν™œμš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆ κ°„ 톡신 μ΅œμ ν™” 🌐

πŸ“‚ ν”„λ‘œμ νŠΈ ꡬ쑰

.
β”œβ”€β”€ docker_compose_infra/    # Docker 및 λ°±μ—… κ΄€λ ¨ 파일 폴더
β”‚   β”œβ”€β”€ Dockerfile.web       # Spring Boot μ»¨ν…Œμ΄λ„ˆ λΉŒλ“œ 파일
β”‚   β”œβ”€β”€ Dockerfile.backup    # DB λ°±μ—… μ»¨ν…Œμ΄λ„ˆ λΉŒλ“œ 파일
β”‚   β”œβ”€β”€ docker-compose.yml   # μ„œλΉ„μŠ€ ꡬ성 파일
β”‚   β”œβ”€β”€ backup.sh            # MySQL λ°±μ—… 슀크립트
β”‚   β”œβ”€β”€ jpa.jar              # Spring Boot μ‹€ν–‰ 파일
β”‚   β”œβ”€β”€ backup/              # λ°±μ—… 파일 μ €μž₯ 디렉토리
β”œβ”€β”€ compose-up.sh            # Docker Compose μ‹€ν–‰ 슀크립트

πŸ› οΈ 기술 μŠ€νƒ

  • Docker: μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 🐳
  • MySQL 8.0: λ°μ΄ν„°λ² μ΄μŠ€ 관리 μ‹œμŠ€ν…œ πŸ—„οΈ
  • Spring Boot: λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬ β˜•
  • Cron & Shell Script: μžλ™ λ°±μ—… μŠ€μΌ€μ€„λ§ 및 μŠ€ν¬λ¦½νŒ… ⏳
  • Docker Network: μ»¨ν…Œμ΄λ„ˆ κ°„ 톡신을 μœ„ν•œ λΈŒλ¦¬μ§€ λ„€νŠΈμ›Œν¬ ꡬ성 🌐

πŸ—οΈ μ„€μΉ˜ 및 μ‹€ν–‰ 방법

1️⃣ Docker Compose μ‹€ν–‰

sh
./compose-up.sh

μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ docker-compose.yml이 μ‹€ν–‰λ˜λ©°, λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λœλ‹€. πŸš€

2️⃣ λ°±μ—… μ‹œμŠ€ν…œ λ™μž‘ 확인

  1. λ°±μ—… 파일이 μ •μƒμ μœΌλ‘œ μ €μž₯λ˜λŠ”μ§€ 확인:

    ls -lh docker_compose_infra/backup/

    image

    cron 섀정에 μ˜ν•΄ 1뢄에 ν•œ λ²ˆμ”© mysql λ°±μ—… νŒŒμΌμ„ 생성해쀀닀.

  2. λ°±μ—… 둜그 확인:

    docker logs db_backup

    image

    1뢄에 ν•œ λ²ˆμ”© λ‘œκ·Έκ°€ λœ¨λŠ” κ±Έ λ³Ό 수 μžˆλ‹€!

    [Warning]이 λœ¨λŠ” 이유

    • cron이 μ‹€ν–‰μ‹œν‚€λŠ” backup.sh νŒŒμΌμ— νŒ¨μŠ€μ›Œλ“œλ₯Ό ν•˜λ“œμ½”λ”© ν•΄λ‘¬μ„œ κ·Έλ ‡λ‹€.
    • ν™˜κ²½λ³€μˆ˜λ‘œ μˆ˜μ •ν•˜λ©΄ 였λ₯˜κ°€ λœ¨μ§€ μ•ŠλŠ”λ‹€!

πŸ“ μ£Όμš” 파일 μ„€λͺ…

πŸ”Ή compose-up.sh

#!/bin/bash

# docker_compose_infra ν΄λ”λ‘œ 이동
cd docker_compose_infra

# docker-compose.yml νŒŒμΌμ„ μ‹€ν–‰
docker-compose up -d

Docker Composeλ₯Ό μ‹€ν–‰ν•˜λŠ” κ°„λ‹¨ν•œ μŠ€ν¬λ¦½νŠΈλ‹€.

πŸ”Ή backup.sh

#!/bin/sh
DB_NAME=fisa
DB_USER=${MYSQL_USER}
DB_PASSWORD=${MYSQL_PASSWORD}
BACKUP_DIR=/backup
MYSQL_HOST=mysqldb2

mkdir -p $BACKUP_DIR
BACKUP_FILE="$BACKUP_DIR/$DB_NAME-$(date +%Y%m%d%H%M%S).sql"
mysqldump -h $MYSQL_HOST -u $DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE

echo "Backup completed: $BACKUP_FILE"

1λΆ„λ§ˆλ‹€ μ‹€ν–‰λ˜λ©° MySQL 데이터λ₯Ό λ€ν”„ν•˜μ—¬ /backup 디렉토리에 μ €μž₯ν•΄μ€€λ‹€. πŸ—‚οΈ

πŸ”Ή docker-compose.yml

services:
  db:
    container_name: mysqldb2
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
      - spring-mysql-net
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 -u root --password=$${MYSQL_ROOT_PASSWORD} || exit 1']
      interval: 10s
      timeout: 2s
      retries: 100
  
  db_backup:
    container_name: db_backup
    build:
      context: ./docker_compose_infra
      dockerfile: Dockerfile.backup
    volumes:
      - ./docker_compose_infra/backup:/backup
      - db_data:/var/lib/mysql
    depends_on:
      db:
        condition: service_healthy
    networks:
      - spring-mysql-net

  app:
    container_name: springbootapp
    build:
      context: ./docker_compose_infra
      dockerfile: Dockerfile.web
    ports:
      - "8080:8080"
    environment:
      MYSQL_HOST: db
      MYSQL_PORT: 3306
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    depends_on:
      db:
        condition: service_healthy
    networks:
      - spring-mysql-net

   app2:
     container_name: springbootapp2
     build:
       context: ./docker_compose_infra
       dockerfile: Dockerfile.web
     ports:
       - "8088:8080"
     environment:
       MYSQL_HOST: db
       MYSQL_PORT: 3306
       MYSQL_DATABASE: ${MYSQL_DATABASE}
       MYSQL_USER: ${MYSQL_USER}
       MYSQL_PASSWORD: ${MYSQL_PASSWORD}
     depends_on:
       db:
         condition: service_healthy
     networks:
       - spring-mysql-net

networks:
  spring-mysql-net:
    driver: bridge

volumes:
  db_data:

db

  • μ›Ή μ„œλ²„μ™€ ν†΅μ‹ ν•˜λŠ” MySQL μ»¨ν…Œμ΄λ„ˆ πŸ—„οΈ
  • docker volume을 μ‚¬μš©ν•˜μ—¬ μƒμ‹œ 백업을 μ§„ν–‰ν•œλ‹€. πŸ’Ύ

db_backup

  • λ§€ λΆ„λ§ˆλ‹€ mysql을 덀프 μ‹œμΌœμ„œ λ°±μ—… ν•΄μ£ΌλŠ” μ»¨ν…Œμ΄λ„ˆ πŸ•

  • Dockerfile.backupλ₯Ό 톡해 λΉŒλ“œλœλ‹€. πŸ”¨

    Dockerfile.backup
    
    FROM oraclelinux:9
    
    # ν•„μš”ν•œ νŒ¨ν‚€μ§€ μ„€μΉ˜
    RUN dnf install -y mysql curl bash cronie && \
        dnf clean all
     
    # λ°±μ—… 슀크립트 볡사
    COPY backup.sh /usr/local/bin/backup.sh
    RUN chmod +x /usr/local/bin/backup.sh
     
    # cron μ„€μ •
    RUN touch /var/log/cron.log && \
       echo "* * * * * root /usr/local/bin/backup.sh >> /var/log/cron.log 2>&1" >> /etc/crontab
     
    # cron μ‹€ν–‰
    CMD ["crond", "-n"]
    
    • 🐧oraclelinux:9을 μ‚¬μš©ν•œ 이유

      • sh νŒŒμΌμ„ cron을 μ‚¬μš©ν•΄ μ‹€ν–‰ μ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” cron κΈ°λŠ₯이 ν¬ν•¨λœ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ€˜μ•Ό ν•œλ‹€.
      • MySQL:8.0은 νŒ¨ν‚€μ§€ μ„€μΉ˜ νˆ΄μ„ μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— νŒ¨ν‚€μ§€ μ„€μΉ˜ 툴이 μžˆλŠ” oraclelinux:9을 μ‚¬μš©ν–ˆλ‹€. 🐳
  • μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ backup.shλ₯Ό crontab을 μ‚¬μš©ν•΄ λ§€ λΆ„λ§ˆλ‹€ μ‹€ν–‰ν•΄μ€€λ‹€. ⏳

app, app2

  • μ›Ή μ„œλ²„ μ»¨ν…Œμ΄λ„ˆ 🌐

  • Dockerfile.web을 톡해 λΉŒλ“œλœλ‹€. πŸ”§

    Dockerfile.web
    
    FROM eclipse-temurin:17-jre-alpine
    WORKDIR /app
    COPY --from=0 /app/app.jar app.jar
    
    ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=75.0", "-jar", "app.jar"]
    
    • 🐧jdkκ°€ μ•„λ‹Œ jreλ₯Ό μ‚¬μš©ν•œ 이유

      • jdkλŠ” 개발 도ꡬ가 ν¬ν•¨λ˜μ–΄ μžˆμ–΄ jre에 λΉ„ν•΄ 무겁닀. πŸ‹οΈβ€β™‚οΈ λ”°λΌμ„œ jre둜 λΉŒλ“œλ₯Ό ν•˜λ©΄ 이미지 μš©λŸ‰μ΄ κ°€λ²Όμ›Œμ§„λ‹€. πŸ’¨
  • 각 μ›Ή μ„œλ²„λŠ” ν˜ΈμŠ€νŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” 포트λ₯Ό λ‹€λ₯΄κ²Œ ν•΄μ€˜μ•Ό 포트 좩돌이 μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€. ⚑

    • app -> 8080 🎯
    • app2 -> 8088 🎯

λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλŠ” Docker λ„€νŠΈμ›Œν¬ spring-mysql-net을 μƒμ„±ν•œ λ’€ ν•΄λ‹Ή λ„€νŠΈμ›Œν¬ 내뢀에 λ°°μΉ˜ν•΄μ€€λ‹€. 🌐


🎯 마무리

이 ν”„λ‘œμ νŠΈλ₯Ό 톡해 MySQLκ³Ό db_backupμ„œλ²„, Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 효과적으둜 μ»¨ν…Œμ΄λ„ˆν™”ν•˜κ³ , 데이터 λ°±μ—… μžλ™ν™”κΉŒμ§€ κ΅¬ν˜„ν•  수 μžˆμ—ˆλ‹€! πŸš€

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors