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: 컨ν μ΄λ κ° ν΅μ μ μν λΈλ¦¬μ§ λ€νΈμν¬ κ΅¬μ± π
sh
./compose-up.sh
μ λͺ
λ Ήμ΄λ₯Ό μ€ννλ©΄ docker-compose.ymlμ΄ μ€νλλ©°, λͺ¨λ 컨ν
μ΄λκ° μ€νλλ€. π
-
λ°±μ νμΌμ΄ μ μμ μΌλ‘ μ μ₯λλμ§ νμΈ:
ls -lh docker_compose_infra/backup/
cron μ€μ μ μν΄ 1λΆμ ν λ²μ© mysql λ°±μ νμΌμ μμ±ν΄μ€λ€.
-
λ°±μ λ‘κ·Έ νμΈ:
docker logs db_backup
1λΆμ ν λ²μ© λ‘κ·Έκ° λ¨λ κ±Έ λ³Ό μ μλ€!
[Warning]μ΄ λ¨λ μ΄μ
- cronμ΄ μ€νμν€λ backup.sh νμΌμ ν¨μ€μλλ₯Ό νλμ½λ© ν΄λ¬μ κ·Έλ λ€.
- νκ²½λ³μλ‘ μμ νλ©΄ μ€λ₯κ° λ¨μ§ μλλ€!
#!/bin/bash
# docker_compose_infra ν΄λλ‘ μ΄λ
cd docker_compose_infra
# docker-compose.yml νμΌμ μ€ν
docker-compose up -dDocker Composeλ₯Ό μ€ννλ κ°λ¨ν μ€ν¬λ¦½νΈλ€.
#!/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 λλ ν 리μ μ μ₯ν΄μ€λ€. ποΈ
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 μ ν리μΌμ΄μ μ ν¨κ³Όμ μΌλ‘ 컨ν μ΄λννκ³ , λ°μ΄ν° λ°±μ μλνκΉμ§ ꡬνν μ μμλ€! π

