[시놀로지 Docker] 실행 중지된 컨테이너에서 파일 가져오기
때로는 멈춰있거나 실행되지 않는 Docker 컨테이너에서 중요한 파일을 추출해야 하는 상황이 발생합니다. 특히 컨테이너가 충돌하거나 오류로 인해 시작할 수 없는 경우, 그 안에 있는 중요한 데이터나 로그 파일에 접근하는 것이 필요합니다. 이 글에서는 시놀로지 NAS에서 실행되지 않는 Docker 컨테이너의 파일을 안전하게 가져오는 방법을 상세히 알아보겠습니다.
1. 시놀로지 NAS에 SSH 접속하기
먼저, 시놀로지 NAS에 SSH로 접속합니다:
ssh admin@192.168.1.100
비밀번호를 입력하여 로그인합니다.
2. 모든 컨테이너 목록 확인하기
실행 중인 컨테이너뿐만 아니라 중지된 모든 컨테이너를 확인합니다:
sudo docker ps -a
출력 예시:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 tomcat:9.0 "catalina.sh run" 2 weeks ago Up 5 days 8080/tcp tomcat_webapp
f5e6d7c8b9a0 tomcat:8.5 "catalina.sh run" 3 weeks ago Exited (137) 2 weeks ago tomcat_old
여기서 f5e6d7c8b9a0는 현재 실행되지 않는 Tomcat 컨테이너입니다.
3. 중지된 컨테이너에서 파일 복사하기
docker cp 명령은 실행 중이지 않은 컨테이너에서도 파일을 복사할 수 있습니다:
sudo docker cp f5e6d7c8b9a0:/usr/local/tomcat/logs/catalina.out /volume1/docker/stopped_container_data/
복사 대상 디렉토리가 없다면 먼저 생성합니다:
mkdir -p /volume1/docker/stopped_container_data/
4. 디렉토리 전체 복사하기
특정 디렉토리 전체를 복사하려면:
sudo docker cp f5e6d7c8b9a0:/usr/local/tomcat/conf/ /volume1/docker/stopped_container_data/conf/
5. 일시적으로 컨테이너 시작 없이 파일 시스템 마운트하기
더 복잡한 경우, Docker의 내부 메커니즘을 활용하여 컨테이너의 파일 시스템에 접근할 수 있습니다:
# 새 임시 컨테이너 생성하여 중지된 컨테이너의 볼륨 마운트
sudo docker run --rm -it --volumes-from f5e6d7c8b9a0 -v /volume1/docker/recovery:/recovery alpine sh
# 알파인 리눅스 컨테이너 내부에서 실행할 명령
# 필요한 파일을 /recovery 디렉토리로 복사
cp -r /usr/local/tomcat/webapps /recovery/
cp -r /usr/local/tomcat/logs /recovery/
cp -r /usr/local/tomcat/conf /recovery/
# 작업이 완료되면 exit로 임시 컨테이너 종료
exit
이 방법은 Alpine Linux 같은 가벼운 이미지를 사용하여 임시 컨테이너를 만들고, 문제가 있는 컨테이너의 볼륨을 마운트하여 파일을 안전하게 추출합니다.
6. 컨테이너 이미지로부터 파일 추출하기
만약 컨테이너가 삭제되었지만 이미지는 남아있다면, 이미지로부터 파일을 추출할 수 있습니다:
# 이미지에서 임시 컨테이너 생성 (시작하지 않음)
sudo docker create --name temp_container tomcat:8.5
# 파일 복사
sudo docker cp temp_container:/usr/local/tomcat/conf/server.xml /volume1/docker/image_extraction/
# 임시 컨테이너 삭제
sudo docker rm temp_container
7. Docker 볼륨 데이터 직접 접근하기
Docker 볼륨을 사용했다면, 시놀로지 파일 시스템에서 직접 접근할 수 있습니다:
# 볼륨 목록 확인
sudo docker volume ls
# 특정 컨테이너의 볼륨 정보 확인
sudo docker inspect -f '{{ json .Mounts }}' f5e6d7c8b9a0 | python -m json.tool
볼륨 경로를 확인한 후 직접 접근:
# 볼륨 데이터에 직접 접근
ls -la /volume1/docker/volumes/tomcat_webapps/_data/
8. 실행 불가능한 손상된 컨테이너 처리하기
컨테이너가 너무 손상되어 일반적인 방법으로 접근할 수 없는 경우, Docker의 저수준 기능을 활용합니다:
# 컨테이너의 저장소 위치 찾기
CONTAINER_DIR=$(sudo docker inspect -f '{{.GraphDriver.Data.MergedDir}}' f5e6d7c8b9a0)
# 직접 파일 시스템 접근 (root 권한 필요)
sudo ls -la $CONTAINER_DIR/usr/local/tomcat/
# 파일 복사
sudo cp -r $CONTAINER_DIR/usr/local/tomcat/webapps /volume1/docker/recovery/
이 방법은 시놀로지 Docker 구현에 따라 접근 경로가 다를 수 있으므로 주의해야 합니다.
9. 컨테이너 커밋 후 이미지에서 파일 추출하기
중지된 컨테이너를 이미지로 변환한 후 파일을 추출하는 방법도 있습니다:
# 중지된 컨테이너를 이미지로 커밋
sudo docker commit f5e6d7c8b9a0 recovery_image
# 새 이미지로 임시 컨테이너 실행 및 파일 추출
sudo docker run --rm -it -v /volume1/docker/recovery:/recovery recovery_image sh -c "cp -r /usr/local/tomcat/logs /recovery/"
# 복구 작업이 끝나면 임시 이미지 삭제
sudo docker rmi recovery_image
10. 자동 복구 스크립트 생성하기
자주 필요한 작업이라면 자동화 스크립트를 만들어 사용할 수 있습니다:
#!/bin/bash
# 파일명: /volume1/scripts/recover_container_files.sh
# 변수 설정
CONTAINER_ID=$1
TARGET_DIR=$2
SOURCE_PATH=$3
# 사용법 검사
if [ -z "$CONTAINER_ID" ] || [ -z "$TARGET_DIR" ] || [ -z "$SOURCE_PATH" ]; then
echo "사용법: $0 <컨테이너ID> <대상디렉토리> <소스경로>"
echo "예: $0 f5e6d7c8b9a0 /volume1/backup /usr/local/tomcat/logs"
exit 1
fi
# 대상 디렉토리 생성
mkdir -p $TARGET_DIR
# 컨테이너 상태 확인
CONTAINER_STATE=$(sudo docker inspect -f '{{.State.Running}}' $CONTAINER_ID 2>/dev/null)
if [ $? -ne 0 ]; then
echo "컨테이너 $CONTAINER_ID를 찾을 수 없습니다."
exit 1
fi
echo "컨테이너 $CONTAINER_ID에서 $SOURCE_PATH의 파일을 $TARGET_DIR로 복사합니다..."
# 파일 복사 시도
sudo docker cp $CONTAINER_ID:$SOURCE_PATH $TARGET_DIR/
# 결과 확인
if [ $? -eq 0 ]; then
echo "파일 복사가 완료되었습니다. 저장 위치: $TARGET_DIR"
exit 0
else
echo "직접 복사 실패. 대체 방법 시도..."
# 임시 컨테이너 사용하여 복구 시도
echo "임시 컨테이너를 생성하여 파일 복구 중..."
SOURCE_DIR=$(dirname $SOURCE_PATH)
SOURCE_NAME=$(basename $SOURCE_PATH)
sudo docker run --rm -it --volumes-from $CONTAINER_ID -v $TARGET_DIR:/recovery alpine sh -c "cp -r $SOURCE_PATH /recovery/ && echo '복구 완료'"
if [ $? -eq 0 ]; then
echo "대체 방법으로 파일 복구 성공!"
else
echo "모든 복구 방법 실패. 수동 조치가 필요합니다."
exit 2
fi
fi
스크립트를 실행 가능하게 만들고 사용합니다:
chmod +x /volume1/scripts/recover_container_files.sh
/volume1/scripts/recover_container_files.sh f5e6d7c8b9a0 /volume1/docker/recovery /usr/local/tomcat/logs
실행되지 않는 Docker 컨테이너에서 중요한 파일을 추출하는 다양한 방법을 살펴보았습니다. 시놀로지 NAS에서 이러한 기술을 활용하면 시스템 장애나 컨테이너 문제 발생 시에도 중요한 데이터를 안전하게 복구할 수 있습니다. 실제 운영 환경에서는 미리 이러한 복구 방법을 숙지하고, 가능하다면 정기적인 백업을 통해 데이터 손실 위험을 최소화하는 것이 중요합니다.
'NAS' 카테고리의 다른 글
[시놀로지 Docker] SSH로 Tomcat 컨테이너 내부 파일 가져오기1 (1) | 2025.05.07 |
---|---|
시놀로지 NAS에 SSL 인증서 적용하기 (1) | 2025.05.05 |
[시놀로지 Docker] SSH로 Tomcat 컨테이너 내부 접근하기 - 실전 가이드 (2) | 2025.05.05 |