본문 바로가기

docker

docker 데이터 활용 - volume 사용하기(2)

이번 포스팅에서는 지난번에 이어 docker container안에서 발생한 데이터를 host에 

저장하는 또 다른 방식을 정리해볼까 합니다. 

 

volume

volume을 사용하는 방식은 지난번의 bind mount 방식과 세 가지 차이점이 있습니다. 

1. bind mount 방식은 host os에서 본인이 지정한 경로를 사용할 수 있는

반면에 volume 방식은 host os에서 /var/lib/docker/volumes 라는 지정된 경로에 저장됩니다. 

(정확하게는 bind mount는 docker에서 지정한 경로와 사용자가 지정하는 임의의 경로 둘다 저장됩니다. 

단, docker가 제공하는 경로에는 폴더 이름이 아닌 hash 값이 폴더의 이름이 됩니다.)

2. bind mount 방식은 container를 생성하기 전에 host에서 사용할 경로를 미리 생성해 놓아야 합니다. 

반면에 volume 방식은 container를 생성하면서 volume을 지정해 놓으면 host에 docker가 지정한

경로를 만듭니다. 

3. bind mount 방식은 docker cli로 컨트롤 할 수 없습니다. 

반면에 volume 방식은 docker cli로 컨트롤 할 수 있습니다. 

 

이번 포스팅에서는 docker volume을 미리 생성하여 진행해보도록 하겠습니다. 

 

docker 명령어 방식

 

1. docker volume 생성

 

# docker volume 생성(test)
$ docker volume create test

# docker volume 조회
$ docker volume ls 
DRIVER              VOLUME NAME
local               test

 

2. docker container 생성

 

# docker container 생성
$ docker run -d -it --name app-server -v test:/test node

# docker container 안에 들어가서 data 생성
$ docker exec -it app-server bash
root@b27a3772fb67:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  test  usr
boot  etc  lib   media  opt  root  sbin  sys  tmp   var
root@b27a3772fb67:/# cd test
root@b27a3772fb67:/# echo test > app-server
root@b27a3772fb67:/test# ls
app-server

# /var/lib/docker/volumes 경로에서 volume 확인
$ sudo su - 
root@ip:~# cd /var/lib/docker/volumes
root@ip:~# ls
metadata.db  test
root@ip:~# cd test/_data/
root@ip:~# cat app-server
test

 

위 시나리오는

1. host에서 volume을 만들고 docker container를 실행합니다. 

2. container에서 데이터를 생성합니다. 

3. host에서 volume이 관리되는 경로로 들어갑니다. (root 계정으로만 가능)

4. volume 경로에서 데이터를 확인합니다. 

 

docker-compose 방식

 

1. docker-compose.yaml 파일 생성

 

# docker-compose.yaml 파일 내용입니다. 

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '3.4'

volumes:
   test:

services:
  mariadb:
   container_name: mariadb
   image: mariadb:latest
   environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=net
      - MYSQL_ROOT_PASSWORD=1234
      - MYSQL_USER=test
      - MYSQL_PASSWORD=1234
      - TZ="Asia/Seoul"

   volumes:
      - test:/test

 

2. docker-compose.yaml 파일을 이용해 container 생성

 

$ docker-compose -f docker-compose.yaml up -d

 

3. docker container안에 들어가 데이터 생성

 

# container 안에 진입
$ docker exec -it mariadb bash

# 데이터 생성
root@f86da74eca46:/# cd test
root@f86da74eca46:/test# ls
root@f86da74eca46:/test# echo test > maria
root@f86da74eca46:/test# ls

# host로 이동하여 데이터 확인
$ sudo su - 
root@ip:~# cd /var/lib/docker/volumes/
root@ip:~# ls
f48f0a3640f5315e5fc1c93e7028076f462606cf498cf7f5a995f4d92572929b  ubuntu_test
metadata.db
root@ip:~# cd ubuntu_test/_data/
root@ip:~# cat maria
test

 

여기까지 해서 volume을 사용하여 container 내부에서 발생한 데이터를

보존하는 방법을 알아보았습니다. 

'docker' 카테고리의 다른 글

docker 데이터 활용 - bind mount(1)  (0) 2020.03.28
docker 설치하기  (0) 2019.11.26