DB & 로그 파일 복사
cd ~/criti-ai # 데이터베이스 파일 복사 docker cp criti-ai-backend:/app/data/criti-ai.db ./criti-ai.db # 로그 폴더 전체 복사 docker cp criti-ai-backend:/app/logs ./backend-logs # 파일 확인 ls -la criti-ai.db ls -la backend-logs/
도커 컨테이너는 프로젝트 코드가 있는 컴퓨터(Host)와는 분리된,
격리된 공간에 데이터가 저장됨
docker cp 명령어를 사용하는 이유는 컨테이너라는 "별도의 작은 컴퓨터" 안에 들어있는 파일을 밖으로 꺼내오기 위해서
데이터가 다른 곳에 저장되는 이유 (컨테이너의 격리)
도커 컨테이너를 "내 컴퓨터 안에 있는 투명한 유리 상자"라고 생각하시면 쉬움
- 유리 상자 (도커 컨테이너): 이 안에는 애플리케이션(백엔드 서버)과 그에 필요한 모든 것이 들어있음. 이 상자는 완전히 독립된 자신만의 파일 시스템을 가짐
- 내 컴퓨터 (호스트 머신): 터미널에서 명령어를 치고, 프로젝트 코드를 저장하는 실제 컴퓨터
애플리케이션이 컨테이너 안에서 실행되면, 데이터베이스 파일(
criti-ai.db)이나 로그 파일은 유리 상자 안의 /app/data나 /app/logs 폴더에 생성됨. 내 컴퓨터의
~/criti-ai 폴더에서는 이 파일들을 직접 볼 수 없음.docker cp는 이 유리 상자 밖에서 상자 안으로 팔을 뻗어 물건을 꺼내오는 것과 같은 역할 함명령어 분석
docker cp criti-ai-backend:/app/data/criti-ai.db ./criti-ai.dbcriti-ai-backend: 'criti-ai-backend'라는 이름의 유리 상자(컨테이너) 안에서:/app/data/criti-ai.db:/app/data/criti-ai.db경로에 있는 파일을./criti-ai.db: 내 컴퓨터의 현재 위치(.)로 복사
더 좋은 방법: 볼륨(Volume)
docker cp는 일회성으로 파일을 복사할 때 유용하지만, 매번 이렇게 하는 것은 번거로운데,더 중요한 문제는, 컨테이너를 삭제하면 그 안의 데이터베이스와 로그 파일도 함께 사라진다는 점임.
이를 해결하기 위한 표준적인 방법이 바로 볼륨(Volume)을 사용하는 것
볼륨은 유리 상자(컨테이너)의 특정 폴더와 내 컴퓨터(호스트)의 폴더를 서로 연결(mapping)하는 통로를 만드는 것과 같음
볼륨을 사용하면?
- 컨테이너의
/app/data폴더에 파일이 저장되면, 실시간으로 내 컴퓨터의 연결된 폴더에도 똑같이 저장됩니다.
- 더 이상 파일을 확인하기 위해
docker cp를 사용할 필요가 없고, 그냥 내 컴퓨터의 폴더를 확인하면 됨
- 컨테이너를 삭제하고 새로 만들어도, 데이터는 내 컴퓨터에 안전하게 보관되어 있으므로 데이터가 유실되지 않음
docker-compose.yml 설정
services: backend: # ... (기존 설정) volumes: # 형식: [내 컴퓨터(호스트) 경로]:[컨테이너 경로] - ./data:/app/data - ./logs:/app/logs
이렇게 설정하면, 프로젝트 폴더에
data, logs 폴더를 만들고 그 안에 데이터가 실시간으로 저장되어 편리하게 관리할 수 있음아래 방법은 네임드 볼륨 (
app_data:/app/data)도커에게 알아서
app_data라는 이름의 저장 공간을 만들고, 컨테이너의
/app/data에 연결하라고 도커에게 관리 위임하는 방식- 먼저 맨 아래
volumes섹션에서 볼륨 선언 이 부분은 도커에게app_data,redis_data,logs_data라는 이름의 네임드 볼륨 3개를 생성하라고 지시함

- 볼륨 연결 (
services내부volumes섹션)app_data:/app/data:backend컨테이너 내부의/app/data폴더를
app_data라는 네임드 볼륨과 연결→ 벡엔드 애플리케이션이
/app/data/criti-ai.db 파일을 생성하거나 수정하면, 그 데이터는 컨테이너가 아닌 app_data 볼륨에 실시간으로 저장됨

app_data: 백엔드의 데이터베이스 파일(criti-ai.db)이 저장됨backend서비스의/app/data폴더 ↔️app_data볼륨 연결
redis_data: Redis의 데이터(캐시 등)가 저장됨redis서비스의/data폴더 ↔️redis_data볼륨 연결
logs_data: 백엔드와 Nginx의 로그 파일이 함께 저장됨backend서비스의/app/logs폴더 ↔️logs_data볼륨 연결nginx서비스의/var/log/nginx폴더 ↔️logs_data볼륨 연결
네임드 볼륨은 도커가 관리하는 호스트의 특정 경로에 저장되고,
이 실제 경로 확인하려면 다음 명령어를 사용할 수 있음
docker volume inspect [볼륨이름]
app_data 볼륨의 실제 위치를 확인하려면 터미널에 아래와 같이 입력 (docker-compose는 보통
프로젝트폴더명_볼륨명 형태로 이름을 생성.)프로젝트 이름은 기본적으로
docker-compose.yml 파일이 위치한 디렉토리의 이름으로 결정docker volume inspect criti-ai_app_data

도커 볼륨 디렉토리는 루트(root) 권한이 필요하므로 명령어 앞에
sudo를 붙여야 함
허나 vs코드 ssh 연결 파일탐색기로 보면 안보이는데
터미널에서
sudo를 사용하면 잠시 관리자(root) 권한을 빌려와 파일을 볼 수 있지만, VS Code의 파일 탐색기는 현재 접속한
ubuntu 사용자의 기본 권한으로 작동하기 때문에 root가 소유한 폴더에 접근할 수 없음
때문에 맨 위처럼 복사해서 사용함
cd ~/criti-ai # 데이터베이스 파일 복사 docker cp criti-ai-backend:/app/data/criti-ai.db ./criti-ai.db # 로그 폴더 전체 복사 docker cp criti-ai-backend:/app/logs ./backend-logs # 파일 확인 ls -la criti-ai.db ls -la backend-logs/