Docker 작업

.Volume

Jungsoomin :) 2021. 1. 27. 23:23

도커 컨테이너는 Stateless 하게 설계되어야한다.

  • 도커  컨테이너 사용 시의 가장 중요한 Topic 
컨테이너의 정체성을 결정하는 데이터는 컨테이너에 저장되지 아니한다.

컨테이너가 Host 의 데이터에 의해 동작하도록 설계해야하며


이를 Stateless 하다. 라고 한다.

라고 하며, 이는 도커 컨테이너를 사용함에 가장 권장되는 방법이다.

 

도커 이미지는 Read Only , 변경 데이터는 컨테이너 레이어 에 저장

  • mysql 을 이용해 컨테이너를 만들 경우, mysql 의 이미지에 제공되는 데이터 외의 저장 데이터들은 Container Layer 에 존재
  • 이미지는 어느 경우던 절대로 변경되지 아니한다.
  • Stateless 한 컨테이너 설계를 하지 않을 경우, Docker Container 삭제 시 Container Layer 의 모든 데이터가 날아간다.
컨테이너의 정체성을 결정하는 데이터를 외부로 넘겨 Stateless 하게 설계 && 데이터의 영속성(Persistence) 을 부여하기 위해

Docker Volume 을 사용하는 것이 가장 권장되는 방법이다.

Docker Volume 사용법은 3 가지로

1. 호스트와 직접 공유
2. 호스트와 공유한 데이터를 관리하는 컨테이너와 공유 하여 간접공유 = 볼륨 컨테이너 사용
3. 도커 엔진 내부의 Volume 사용

으로 나뉜다.

 


 

1. 호스트와 직접 공유

  • -v 옵션 사용
    • 호스트에 디렉토리가 존재하지 않더라도 [Docker 에서 자동 생성]
    • 동기화가 아닌 [같은 디렉토리가 됨]
    • 호스트 디렉토리에 파일이 있다면 , 호스트 디렉토리가 [Container dir] 에 덮어씌워짐
docker run -d --name mysqldb -e MYSQL_PASSWORD=mysql MYSQL_DATABASE=my_db \
-v /host/home/mysql:/var/lib/mysql \
mysql:latest

# Host bash
ls /host/home/mysql # Docker 에서 디렉토리 생성


# -v 옵션을 여러개 줄 때 && 파일을 마운트할 때

# Host bash
echo hello world! >> /host/home/hellow && echo hello docker! >> /host/home/hellod

docker -i -t --name hello_volume \
-v /host/home/hellow:/hellow
-v /host/home/hellod:/hellod
ubuntu:14.04

#Docker Container bash
cat hellow && cat hellod
# hellow world!
# hellow docker!

 


 

2. 볼륨 컨테이너 사용 ( 간접 공유 )

  • --volumes-from [container name] 사용
    • Host 와 마운트된 볼륨 컨테이너의 디렉토리가 Container 에 마운트
    • 이를 이용하면, 볼륨 만을 관리하는 컨테이너를 두고 다른 컨테이너들에서 공유받아 Stateless 하게 사용할 수 있다.
#host bash
docker run -i -t --name volumes_from_container \
--volumes-from mysqldb
ubuntu:14.04

#Docker Container bash
ls /var/lib/mysql

 


 

3. 도커 볼륨 사용 ( 도커 엔진 )

  • docker 에서 관리하는 volume 이라는 저장소를 사용
    • volume 은 host 에 저장
    • 도커 엔진에서 볼 수 있으므로 경로를 알 필요는 없음
    • 도커 볼륨하나의 디렉토리에 상응하는 단위
# create volume
docker create volume --name myvolume

# search
docker volume ls

# log
#  DRIVER     VOLUME_NAME
#  local      myvolume

# use
docker run -i -t --name myvolume_1 \
-v myvolume:/root/ \
ubuntu:14.04

# Docker Container bash
echo hello, volume! >> /root/volume

# confirm
docker run -i -t --name myvolume_confirm \
-v myvolume:/root/ \
ubuntu:14.04

# Docker Container bash
cat /root/volume

# hello, volume!

# Host bash, Docker Volume Location Search
docker volume inspect myvolume | grep Mountpoint

# Host bash, confirm
cat /var/lib/docker/volumes/myvolume/_data/volume
# hello, volume!

 

컨테이너 생성시 Docker Volume 을 자동적으로 생성하게 하기

# Host bash, -v 옵션에 호스트 볼륨을 주지않을시 Docker Engine 내에 자동으로 Volume 생성
docker run -i -t --name volume_auto \
-v /root \
ubuntu:14.04

# Host bash, confirm volume
docker volume ls 
# DRIVER    VOLUME_NAME
# local     16진수--

# Host bash, 어느 컨테이너가 volume 을 사용중인지 확인
docker container inspect volume_auto | grep Source
# /var/lib/docker/volumes/16진수--/_data

# Host bash, All Volumes delete
docker volume prune