소개
이 랩에서는 docker volume create 명령을 사용하여 Docker 에서 데이터 지속성을 효과적으로 관리하는 방법을 배우게 됩니다. 컨테이너 데이터를 저장하는 데 선호되는 방법인 기본 볼륨 생성의 기본적인 프로세스를 살펴볼 것입니다. 이는 바인드 마운트에 비해 Docker 에서 관리되고 백업/마이그레이션이 용이하기 때문입니다.
기본 사항을 바탕으로, 특정 드라이버와 옵션을 사용하여 동작을 맞춤 설정하는 볼륨을 생성하는 방법을 자세히 살펴보겠습니다. 또한, 이 랩에서는 사용자 지정 마운트 옵션을 사용하여 로컬 볼륨을 생성하는 방법을 안내하고, 다양한 데이터 저장 시나리오에 유연성을 제공하기 위해 NFS 를 활용하여 로컬 볼륨을 생성하는 방법을 보여줍니다.
기본 볼륨 생성
이 단계에서는 기본 Docker 볼륨을 생성하는 방법을 배우게 됩니다. 볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 지속시키는 데 선호되는 방법입니다. 바인드 마운트도 옵션이지만, 볼륨은 Docker 에서 관리되며 일반적으로 백업 또는 마이그레이션이 더 쉽습니다.
먼저, docker volume create 명령을 사용하여 간단한 볼륨을 생성해 보겠습니다. 이 볼륨의 이름을 myvolume으로 지정합니다.
docker volume create myvolume
볼륨의 이름이 콘솔에 출력되어 생성되었음을 확인할 수 있습니다.
이제 docker volume inspect 명령을 사용하여 볼륨의 세부 정보를 검사해 보겠습니다. 이를 통해 볼륨의 드라이버, 마운트 지점 (mountpoint), 범위 (scope) 와 같은 정보를 확인할 수 있습니다.
docker volume inspect myvolume
출력 결과는 볼륨에 대한 세부 정보를 제공합니다. 볼륨의 데이터가 저장되는 호스트 머신의 위치를 보여주는 Mountpoint 필드에 주의하십시오. Docker 가 이 위치를 관리하며, 일반적으로 이 디렉토리에서 파일을 직접 수정하지 않아야 합니다.
다음으로, 컨테이너를 실행하고 이 볼륨을 연결합니다. ubuntu 이미지를 사용하고 myvolume을 컨테이너 내부의 /app 디렉토리에 마운트합니다. 또한 마운트된 볼륨 내의 파일에 일부 데이터를 쓰는 간단한 명령을 실행합니다.
먼저, 로컬에 ubuntu 이미지가 없는 경우 이미지를 pull 합니다.
docker pull ubuntu
이제 컨테이너를 실행하고 데이터를 볼륨에 씁니다.
docker run -d --name mycontainer -v myvolume:/app ubuntu bash -c "echo 'Hello from the volume!' > /app/greeting.txt && tail -f /dev/null"
이 명령을 자세히 살펴보겠습니다.
docker run -d: 컨테이너를 detached 모드 (백그라운드) 로 실행합니다.--name mycontainer: 컨테이너에mycontainer라는 이름을 할당합니다.-v myvolume:/app:myvolume이라는 볼륨을 컨테이너 내부의/app디렉토리에 마운트합니다.ubuntu: 사용할 이미지를 지정합니다.bash -c "echo 'Hello from the volume!' > /app/greeting.txt && tail -f /dev/null": 컨테이너 내부에서 bash 명령을 실행합니다. "Hello from the volume!" 문자열을/app디렉토리 (마운트된 볼륨) 에 있는greeting.txt라는 파일에 쓰고,tail -f /dev/null을 실행하여 컨테이너를 계속 실행합니다.
데이터가 볼륨에 기록되었는지 확인하기 위해 실행 중인 컨테이너 내부에서 파일을 읽는 명령을 실행할 수 있습니다.
docker exec mycontainer cat /app/greeting.txt
"Hello from the volume!" 출력을 확인하면 컨테이너 내에서 데이터가 볼륨에 성공적으로 기록되었음을 확인할 수 있습니다.
마지막으로, 컨테이너를 중지하고 제거합니다. 볼륨은 컨테이너가 제거된 후에도 유지됩니다.
docker stop mycontainer
docker rm mycontainer
특정 드라이버 및 옵션으로 볼륨 생성
이 단계에서는 특정 드라이버를 사용하고 드라이버별 옵션을 제공하여 Docker 볼륨을 생성하는 방법을 배우게 됩니다. 기본 local 드라이버는 많은 사용 사례에 충분하지만, Docker 는 네트워크 스토리지 또는 클라우드 스토리지와 같은 다양한 스토리지 백엔드를 위한 다양한 볼륨 드라이버를 지원합니다.
local 드라이버를 계속 사용하지만, 이를 명시적으로 지정하고 옵션을 전달하는 방법을 보여드리겠습니다. local 드라이버는 파일 시스템 유형, 마운트할 장치 및 마운트 옵션을 각각 지정하기 위한 type, device, o와 같은 옵션을 지원합니다.
local 드라이버를 사용하여 myvolume2라는 볼륨을 생성하고 몇 가지 옵션을 지정해 보겠습니다. 이 예제에서는 메모리에 데이터를 저장하는 tmpfs 파일 시스템 유형을 사용합니다. 이는 호스트 재부팅 시에도 지속될 필요가 없는 임시 데이터에 유용합니다.
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m myvolume2
이 명령을 자세히 살펴보겠습니다.
docker volume create: 볼륨을 생성하는 명령입니다.--driver local:local볼륨 드라이버를 명시적으로 지정합니다.--opt type=tmpfs:type=tmpfs옵션을 드라이버에 전달하여 파일 시스템 유형을 지정합니다.--opt device=tmpfs:device=tmpfs옵션을 드라이버에 전달하여 장치를 지정합니다.tmpfs의 경우 장치도tmpfs입니다.--opt o=size=100m:o=size=100m옵션을 드라이버에 전달합니다.o옵션은 마운트 옵션을 전달하는 데 사용됩니다. 이 경우tmpfs볼륨의 최대 크기를 100 메가바이트로 설정하고 있습니다.myvolume2: 생성할 볼륨의 이름입니다.
성공적으로 생성되면 볼륨의 이름이 콘솔에 출력되는 것을 확인할 수 있습니다.
이제 볼륨을 검사하여 적용된 드라이버 및 옵션을 확인해 보겠습니다.
docker volume inspect myvolume2
출력 결과에서 Driver 필드가 local로 설정되어 있고 Options 필드에 제공한 옵션 (type=tmpfs, device=tmpfs, o=size=100m) 이 나열된 것을 확인할 수 있습니다. Mountpoint는 이 tmpfs 볼륨이 호스트에 마운트된 위치를 보여줍니다.
다음으로, 컨테이너를 실행하고 이 새 볼륨을 연결합니다. 다시 ubuntu 이미지를 사용하고 myvolume2를 컨테이너 내부의 /data 디렉토리에 마운트합니다.
먼저, 로컬에 ubuntu 이미지가 없는 경우 이미지를 pull 합니다 (이전 단계에서 이미 pull 했을 가능성이 높습니다).
docker pull ubuntu
이제 컨테이너를 실행하고 볼륨을 연결합니다.
docker run -d --name mycontainer2 -v myvolume2:/data ubuntu tail -f /dev/null
이 명령은 mycontainer2라는 이름의 ubuntu 컨테이너를 detached 모드로 실행하고 myvolume2를 /data에 마운트합니다. tail -f /dev/null은 컨테이너를 계속 실행 상태로 유지합니다.
myvolume2는 tmpfs 볼륨이므로 컨테이너 내부의 /data에 기록된 모든 데이터는 메모리에 저장되며 컨테이너가 중지되고 제거된 후 또는 호스트가 재부팅된 후에도 지속되지 않습니다.
컨테이너를 중지하고 제거해 보겠습니다.
docker stop mycontainer2
docker rm mycontainer2
myvolume2 볼륨은 여전히 존재하지만, 내용 (기록된 내용이 있는 경우) 은 사라졌습니다. 이는 tmpfs 볼륨이기 때문입니다.
마운트 옵션으로 로컬 볼륨 생성
이 단계에서는 로컬 Docker 볼륨을 생성하고 마운트 옵션을 지정하는 방법을 배우게 됩니다. 마운트 옵션을 사용하면 파일 시스템이 마운트되는 방식을 제어할 수 있으며, 권한 설정, 특정 기능 활성화 또는 성능 최적화와 같은 작업을 수행할 수 있습니다.
myvolume3이라는 로컬 볼륨을 생성하고 o 옵션을 사용하여 마운트 옵션을 지정합니다. 이 예제에서는 uid 및 gid 옵션을 설정하여 컨테이너에서 볼륨에 의해 생성된 파일이 호스트의 특정 사용자 및 그룹에 의해 소유되도록 합니다. 이는 컨테이너와 호스트 간에 데이터를 공유할 때 권한을 관리하는 데 유용할 수 있습니다.
먼저, 볼륨의 소스로 사용할 호스트에 디렉토리를 생성해 보겠습니다. 이는 표준 로컬 볼륨에 반드시 필요한 것은 아니지만, 마운트 옵션이 기본 파일 시스템에 어떤 영향을 미칠 수 있는지 보여주는 데 도움이 됩니다.
mkdir -p ~/project/myvolumedata
이제 local 드라이버를 사용하여 myvolume3 볼륨을 생성하고 uid 및 gid와 함께 o 옵션을 지정해 보겠습니다. 현재 labex 사용자의 사용자 ID 와 그룹 ID 를 사용합니다. id -u 및 id -g 명령을 사용하여 사용자 ID 와 그룹 ID 를 찾을 수 있습니다.
USER_ID=$(id -u)
GROUP_ID=$(id -g)
docker volume create --driver local --opt type=none --opt device=/home/labex/project/myvolumedata --opt o=bind,uid=$USER_ID,gid=$GROUP_ID myvolume3
이 명령을 자세히 살펴보겠습니다.
docker volume create: 볼륨을 생성하는 명령입니다.--driver local:local볼륨 드라이버를 지정합니다.--opt type=none: 파일 시스템 유형을 자동으로 생성하지 않도록 지정합니다. 기존 디렉토리에 바인딩합니다.--opt device=/home/labex/project/myvolumedata: 마운트할 장치를 지정합니다. 이는 호스트에서 생성한 디렉토리입니다. 절대 경로/home/labex/project/myvolumedata를 사용합니다.--opt o=bind,uid=$USER_ID,gid=$GROUP_ID: 마운트 옵션을 전달합니다.bind: 바인드 마운트를 지정하여 볼륨을 지정된 장치 (호스트 디렉토리) 에 연결합니다.uid=$USER_ID: 볼륨에서 생성된 파일의 사용자 ID 를 현재 사용자의 ID 로 설정합니다.gid=$GROUP_ID: 볼륨에서 생성된 파일의 그룹 ID 를 현재 사용자의 그룹 ID 로 설정합니다.
myvolume3: 볼륨의 이름입니다.
볼륨의 이름이 콘솔에 출력되는 것을 확인할 수 있습니다.
이제 볼륨을 검사하여 옵션을 확인해 보겠습니다.
docker volume inspect myvolume3
출력 결과에서 Driver가 local이고, Options에 type=none, device=/home/labex/project/myvolumedata, o=bind,uid=...,gid=... (사용자 및 그룹 ID 포함) 이 포함된 것을 확인할 수 있습니다. Mountpoint는 device 경로와 동일합니다.
다음으로, 컨테이너를 실행하고 이 볼륨을 연결합니다. ubuntu 이미지를 사용하고 myvolume3을 컨테이너 내부의 /app에 마운트합니다. 그런 다음 컨테이너의 /app 디렉토리 내에 파일을 생성하고 호스트에서 해당 소유권을 확인합니다.
먼저, 필요한 경우 ubuntu 이미지를 pull 합니다.
docker pull ubuntu
이제 컨테이너를 실행하고 마운트된 볼륨에 파일을 생성합니다.
docker run --rm -v myvolume3:/app ubuntu bash -c "echo 'Testing ownership' > /app/testfile.txt && ls -l /app/testfile.txt"
이 명령은 ubuntu 컨테이너를 실행하고, myvolume3을 /app에 마운트하고, "Testing ownership"을 /app/testfile.txt에 쓰고, 컨테이너 내부에서 파일 세부 정보를 나열합니다. 컨테이너는 일반적으로 기본적으로 root 로 실행되므로 컨테이너 내에서 root 소유권으로 파일이 나열되는 것을 확인할 수 있습니다.
이제 호스트 머신의 ~/project/myvolumedata 디렉토리에서 파일의 소유권을 확인해 보겠습니다.
ls -l ~/project/myvolumedata/testfile.txt
볼륨을 생성할 때 지정한 uid 및 gid 마운트 옵션 덕분에 testfile.txt 파일이 호스트의 labex 사용자 및 그룹에 의해 소유되는 것을 확인할 수 있습니다.
마지막으로, 생성된 디렉토리를 정리합니다.
rm -rf ~/project/myvolumedata
NFS 를 사용하여 로컬 볼륨 생성
이 단계에서는 NFS 공유를 백엔드 스토리지로 사용하는 로컬 Docker 볼륨을 생성하는 방법을 배우게 됩니다. 이를 통해 컨테이너는 네트워크 연결 스토리지 장치에 데이터를 저장할 수 있으며, 여러 호스트에서 데이터에 액세스할 수 있고 중앙 집중식 스토리지 솔루션을 제공할 수 있습니다.
local 볼륨 드라이버와 함께 NFS 를 사용하려면 device 옵션을 사용하여 NFS 서버 주소와 공유 디렉토리의 경로를 지정하고, type 옵션을 사용하여 파일 시스템 유형을 nfs로 지정해야 합니다. 또한 o 옵션을 사용하여 적절한 마운트 옵션을 제공해야 합니다.
이 랩 환경에서는 루프백 주소 127.0.0.1과 호스트의 디렉토리를 사용하여 NFS 공유를 시뮬레이션합니다. 참고: 실제 시나리오에서는 127.0.0.1을 NFS 서버의 실제 IP 주소 또는 호스트 이름으로 바꾸고 /path/to/nfs/share를 NFS 서버의 내보낸 경로로 바꿉니다.
먼저, 시뮬레이션된 NFS 공유 역할을 할 호스트에 디렉토리를 생성해 보겠습니다.
mkdir -p ~/project/nfs_share
이제 NFS 옵션을 사용하여 local 드라이버로 myvolume4 볼륨을 생성해 보겠습니다.
sudo docker volume create --driver local --opt type=nfs --opt device=127.0.0.1:/home/labex/project/nfs_share --opt o=addr=127.0.0.1,rw myvolume4
이 명령을 자세히 살펴보겠습니다.
sudo docker volume create: NFS 볼륨을 생성하려면 호스트에서 마운트 작업을 수행하기 위해 root 권한이 필요한 경우가 많으므로sudo를 사용합니다.--driver local:local볼륨 드라이버를 지정합니다.--opt type=nfs: 파일 시스템 유형을 NFS 로 지정합니다.--opt device=127.0.0.1:/home/labex/project/nfs_share: NFS 장치를 지정합니다. 이 형식은nfs_server_address:/exported_path입니다. 루프백 주소와 방금 생성한 디렉토리를 사용하고 있습니다. 절대 경로/home/labex/project/nfs_share를 사용합니다.--opt o=addr=127.0.0.1,rw: NFS 클라이언트에 마운트 옵션을 전달합니다.addr=127.0.0.1: NFS 서버의 주소를 지정합니다.rw: 읽기 - 쓰기 권한으로 공유를 마운트합니다.
myvolume4: 볼륨의 이름입니다.
성공적으로 생성되면 볼륨의 이름이 콘솔에 출력되는 것을 확인할 수 있습니다.
이제 볼륨을 검사하여 NFS 관련 세부 정보를 확인해 보겠습니다.
docker volume inspect myvolume4
출력 결과에서 Driver가 local이고, Options에 type=nfs, device=127.0.0.1:/home/labex/project/nfs_share, o=addr=127.0.0.1,rw가 포함된 것을 확인할 수 있습니다. Mountpoint는 이 NFS 볼륨이 Docker 에 의해 호스트에 마운트된 위치를 보여줍니다.
다음으로, 컨테이너를 실행하고 이 NFS 볼륨을 연결합니다. ubuntu 이미지를 사용하고 myvolume4를 컨테이너 내부의 /data에 마운트합니다. 그런 다음 컨테이너의 /data 디렉토리 내에 파일을 생성하고 호스트의 시뮬레이션된 NFS 공유에서 해당 파일의 존재를 확인합니다.
먼저, 필요한 경우 ubuntu 이미지를 pull 합니다.
docker pull ubuntu
이제 컨테이너를 실행하고 마운트된 볼륨에 파일을 생성합니다.
docker run --rm -v myvolume4:/data ubuntu bash -c "echo 'Data on NFS' > /data/nfs_test.txt && ls -l /data/nfs_test.txt"
이 명령은 ubuntu 컨테이너를 실행하고, myvolume4를 /data에 마운트하고, "Data on NFS"를 /data/nfs_test.txt에 쓰고, 컨테이너 내부에서 파일 세부 정보를 나열합니다.
이제 호스트 머신의 ~/project/nfs_share 디렉토리에서 파일을 확인해 보겠습니다.
ls -l ~/project/nfs_share/nfs_test.txt
nfs_test.txt 파일이 나열되어 NFS 볼륨을 사용하여 컨테이너 내에 기록된 데이터가 호스트의 시뮬레이션된 NFS 공유에 있음을 확인해야 합니다.
마지막으로, 생성된 디렉토리를 정리합니다.
rm -rf ~/project/nfs_share
요약
이 랩에서는 docker volume create 명령을 사용하여 Docker 볼륨을 생성하고 관리하는 방법을 배웠습니다. 먼저 기본 볼륨을 생성하고 세부 정보를 검사하여 Docker 가 데이터 저장 위치를 관리하는 방식을 이해했습니다. 그런 다음 이 볼륨을 컨테이너에 연결하고 데이터를 쓰는 연습을 하여 볼륨이 컨테이너 데이터에 대한 영구 스토리지를 제공하는 방법을 시연했습니다. 또한 이 랩에서는 마운트 옵션이 있는 로컬 볼륨 및 NFS 를 사용하는 로컬 볼륨을 포함하여 특정 드라이버 및 옵션으로 볼륨을 생성하는 방법을 다루어 다양한 스토리지 요구 사항에 대한 Docker 볼륨의 유연성과 다양한 사용 사례를 보여주었습니다.



