Volumes and Mounts
한국어 원문으로 표시합니다.
이 실습은 진짜 VM 에서 돕니다
이 상자는 파드가 아니라 KubeVirt 가 띄운 가상머신입니다. 리눅스 커널이
따로 돌고 systemd 가 실제로 서비스를 관리하며, docker 는 흉내가 아니라
진짜 도커 엔진입니다. docker run 으로 띄운 컨테이너는 실제로 프로세스가
되고 docker exec 도 docker logs 도 그대로 동작합니다.
예전에는 이 실습이 파드 안에서 돌았습니다. 커널 권한을 전부 내려놓은 상자라 컨테이너를 띄우는 단계가 막혀 있었고, 그래서 이미지 아카이브를 직접 풀어 보는 우회로 배웠습니다. 이제 우회가 필요 없습니다.
알아 둘 것이 둘 있습니다.
- 처음 뜨는 데 1분 남짓 걸립니다. VM 이 부팅하고 도커를 설치하기 때문입니다. 파드 실습(보통 40초)보다 느립니다.
- 브라우저 미리보기가 없습니다. VM 으로 들어오는 연결은 채점 포트
하나만 열려 있습니다. 웹 서버를 띄웠다면 VM 안에서
curl로 확인하세요.
목표
볼륨·바인드·읽기 전용 마운트를 직접 만들어 보고, 컨테이너를 지워도 데이터가 남는다는 것과 백업·복원이 왕복 가능하다는 것을 확인합니다.
왜 중요한가
"컨테이너는 상태를 갖지 않는다"는 말은 컨테이너가 상태를 다루지 못한다는 뜻이 아니라, 상태를 컨테이너 밖에 두라는 뜻입니다. 이 구분을 못 하면 재배포마다 데이터가 사라지거나, 반대로 볼륨이 눈덩이처럼 쌓여도 아무도 지우지 못하는 상태가 됩니다. 또 하나. 읽기 전용 마운트는 성능이 아니라 의도의 선언입니다. 이 컨테이너가 무엇을 쓰면 안 되는지 매니페스트에 적어 두면, 나중에 그 규칙을 어기는 코드가 배포되는 순간 조용히 넘어가지 않고 오류로 드러납니다.
단계
/root/ops1을 만들고,dk-data라는 이름 있는 볼륨을 만듭니다.dk-writer라는 컨테이너로dk-data를/data에 마운트해/data/hello.txt에volume-alive를 씁니다.dk-writer컨테이너를 삭제한 뒤, 새 컨테이너로 같은 볼륨을 읽어 내용이 남아 있는지 확인하고 그 출력을/root/ops1/persist.txt로 저장합니다./root/ops1/site/index.html을 만들어labhub-site를 넣고,nginx:1.27-alpine을dk-site라는 이름으로 띄우되/root/ops1/site를/usr/share/nginx/html에 바인드 마운트합니다.dk-ro컨테이너를 띄워dk-data를/data에 읽기 전용으로 마운트하고, 그 안에서 파일 쓰기를 시도해 나오는 오류 메시지를/root/ops1/ro-error.txt로 저장합니다.dk-site2컨테이너를--mount문법으로 띄워, 4단계와 같은 원본·대상으로 붙이되 읽기 전용으로 만듭니다.dk-data볼륨의 내용을/root/ops1/dk-data.tgz로 백업합니다. 아카이브 안에hello.txt가 들어 있어야 합니다.dk-data-restore라는 새 볼륨을 만들어 백업을 복원합니다. 원본과 내용이 같아야 합니다.
참고
- 임시 작업용 컨테이너는
docker run --rm으로 띄우면 뒤처리가 필요 없습니다. - 백업은
docker run --rm -v dk-data:/source:ro -v /root/ops1:/backup alpine:3.20 tar czf /backup/dk-data.tgz -C /source .형태입니다. - 흔한 실수 1: 5단계에서 컨테이너가 즉시 끝나 버리면 채점 대상이 남지 않습니다. 백그라운드로 계속 떠 있게 하세요.
- 흔한 실수 2: 7단계에서
-C없이 절대 경로째로 담으면 복원 시 경로가 어긋납니다.
이름 있는 볼륨 만들기
/root/ops1 을 만들고, dk-data 라는 이름 있는 볼륨을 만듭니다.
볼륨을 다루는 하위 명령 그룹이 따로 있습니다. 만들기만 하면 되고 아직 컨테이너는 필요 없습니다.
볼륨에 파일 쓰기
dk-writer 라는 컨테이너로 dk-data 를 /data 에 마운트해 /data/hello.txt 에 volume-alive 를 씁니다.
컨테이너를 띄워 볼륨을 마운트하고 파일을 씁니다. 이름을 붙여 두세요 — 다음 단계에서 그 이름을 지웁니다.
컨테이너를 지워도 남는가
dk-writer 컨테이너를 삭제한 뒤, 새 컨테이너로 같은 볼륨을 읽어 내용이 남아 있는지 확인하고 그 출력을 /root/ops1/persist.txt 로 저장합니다.
파일을 쓴 컨테이너를 지운 뒤 새 컨테이너로 같은 볼륨을 읽어 보세요. 확인한 내용을 파일로도 남깁니다.
호스트 디렉터리를 그대로 붙이기
/root/ops1/site/index.html 을 만들어 labhub-site 를 넣고, nginx:1.27-alpine 을 dk-site 라는 이름으로 띄우되 /root/ops1/site 를 /usr/share/nginx/html 에 바인드 마운트합니다.
바인드 마운트는 호스트 경로를 직접 지정합니다. nginx 의 기본 문서 루트 경로에 붙이면 바로 확인됩니다.
읽기 전용으로 붙이기
dk-ro 컨테이너를 띄워 dk-data 를 /data 에 읽기 전용으로 마운트하고, 그 안에서 파일 쓰기를 시도해 나오는 오류 메시지를 /root/ops1/ro-error.txt 로 저장합니다.
마운트 옵션에 읽기 전용 플래그를 붙이고, 안에서 쓰기를 시도해 나오는 오류 메시지를 그대로 저장하세요.
--mount 문법으로 다시 쓰기
dk-site2 컨테이너를 --mount 문법으로 띄워, 4단계와 같은 원본·대상으로 붙이되 읽기 전용으로 만듭니다.
짧은 문법과 같은 결과가 나와야 합니다. type, source, target, readonly 를 쉼표로 이어 씁니다.
볼륨 백업하기
dk-data 볼륨의 내용을 /root/ops1/dk-data.tgz 로 백업합니다. 아카이브 안에 hello.txt 가 들어 있어야 합니다.
볼륨과 백업 대상 디렉터리를 동시에 마운트한 임시 컨테이너를 씁니다. -C 로 소스 안으로 들어가야 경로가 깔끔합니다.
새 볼륨으로 복원하기
dk-data-restore 라는 새 볼륨을 만들어 백업을 복원합니다. 원본과 내용이 같아야 합니다.
새 볼륨을 만들고 아카이브를 풀어 넣으세요. 원본과 내용이 정확히 같아야 합니다.