Docker Lab #8

반영환·2023년 7월 3일
0

Docker

목록 보기
17/18
post-thumbnail

Docker Week 5

Container Storage

컨테이너는 stateless하게 관리되어야 한다.

언제든 버리고 새로운 컨테이너를 띄울 수 있어야 하기 때문이다!

따라서 컨테이너는 이미지로 빌드된 상태만을 유지하며 어떤 정보도 컨테이너 내부에서 관리해선 안되고, 저장소를 호스트에 마운트시켜서 관리하거나, RDS를 이용해야한다.

호스트 볼륨 공유

Host Directory 와 Container 볼륨을 마운트 시켜야한다.

docker run에 -v 옵션 사용

  • -v <컨테이너 마운트 경로>

  • -v <호스트 경로>:<컨테이너 마운트 경로>

  • -v <호스트 경로>:<컨테이너 마운트 경로>:<읽기 쓰기 모드>

docker run -v /tmp/vol:/data -it fedora:latest bash

[root@ID /]# touch /data/myfile
[root@ID /]# exit

ls /tmp/vol
# myfile

---

docker run -v /tmp/vol:/data:ro -it fedora:latest bash
[root@ID /]# touch /data/myfile
# touch: cannot touch '/data/myfile': Read-only file system

Docker 볼륨

볼륨은 기본적으로 /var/lib/docker/volumes 에 위치한다.

기본적으로 볼륨은 호스트 파일시스템에 디렉터리나 파일로 존재하고, 컨테이너에서 마운트한 폴더에서의 작업은 커밋 없이 호스트 볼륨에 적용된다.

볼륨 생성 방법

  • Host Directory 볼륨에 맵핑

  • 데이터 전용 컨테이너 설정

  • 볼륨 생성으로 명시적 볼륨 선언

볼륨 맵핑

docker run -it -v /testDir/:/data ubuntu

docker volume ls # docker volume list up 

docker volume ls -f dangling=true # unused volume list up

docker volume ls -f driver=local # specific volume drivier list up

docker volume ls -f name=web # volume list up with specific volume name

docker volume inspect # volume info 

데이터 전용 컨테이너

컨테이너 중 하나에 이미 볼륨이 마운트 돼있는 경우 다른 컨테이너를 해당 컨테이너와 같은 볼륨을 바라보게 지시

docker run -it --name myUbuntu -v /data ubuntu

docker run -it --name myBusybox --volumes-from myUbuntu busybox

myUbuntu Container inspect

"Mounts": [
            {
                "Type": "volume",
                "Name": "8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec",
                "Source": "/var/lib/docker/volumes/8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

myBusyBox Container inspect

"Mounts": [
            {
                "Type": "volume",
                "Name": "8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec",
                "Source": "/var/lib/docker/volumes/8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

동일한 볼륨을 바라보는 것을 확인할 수 있다.

docker volume

  • docker volume create

  • docker volume ls

  • docker volume rm

  • docker volume prune

  • docker volume inspect

docker volume create --name data

docker volume ls

docker volume inspect data

docker run -it -v data:/data ubuntu

root@43jid:/# cd /data
root@43jid:/data# touch file1
root@43jid:/data# exit

ls /var/lib/docker/volumes/data/_data


docker container rm -v <containerName> # remove container with its volume

docker volume rm <volumeName> # remove volume with specific name

docker volume rm $(docker volume ls -qf dangling=true) # remove unused volume

docker volume prune # remove all volume

Docker Host에 외부 Storage 연결

호스트의 /var/lib/docker 에서 모든 이미지와 컨테이너를 저장하는데, 많은 이미지가 추가될수록 이 볼륨 크기는 빠르게 증가한다.

스토리지가 부족해지고 이때 외부 볼륨을 /var/lib/docker 에 마운트해서 사용하자!

Logical Volume Manager

LVM을 사용해서 EC2서버에 Docker 스토리지를 확장해보자.

  • LVM은 CentOS에서 기본 제공되는 강력한 볼륨 매니저이다. Amazon Linux를 사용해 실습하자.

sudo yum install lvm2

  • LVM에서는 볼륨을 유연하게 구성할 수 있도록 Physical Disk Stoarage를 Logical Partition으로 구분할 수 있게 해준다.

스토리지는 LVM으로 관리하기 이전에 물리적, 가상화 기반의 디스크를 추가해주고, 운영체제 레벨의 파티셔닝을 한 뒤에 LVM으로 구성된다.

  • EC2 콘솔에 접속하여 인스턴스를 생성한 후, 종료한 뒤에 임의의 EBS 볼륨을 추가로 생성하여 EC2 인스턴스에 attach 해주자
lsblk

# lsblk result
NAME     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0      7:0    0  24.4M  1 loop /snap/amazon-ssm-agent/****
loop1      7:1    0  55.6M  1 loop /snap/core18/****
loop2      7:2    0  63.3M  1 loop /snap/core20/****
loop3      7:3    0 111.9M  1 loop /snap/lxd/*****
loop4      7:4    0  53.2M  1 loop /snap/snapd/*****
xvda     202:0    0    30G  0 disk
├─xvda1  202:1    0  29.9G  0 part /
├─xvda14 202:14   0     4M  0 part
└─xvda15 202:15   0   106M  0 part /boot/efi

vgcreate docker_vg /dev/sdf

vgdisplay #  check result

lvcreate -n docker -l 100%FREE docker_vg

lvdisplay # Path에는 LV가 만들어진 경로가 표시


lsblk # 블럭디바이스 확인

# 디바이스 맵핑정보 확인 
ls /dev/mapper 

ls /dev/docker_vg

# 파일 시스템 생성
mkfs.xfs /dev/docker_vg/docker

mkfs -t xfs /dev/docker_vg/docker

mount /dev/docker_vg/docker /var/lib/docker

# LV의 UUID 확인
blkid /dev/docker_vg/docker

# /dev/docker_vg/docker : UUID="388a99ed-9486-4a46-aeb6-06eaf6c47675" TYPE="xfs"

# fstab 등록

vim /etc/fstab
#...
#/dev/docker_vg/docker /var/lib/docker xfs defaults 0 0 

mount -a
profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글