린아저씨의 잡학사전

Docker Container 다루기 - 볼륨 공유



▶ 호스트 볼륨 공유
# docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
*볼륨 공유에는 -v 옵션을 사용한다. 위의 예제에는 호스트의 /home/wordpress_db 디렉터리와 컨테이너의 /var/lib/mysql 디렉터리를
 공유한다는 뜻이다.
 즉 호스트 볼륨 공유는 [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리] 형태이다.

*미리 /home/wordpress_db를 미리 생성하지 않아도 도커는 자동으로 이를 생성한다. 또한 컨테이너가 삭제되어도 호스트 디렉터리의
 데이터는 보존된다.
 컨테이너의 /var/lib/mysql 디렉터리는 호스트의 /home/wordpress_db 디렉터리와 동기화되는 것이 아니라 완전히 같은 
 디렉터리 이다.

*호스트에 이미 디렉터리와 파일이 존재하고 컨테이너에도 존재할 때 두 디렉터리를 공유하면, 컨테이너에 있던 디렉터리 자체가 
 덮어씌워진다.
 정확히 말하면 -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트하는 것이다.

   ▷ 디렉터리 단위의 공유뿐 아니라 단일 파일 단위의 공유도 가능하며, 동시에 여러 개의 -v 옵션을 쓸 수도 있다.
# docker run -i -t \
--name fiel_volume \
-v /home/hello.txt:/hello.txt \
-v /home/hello2.txt:/hello2.txt \
ubuntu:15.04


▶ 볼륨 컨테이너
# docker run -i -t \
--name volumes_from_container \
--volumes-from volume_overide \
ubuntu:14.04
*볼륨을 사용하는 두 번째 방법은 -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것이다. 
 컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 -v 또는 --volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 
 공유할 수 있다.

*위의 예제는 volume_overide 컨테이너에서 볼륨을 공유받는 경우이다.
여러 개의 컨테이너가 동일한 컨테이너에 --volumes-from 옵션을 사용함으로써 볼륨을 공유해 사용할 수도 있다.
이런 구조를 활용하면 호스트에서 볼륨만 공유하고 별도의 역할을 담당하지 않는 일명 '볼륨 컨테이너'로서 활용하는 것도 가능하다.

▶ 도커 볼륨
# docker volume create --name myvolume
myvolume

#docker volume ls
DRIVER               VOLUME NAME 
local                myvolume
*볼륨을 활용하는 세번째 방법은 docker volume을 사용하는 것이다. 지금까지 한 방법과 같이 호스트와 볼륨을 공유해 컨테이너의 
 데이터를 보존하는 것도 나쁘지 않지만
 도커 자체에서 제공하는 볼륨 기능을 활용해 데이터를 보존할 수도 있다.

위의 예제와 같이 도커 볼륨을 생성하면 이 볼륨은 로컬 호스트에 저장되며 도커 엔진에 의해  생성되고 삭제된다.

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

다음과 같이 도커 볼륨을 생성한 뒤에는 호스트와 볼륨을 공유할 때 사용한 -v 옵션을 사용해서 마운트 해준다. 
[도커 볼륨의 이름]:[컨테이너의 공유 디렉터리]

도커 볼륨도 여러 개의 컨테이너에 공유되어 활용될 수 있다.


▶ 도커 볼륨 정보 확인1
# docker inspect --type volume myvolume
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]
* 정보를 확인할 종류를 명시하기 위해 -type 옵션에 image, volume 등을 입력하는 것이 좋다.


▶ 도커 볼륨 정보 확인2
# docker volume inspect myvolume
* 도커의 모든 명령어는 docker 접두어 다음에 container, image, volume 등을 명시함으로써 특정 구성 단위를 제어하는 
 명령어를 사용할 수 있다.
 예를 들어, docker container inspect는 컨테이너의 정보를, docker volume inspect는 볼륨의 정보를 출력합니다.


▶ 도커 볼륨 정리
# docker volume prune
*도커 볼륨을 생성하고 삭제하다 보면 불필요한 볼륨들이 남아있을 때가 있다. 왜냐하면 도커 볼륨을 사용하고 있는 컨테이너를 
 삭제해도 볼륨이 자동으로 삭제되지 않기 때문이다.
 따라서 사용되지 않는 볼륨을 한꺼번에 삭제하려면 위의 명령어를 사용한다.

*컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계하는 것을 스테이트리스(stateless)하다고 한다.
 컨테이너 자체는 상태가 없고 상태를 결정하는 데이터는 외부로부터 제공받는다. 컨테이너가 삭제돼도 데이터는 보존되므로 
 스테이트리스한 컨테이너 설계는 도커를 사용할 때 매우 바람직한 설계이다.

*반대로 컨테이너가 데이터를 저장하고 있어 상태가 있는 경우 스테이트풀(stateful)하다고 말한다. 스테이트풀한 컨테이너 설계는 
 컨테이너 자체에서 데이터를 보관하므로 지양하는 것이 좋다.


공유하기

facebook twitter kakaoTalk kakaostory naver band