EC2 인스턴스 용량 문제 해결

윤준혁·2024년 7월 21일

문제 상황

  • Jenkins 빌드 중 EC2 인스턴스에 용량이 부족하다는 메시지가 출력됨
  • 이전 빌드들은 정상적으로 작동되었지만, 갑작스럽게 용량 부족 메시지가 나타남

원인 분석

  • 'df -h' 명령어를 사용하여 EC2 인스턴스 내부의 디스크 용량을 확인해보니 디스크가 거의 가득 참
  • Dcoker 이미지가 지속적으로 쌓이고, 삭제되지 않아 디스크 공간을 차지하고 있음

초기 대응

  1. EC2 인스턴스의 EBS 볼륨 크기를 4GB 정도 증가시켜서 임시적으로 디스크 공간을 확보

일단 해당 빌드는 다시 실행시켜서 공간 부족 메시지가 출력되지 않음

  1. 불필요한 Docker 이미지를 삭제하여 디스크 공간을 확보

docker image prune -a -f

해결 방법

  • Jenkinsfile의 파이프라인을 수정하여 매 빌드 시 사용하지 않는 Docker 이미지를 자동으로 삭제하도록 설정
stage('Clean Up Docker Containers and Volumes') {
    steps {
        sshagent(['my-ssh-key']) {
            sh '''
                ssh -o StrictHostKeyChecking=no ubuntu@{my_public_DNS} "
                    sudo docker-compose down -v
                    sudo docker system prune -a -f
                "
            '''
        }
    }
}

결과

  • 위의 해결 방법을 적용한 후, Jenkins 빌드가 정상적으로 완료
  • Docker 이미지가 지속적으로 관리되므로 디스크 용량이 부족해지는 문제도 사라짐

개선 방향

  1. 'docker-compose down -v' 명령어 수행 후 'docker system prune -a -f' 명령어를 수행하면 모든 Docker 이미지와 볼륨이 삭제됨. 실제 프로덕션 환경에서 배포하게 된다면 무조건 개선해야함

docker-compose.yml에 데이터베이스 볼륨을 명시적으로 관리, 삭제하지 않도록 설정(docker-compose.yml 예시)

version: '3.8'
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
  web:
    image: my-web-app
    depends_on:
      - db
volumes:
  db_data:

데이터베이스 볼륨을 삭제하기 전에 백업을 수행하고, 재구축 후에 복원(백업 및 복원 예시 스크립트)

docker exec db_container_name mysqldump -u root --password=root database_name > backup.sql
docker-compose down -v
sudo docker system prune -a -f
docker-compose up -d
docker exec -i db_container_name mysql -u root --password=root database_name < backup.sql
  1. 모든 파일을 삭제하고, 다시 설치하기 때문에 빌드 시간이 너무 많이 소요됨

Docker 이미지를 삭제하지 않고, 최신 상태로 유지하여 시간 단축(Jenkinsfile 예시)

pipeline {
    agent any
    stages {
        stage('Clean Up') {
            steps {
                script {
                    sh 'docker-compose down'
                    sh 'docker image prune -f'
                }
            }
        }
        stage('Update Images') {
            steps {
                script {
                    sh 'docker-compose pull'
                }
            }
        }
        stage('Build and Deploy') {
            steps {
                script {
                    sh 'docker-compose up -d'
                }
            }
        }
    }
}

0개의 댓글