Docker 볼륨 관리

DockerBeginner
지금 연습하기

소개

이 섹션에서는 볼륨 (volumes) 이라 불리는 Docker 환경의 영구 데이터 저장소 사용법을 다룹니다. 내부 및 외부 볼륨의 차이점과 같은 영구 데이터 저장소의 특성을 배우고, 상황에 맞는 적절한 활용 방법을 익히게 됩니다.

데이터 볼륨 관리

데이터 볼륨은 Docker 에서 데이터를 영구적으로 보존하기 위한 표준적인 방식입니다. 이 섹션에서는 실무에서 데이터 볼륨을 다루는 표준적인 조작법을 실습합니다.

목표

docker 명령어를 사용하여 my-vol이라는 이름의 데이터 볼륨을 생성하고, 해당 볼륨 안에 test.txt 파일을 추가하는 것이 목표입니다.

결과 예시

이 챌린지를 마쳤을 때 다음과 같은 결과가 나타나야 합니다:

  1. my-vol이라는 이름의 데이터 볼륨 생성.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
  1. 데이터 볼륨 상세 정보에서 Mountpoint 확인.
[
  {
    "CreatedAt": "2024-01-20T17:37:33+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
    "Name": "my-vol",
    "Options": {},
    "Scope": "local"
  }
]
  1. Mountpoint 경로로 이동하여 test.txt 파일 생성.
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## pwd
/var/lib/docker/volumes/my-vol/_data
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## ls
test.txt

요구 사항

이 챌린지를 완료하려면 다음 지식이 필요합니다:

  • docker 명령어를 사용하여 데이터 볼륨을 생성하는 방법.
  • root 사용자로 파일을 생성하는 방법.
  • sudo su를 사용하여 root 사용자로 전환하고, sudo passwd root를 사용하여 root 비밀번호를 설정하는 방법.

데이터 볼륨을 사용한 컨테이너 생성

이 섹션에서는 Docker 데이터 볼륨을 사용하는 컨테이너를 생성하고 파일을 복사하는 작업을 수행합니다.

목표

nginx-vol이라는 이름의 Docker 볼륨을 생성한 후, nginx라는 이름의 컨테이너를 시작하면서 이 볼륨을 마운트합니다. 마지막으로 /home/labex/project/index.html 파일을 nginx 컨테이너로 복사하는 것이 목표입니다.

결과 예시

이 챌린지를 마쳤을 때 다음과 같은 결과가 나타나야 합니다:

  1. nginx-vol이라는 이름의 데이터 볼륨 생성.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
local     nginx-vol
  1. nginx 이미지를 기반으로 nginx 컨테이너를 생성하고, 컨테이너의 /usr/share/nginx/html 디렉토리를 nginx-vol 데이터 볼륨에 마운트.
labex:~/ $ docker ps | grep nginx
c39296aaf39e   nginx     "/docker-entrypoint.…"   35 seconds ago   Up 31 seconds   80/tcp    nginx
  1. /home/labex/project/index.html 파일 준비.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
  1. /home/labex/project/index.html 파일을 nginx 컨테이너 내부로 복사.
labex:/tmp/ $ docker exec nginx cat /usr/share/nginx/html/index.html
hello world

요구 사항

이 챌린지를 완료하려면 다음 지식이 필요합니다:

  • docker 명령어를 사용하여 데이터 볼륨을 생성하는 방법.
  • 컨테이너를 시작하는 방법.
  • 로컬 파일을 컨테이너로 복사하는 방법.

호스트 경로를 사용한 컨테이너 생성

많은 경우 데이터 볼륨 대신 호스트의 네이티브 디렉토리를 직접 사용하여 데이터를 보존하기도 합니다. 이 섹션에서는 호스트 경로 (Host Path) 를 사용하여 컨테이너를 생성해 보겠습니다.

목표

Host Path를 사용하는 컨테이너를 생성하고, /home/labex/project/nginx.txt 파일을 컨테이너 내부로 복사한 뒤, 컨테이너 안의 파일이 호스트 경로의 파일과 동일한지 확인하는 것이 목표입니다.

결과 예시

이 챌린지를 마쳤을 때 다음과 같은 결과가 나타나야 합니다:

  1. /tmp 디렉토리 아래에 nginx 디렉토리 생성.
labex:/tmp/ $ ls | grep nginx
nginx
  1. nginx 이미지를 기반으로 nginx-host 컨테이너를 시작하고, 호스트의 /tmp/nginx 디렉토리를 컨테이너의 /usr/share/nginx/html 디렉토리에 마운트.
labex:/tmp/ $ docker ps | grep nginx-host
6fc2d40e12df   nginx     "/docker-entrypoint.…"   44 seconds ago   Up 43 seconds   80/tcp    nginx-host
  1. docker inspect 명령어로 구체적인 마운트 상세 정보 확인.
"Mounts": [
   {
         "Type": "bind",
         "Source": "/tmp/nginx",
         "Destination": "/usr/share/nginx/html",
         "Mode": "",
         "RW": true,
         "Propagation": "rprivate"
   }
],
  1. /home/labex/project/nginx.txt 파일 준비.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
  1. /home/labex/project/nginx.txt 파일을 nginx-host 컨테이너의 /usr/share/nginx/html 디렉토리로 복사.
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
  1. 로컬 머신의 /tmp/nginx 디렉토리에 nginx.txt 파일이 존재하는지 확인.
labex:nginx/ $ pwd
/tmp/nginx
labex:nginx/ $ cat nginx.txt
hello nginx

요구 사항

이 챌린지를 완료하려면 다음 지식이 필요합니다:

  • 사용하려는 Host Path 경로를 파악하는 방법.
  • 컨테이너 내부에서 관련 명령어를 사용하여 호스트 디렉토리나 파일에 접근 가능한지 확인하는 방법.
  • 호스트 경로를 사용하여 컨테이너를 시작하는 방법.
  • cd, mkdir, touch 등 기본적인 Linux 명령어 숙지.

컨테이너 간 데이터 공유

컨테이너화된 환경에서는 한 컨테이너의 데이터를 다른 컨테이너와 공유해야 할 때가 있습니다. 데이터 공유를 위해 다양한 기술을 사용할 수 있으며, 이번 챌린지에서는 컨테이너 간에 데이터를 공유하는 방법을 탐구합니다.

목표

두 컨테이너 간의 데이터 공유를 구현하는 것이 목표입니다. 구체적으로, Host Path를 사용하여 컨테이너 A를 시작한 다음, 또 다른 컨테이너 B를 시작할 때 A 의 저장 볼륨을 마운트하여 최종적으로 두 컨테이너가 데이터를 공유하도록 설정합니다.

결과 예시

이 챌린지를 마쳤을 때 다음과 같은 결과가 나타나야 합니다:

  1. 로컬 호스트에 /tmp/share 디렉토리 생성.
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
  1. nginx 이미지를 기반으로 nginx-share 컨테이너를 생성하고, 로컬의 /tmp/share 디렉토리를 컨테이너의 /usr/share/nginx/html 디렉토리에 마운트.
labex:/tmp/ $ docker ps | grep nginx-share
216d02d94f39   nginx     "/docker-entrypoint.…"   55 seconds ago   Up 55 seconds   80/tcp    nginx-share
  1. busybox 이미지를 기반으로 busybox-share 컨테이너를 생성하고, nginx-share 컨테이너의 볼륨을 상속받아 마운트.
labex:/tmp/ $ docker ps | grep busy
30bf04aee681   busybox   "sh"                     43 seconds ago   Up 42 seconds             busybox-share
  1. /home/labex/project/share.txt 파일 준비.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
  1. /home/labex/project/share.txt 파일을 nginx-share 컨테이너로 복사.
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
  1. busybox-share 컨테이너로 이동하여 share.txt 파일이 존재하는지 확인.
labex:/tmp/ $ docker exec busybox-share cat /usr/share/nginx/html/share.txt
hello share

요구 사항

이 챌린지를 완료하려면 다음 지식이 필요합니다:

  • Docker 컨테이너의 기본 조작 및 개념 숙지.
  • Docker 명령줄 도구를 사용하여 컨테이너를 생성, 실행 및 중지하는 방법.
  • 데이터 볼륨의 개념과 사용법 이해.
  • 컨테이너에 데이터 볼륨을 마운트하는 방법 이해.
  • cd, mkdir, touch 등 기본적인 Linux 명령어 숙지.

요약

챌린지를 성공적으로 완료하신 것을 축하드립니다! 이제 컨테이너에서 저장소 볼륨을 능숙하게 다룰 수 있게 되셨으니, 다음 단계로 나아가 보세요.

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습