티스토리 뷰
1. 문제 발생: 도커 볼륨이 꽉 참
Docker로 서버를 운영하다가 볼륨이 가득 차는 문제가 발생했다. 볼륨이 꽉 차면 새 컨테이너를 실행하거나 Docker 관련 작업을 할 수 없게 되기에 빠른 해결이 필요했다.
처음에는 이 문제가 Redis의 데이터를 저장하는 볼륨 때문이라고 생각했다. Redis는 데이터를 저장해야 하므로 볼륨을 사용하는데, 혹시 불필요한 볼륨이 계속 생성되고 있는 게 아닐까 의심이 되었다.
그러나 원인은 다른 곳에 있었다!
2. 원인 발견: 서버 실행 시 익명 볼륨 생성
Redis 문제를 확인하던 중, 예상치 못한 곳에서 진짜 원인을 발견했다. 서버 컨테이너 실행 시 사용된 -v /app 옵션이 불필요한 익명 볼륨을 계속 생성하고 있었다.
docker run -d --name ${server_name}-${green_port} --network $network_name -v /app -p ${green_port}:8080 -e TZ=Asia/Seoul ${user_name}/${server_name}
Docker에서 -v /app처럼 마운트 경로만 지정하고 볼륨 이름을 명시하지 않으면, 익명 볼륨이 자동으로 생성된다. 익명 볼륨은 컨테이너를 삭제해도 남아있기 때문에 시간이 지나면서 쌓여 디스크 용량을 차지하게 된 것이다.
3. 해결 방법: 두 가지 접근법
문제를 해결하기 위해 두 가지 방안을 생각해보았다.
방법 1: 네임드 볼륨 지정
익명 볼륨 대신 네임드 볼륨을 사용하면 문제가 해결된다. 네임드 볼륨은 이름을 지정하기 때문에 불필요하게 계속 생성되지 않으며, 필요할 때 관리가 더 쉽다.
네임드 볼륨 사용 예시
docker run -d --name ${server_name}-${green_port} --network $network_name -v kkum_volume:/app -p ${green_port}:8080 -e TZ=Asia/Seoul ${user_name}/${server_name}
- 이 방법을 사용하면 kkum_volume이라는 이름의 볼륨이 한 번만 생성된다.
- 이후 동일한 컨테이너를 실행하거나 재시작할 때 새로운 볼륨이 생성되지 않고, 기존의 kkum_volume을 재사용한다.
방법 2: 볼륨 사용 제거
서버 컨테이너 실행 시 볼륨이 필요하지 않다면, 아예 -v 옵션을 제거할 수도 있다. 이렇게 하면 볼륨이 생성되지 않으므로 익명 볼륨 문제도 완전히 사라지게 된다.
수정된 코드 (볼륨 사용 제거)
docker run -d --name ${server_name}-${green_port} --network $network_name -p ${green_port}:8080 -e TZ=Asia/Seoul ${user_name}/${server_name}
이 방법은 서버 컨테이너가 볼륨 없이도 정상적으로 동작할 경우에 적합하다.
4. 선택: 방법 2 채택
우리 서비스는 서버 컨테이너에서 데이터를 보존하거나 마운트할 필요가 없었기 때문에, 방법 2를 선택했다. -v 옵션을 제거하여 더 이상 익명 볼륨이 생성되지 않도록 스크립트를 수정했다.
5. 기존 불필요한 익명 볼륨 삭제
이후, 기존에 생성된 익명 볼륨들을 정리하기 위해 prune 명령을 사용했다:
docker volume prune
docker volume prune 명령은 더 이상 사용되지 않는(dangling) 볼륨을 모두 삭제한다. 이를 통해 기존에 쌓여 있던 익명 볼륨을 제거하고 디스크 공간을 확보했다!
6. 최종 결과: 스크립트 수정 완료 및 문제 해결
수정 전 (익명 볼륨 생성)
docker run -d --name ${server_name}-${green_port} --network $network_name -v /app -p ${green_port}:8080 -e TZ=Asia/Seoul ${user_name}/${server_name}
수정 후 (볼륨 사용 제거)
docker run -d --name ${server_name}-${green_port} --network $network_name -p ${green_port}:8080 -e TZ=Asia/Seoul ${user_name}/${server_name}
이제 서버 실행 시 불필요한 익명 볼륨이 더 이상 생성되지 않는다 ㅎㅎ!
결론
이 경험을 통해 Docker 볼륨 사용의 중요성을 다시 한 번 깨달을 수 있었다. 볼륨이 필요하지 않은 경우, 불필요한 옵션을 제거하는 것만으로도 Docker 환경을 더 효율적으로 관리할 수 있다. 앞으로도 상황에 맞는 볼륨 사용 전략을 세워 문제를 예방해야겠다!
- Total
- Today
- Yesterday
- SQL 레벨업
- 영속
- 인텔리제이
- 자바 스프링
- 로깅
- 커뮤니티
- 비영속
- DP
- 회원탈퇴
- 준영속
- 다이나믹 프로그래밍
- 웹MVC
- 웹 MVC
- 백준 파이썬
- 스프링 커뮤니티
- 백준
- SQLD
- EnumType.ORDINAL
- SQL
- 파이썬
- 스프링부트
- elasticsearch
- JPA
- 로그아웃
- 북마크
- 자바
- 스프링 북마크
- 프론트엔드
- 지연로딩
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |