리눅스 서버를 운영하는 관리자나 개발자라면 누구나 한 번쯤 'Disk Full' 메시지와 함께 서버가 먹통이 되는 아찔한 경험을 하게 됩니다. 로그 파일이 감당할 수 없을 정도로 커졌거나, 나도 모르는 사이에 임시 파일이 쌓여 소중한 디스크 자원을 잠식하기 때문입니다.

오늘은 서버 용량 부족 문제를 해결하기 위해, 어떤 디렉토리가 용량을 많이 차지하고 있는지 범인을 찾아내는 핵심 명령어와 효율적인 관리 팁을 정리해 보겠습니다.


1. 전체 디스크 사용량 확인: df 명령어

가장 먼저 해야 할 일은 서버 전체의 디스크 상태를 파악하는 것입니다. 이때 사용하는 명령어가 df (disk free)입니다.

1.1 df -h 활용하기

단순히 df만 입력하면 바이트 단위로 출력되어 읽기 어렵습니다. -h (human-readable) 옵션을 추가하여 GB, MB 단위로 확인하세요.

Bash
 
df -h
  • Filesystem: 파티션 이름
  • Size: 전체 용량
  • Used: 사용 중인 용량
  • Avail: 남은 용량
  • Use%: 사용률 (이 수치가 90%를 넘었다면 즉시 조치가 필요합니다.)

2. 특정 디렉토리 용량 확인: du 명령어

어떤 파티션이 가득 찼는지 확인했다면, 이제 구체적으로 어떤 폴더가 범인인지 찾아야 합니다. 이때 du (disk usage) 명령어를 사용합니다.

2.1 하위 디렉토리별 용량 요약 (du -sh)

현재 디렉토리의 전체 합계 용량만 보고 싶을 때 사용합니다.

Bash
 
du -sh .

2.2 깊이 조절하여 확인하기 (--max-depth)

루트(/) 디렉토리부터 하위 1단계 폴더들의 용량을 한눈에 보고 싶을 때 유용합니다.

Bash
 
sudo du -h --max-depth=1 / | sort -hr
  • sort -hr: 용량이 큰 순서대로 정렬하여 출력합니다. 이 명령어를 통해 /var/log나 /tmp 중 어디가 문제인지 바로 파악할 수 있습니다.

3. 리눅스 서버의 용량 도둑, 주요 타겟 3곳

디스크 용량을 많이 잡아먹는 대표적인 디렉토리는 보통 정해져 있습니다.

3.1 /var/log (시스템 및 서비스 로그)

애플리케이션의 디버그 로그가 무한정 쌓이거나, syslog가 거대해지는 경우가 많습니다.

  • 해결책: logrotate 설정을 통해 오래된 로그는 압축하거나 삭제하도록 설정하세요.

3.2 /tmp (임시 파일)

시스템이나 프로그램이 실행 중에 생성한 임시 파일들이 삭제되지 않고 남는 경우입니다.

  • 해결책: 재부팅 시 자동으로 삭제되거나, 주기적으로 오래된 파일을 정리하는 스크립트를 실행하세요.

3.3 Docker 관련 데이터 (/var/lib/docker)

도커를 사용 중이라면 사용하지 않는 이미지, 컨테이너, 볼륨이 상당한 용량을 차지합니다.

  • 해결책: 아래 명령어로 쓰지 않는 자원을 일괄 정리하세요.
Bash
 
docker system prune -a --volumes

4. 실무 꿀팁: 큰 파일 한 번에 찾기 (find)

디렉토리 단위가 아니라, 특정 크기(예: 500MB) 이상의 '대용량 파일'만 골라내고 싶을 때 find 명령어가 제격입니다.

Bash
 
sudo find / -type f -size +500M -exec ls -lh {} \;

이 명령어는 전체 파일 시스템에서 500MB가 넘는 파일들의 목록과 상세 정보를 출력해 줍니다.


5. 결론: 예방이 최선의책입니다

디스크 용량 문제는 서비스 중단으로 이어지는 치명적인 사고입니다. 사고가 터진 후 대응하는 것도 중요하지만, 모니터링 시스템(Prometheus, Grafana 등)을 구축하여 사용률이 80%를 넘을 때 알람을 받도록 설정하는 것이 가장 바람직합니다.

애플리케이션을 개발하다 보면 데이터베이스 접속 정보, 외부 API 키, 인증 토큰 등 외부로 노출되어서는 안 되는 민감한 정보를 다루게 됩니다. 도커(Docker) 컨테이너 환경에서는 이러한 설정을 어떻게 관리하느냐가 전체 시스템의 보안 수준을 결정합니다.

오늘은 입문자가 가장 많이 실수하는 부분부터, 현업에서 권장하는 .env 파일을 활용한 환경 변수 관리 및 보안 전략을 상세히 알아보겠습니다.


1. 환경 변수 관리가 중요한 이유

코드 내부에 비밀번호나 API 키를 직접 입력(Hard-coding)하는 것은 매우 위험합니다. 코드가 GitHub와 같은 원격 저장소에 올라가는 순간, 전 세계 누구나 내 서버의 권한을 탈취할 수 있기 때문입니다.

도커 환경에서 환경 변수를 분리하여 관리하면 다음과 같은 이점이 있습니다.

  • 보안성 향상: 민감한 정보를 코드와 분리하여 저장합니다.
  • 유연성: 소스 코드를 수정하지 않고도 개발(Dev), 테스트(Test), 운영(Prod) 환경에 맞는 설정을 즉시 적용할 수 있습니다.
  • 협업 효율: 팀원 간에 공통된 설정 형식을 공유하면서도 개인별 환경에 맞게 조정이 가능합니다.

2. .env 파일 작성 및 도커 연동

가장 대중적인 방법은 프로젝트 루트 디렉토리에 .env 파일을 만드는 것입니다.

2.1 .env 파일 예시

Plaintext
 
# 데이터베이스 설정
DB_HOST=db.example.com
DB_USER=admin
DB_PASSWORD=your_secret_password_1234

# API 키
STRIPE_API_KEY=sk_test_51Mz...

2.2 Docker Run 명령어로 전달하기

컨테이너를 실행할 때 --env-file 옵션을 사용하여 파일의 내용을 한 번에 주입할 수 있습니다.

Bash
 
docker run --env-file .env my-application-image

2.3 Docker Compose에서 활용하기

docker-compose.yml 파일을 사용하면 더 직관적인 관리가 가능합니다.

YAML
 
version: '3.8'
services:
  web:
    image: my-app:latest
    env_file:
      - .env
    ports:
      - "8080:8080"

3. 절대로 잊지 말아야 할 보안 수칙

환경 변수 파일을 사용한다고 해서 보안이 완성되는 것은 아닙니다. 아래 두 가지는 반드시 실천해야 합니다.

3.1 .gitignore에 추가하기

.env 파일이 Git 저장소에 포함되지 않도록 반드시 제외 처리해야 합니다.

Plaintext
 
# .gitignore 파일 내용
.env
.env.local
.env.*.local

3.2 샘플 파일 제공 (.env.example)

팀원들이 어떤 환경 변수가 필요한지 알 수 있도록, 실제 값은 비워두고 키 이름만 적어둔 예시 파일을 공유하는 것이 매너입니다.

Plaintext
 
# .env.example (이 파일은 Git에 올려도 안전합니다)
DB_HOST=
DB_USER=
DB_PASSWORD=

4. 고급 보안 기법: Docker Secrets

만약 단순한 .env 파일을 넘어 더 강력한 보안이 필요하다면 Docker Secrets 기능을 고려해 볼 수 있습니다. 이는 Docker Swarm 모드에서 지원하는 기능으로, 변수 값을 메모리에만 저장하고 디스크에는 암호화하여 보관합니다.

  1. 민감한 정보를 Docker Secret으로 등록합니다.
  2. 컨테이너 실행 시 필요한 서비스에만 해당 Secret을 마운트합니다.
  3. 컨테이너 내부의 /run/secrets/ 경로에서 파일을 읽어 사용합니다.

5. 결론: 안전한 배포를 위한 첫걸음

도커 컨테이너 환경에서 환경 변수를 올바르게 관리하는 것은 '선택'이 아닌 '필수'입니다.

  1. 변수는 파일로 분리하고,
  2. Git 업로드를 방지하며,
  3. **상황에 맞는 도구(Docker Compose, Secrets)**를 선택하는 습관을 들이세요.

+ Recent posts