Docker의 데이터 볼륨 및 데이터 볼륨 컨테이너

36546 단어 docker
Docker의 사용 과정에서 데이터에 대한 지속성이 필요하거나 여러 용기 간의 데이터 공유가 필요하기 때문에 이것은 Docker 용기의 데이터 조작과 관련된다.컨테이너 중의 데이터 관리는 주로 두 가지 방식이 있는데 그것이 바로 데이터 볼륨과 데이터 볼륨 컨테이너이다.
  • 데이터 볼륨(Data Volumes) 컨테이너 내의 데이터는 로컬 숙박 호스트에 직접 매핑됩니다.
  • 데이터 볼륨 컨테이너(Data Volume Containers)는 특정 컨테이너를 사용하여 데이터 볼륨을 유지합니다.

  • 데이터 볼륨
    데이터 볼륨은 호스트 디렉터리를 용기에 직접 비추는 특수한 디렉터리입니다.하나 이상의 컨테이너로 사용할 수 있습니다.
    데이터 볼륨 디자인의 목적은 데이터의 지속화를 위해 용기의 생명 주기와 완전히 독립하는 것이다.따라서 용기를 삭제할 때 마운트된 데이터 볼륨을 삭제하지 않고 유사한 스팸 메커니즘이 용기에 존재하는 데이터 볼륨을 처리하지 않는다.
    데이터 볼륨의 특성:
  • 데이터 볼륨은 컨테이너가 부팅될 때 초기화되며 마운트 지점에 미러가 포함된 경우 새로 초기화된 데이터 볼륨으로 복제됩니다
  • .
  • 데이터 볼륨은 용기 간에 공유하고 다시 사용할 수 있다
  • 데이터 볼륨의 내용을 직접 수정하고 수정하여 컨테이너 내 조작이든 로컬 조작이든 상관없이 즉시 적용할 수 있다
  • 데이터 볼륨 업데이트는 미러 업데이트에 영향을 주지 않습니다
  • .
  • 마운트된 컨테이너가 삭제된 경우에도 데이터 볼륨은 항상 존재합니다.
    컨테이너에 데이터 볼륨을 만드는 데 사용되는 명령은 다음과 같습니다.
    [root@localhost ~]# docker run -v /root/datavolume:/data -it hub.c.163.com/library/ubuntu /bin/bash

    여기서 -v 는 컨테이너에 데이터 볼륨을 생성함을 나타냅니다./root/datavolume:/data, 호스트의 디렉터리/root/datavolume가 용기에 비친/data 디렉터리를 표시합니다.예:
    [root@localhost ~]# docker run -v /root/datavolume:/data -it hub.c.163.com/library/ubuntu /bin/bash
    root@c863c5094922:/# ll
    total 24
    drwxr-xr-x.  22 root root 4096 Mar 24 02:30 ./
    drwxr-xr-x.  22 root root 4096 Mar 24 02:30 ../
    -rwxr-xr-x.   1 root root    0 Mar 24 02:30 .dockerenv*
    drwxr-xr-x.   2 root root 4096 Jan 19 16:33 bin/
    drwxr-xr-x.   2 root root    6 Apr 12  2016 boot/
    drwxr-xr-x.   2 root root   15 Mar 22 11:30 data/
    drwxr-xr-x.   5 root root  380 Mar 24 02:30 dev/
    drwxr-xr-x.  42 root root 4096 Mar 24 02:30 etc/
    drwxr-xr-x.   2 root root    6 Apr 12  2016 home/
    drwxr-xr-x.   8 root root   90 Sep 13  2015 lib/
    drwxr-xr-x.   2 root root   33 Jan 19 16:32 lib64/
    drwxr-xr-x.   2 root root    6 Jan 19 16:31 media/
    drwxr-xr-x.   2 root root    6 Jan 19 16:31 mnt/
    drwxr-xr-x.   2 root root    6 Jan 19 16:31 opt/
    dr-xr-xr-x. 223 root root    0 Mar 24 02:30 proc/
    drwx------.   2 root root   35 Jan 19 16:33 root/
    drwxr-xr-x.   6 root root   68 Mar 24 02:30 run/
    drwxr-xr-x.   2 root root 4096 Jan 20 21:43 sbin/
    drwxr-xr-x.   2 root root    6 Jan 19 16:31 srv/
    dr-xr-xr-x.  13 root root    0 Mar  3 18:56 sys/
    drwxrwxrwt.   2 root root    6 Jan 19 16:33 tmp/
    drwxr-xr-x.  10 root root   97 Jan 20 21:43 usr/
    drwxr-xr-x.  11 root root 4096 Jan 20 21:43 var
    root@c863c5094922:/# [root@localhost ~]# 
    [root@localhost ~]# ll
        4
    -rw-------. 1 root root 1209 3    4 02:52 anaconda-ks.cfg
    drwxr-xr-x. 3 root root   39 3   23 13:51 backup
    drwxr-xr-x. 2 root root   15 3   22 19:30 datavolume
    drwxr-xr-x. 4 root root   34 3   23 10:01 dockerfile
    [root@localhost ~]# pwd
    /root
    [root@localhost ~]# 

    다음은 터치 명령을 사용하여 파일vo 만들기file1
    root@c863c5094922:/data# touch vo_file1
    root@c863c5094922:/data# ls -l
    -rw-r--r--. 1 root root  0 Mar 24 02:49 vo_file1
    root@c863c5094922:/data# 

    만약 권한과 유사한 문제가 발생한다면, 예를 들어 터치: cannot 터치 xxxx': Permission denied
    su-c 'setenforce 0' 아래에 파일에 내용을 좀 쓰고, 용기와 호스트가 동기화되었는지 테스트하십시오.
    root@c863c5094922:/data# echo "this is a test datavolume" > vo_file1 
    root@c863c5094922:/data# cat vo_file1 
    this is a test datavolume
    root@c863c5094922:/data# [root@localhost datavolume]# 
    [root@localhost datavolume]# cat /root/datavolume/vo_file1 
    this is a test datavolume
    [root@localhost datavolume]# 

    용기에 보이는vofile1과 숙박 호스트의vo파일1의 내용은 같습니다.docker inspect id/ 를 사용하여 다음과 같은 mounts 세부 정보를 볼 수 있습니다.
    [root@localhost datavolume]# docker inspect c863c5094922
    "Mounts": [
                {
                    "Source": "/root/datavolume",
                    "Destination": "/data",
                    "Mode": "",
                    "RW": true,
                    "Propagation": "rprivate"
                }
            ],

    Docker가 데이터 볼륨을 마운트하는 기본 권한은 읽기와 쓰기 (rw) 입니다. 위의 "RW":true를 통해 볼 수 있습니다. 우리는 만들 때 읽기 전용으로 설정하고 ro를 사용할 수 있습니다.
    docker run -v /root/datavolume:/data:ro -it hub.c.163.com/library/ubuntu /bin/bash

    예:
    root@localhost datavolume]# docker run -v /root/datavolume:/data:ro -it hub.c.163.com/library/ubuntu /bin/bash
    root@2a8706e63796:/# touch /data/vo_file2
    touch: cannot touch '/data/vo_file2': Read-only file system

    docker inspect에서는 컨테이너에 대한 정보를 볼 수 있습니다.
    "Mounts": [
                {
                    "Source": "/root/datavolume",
                    "Destination": "/data",
                    "Mode": "ro",
                    "RW": false,
                    "Propagation": "rprivate"
                }
            ],

    여기 "RW"는 false입니다.Dockerfile을 사용하여 데이터 볼륨을 포함하는 미러를 만듭니다. 다음과 같은 Dockerfile을 만들었습니다.
    [root@localhost vo_test]# cat Dockerfile 
    FROM hub.c.163.com/library/ubuntu
    VOLUME ["/datavolume1","/dockervolume2"]
    CMD /bin/bash
    [root@localhost vo_test]# pwd
    /root/dockerfile/vo_test
    [root@localhost vo_test]# 

    다음은 미러링을 구성합니다.
    [root@localhost vo_test]# docker build -t df_vo .
    Sending build context to Docker daemon 2.048 kB
    Step 1 : FROM hub.c.163.com/library/ubuntu
     ---> f49eec89601e
    Step 2 : VOLUME /datavolume1 /dockervolume2
     ---> Running in 39ce6de3a943
     ---> 4921812de13d
    Removing intermediate container 39ce6de3a943
    Step 3 : CMD /bin/bash
     ---> Running in f9afdbaf2471
     ---> 2ee7e110e18d
    Removing intermediate container f9afdbaf2471
    Successfully built 2ee7e110e18d
    [root@localhost vo_test]# docker images
    REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
    df_vo                          latest              2ee7e110e18d        6 seconds ago       129.5 MB

    다음은 이 거울을 이용하여 용기votest1을 만듭니다.
    [root@localhost vo_test]# docker run --name votest1 -it df_vo
    root@a98bbf9dbfae:/# ls
    bin  boot  datavolume1  dev  dockervolume2  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@a98bbf9dbfae:/# 

    이 용기에는 데이터volume1과 데이터volume2 두 개의 데이터 볼륨이 포함되어 있는 것을 볼 수 있습니다.이 미러를 사용하여 컨테이너 votest2를 다시 실행합니다.
    [root@localhost _data]# docker run --name votest2 -it df_vo
    root@9501be4f50d4:/# 
    root@9501be4f50d4:/# ls
    bin  boot  datavolume1  dev  dockervolume2  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@9501be4f50d4:/# [root@localhost _data]#

    docker inspect를 통해 이 두 용기의 정보를 각각 보십시오.두 용기 내의 데이터 볼륨이 호스트에 대응하는 주소 (docker가 직접 만든 것) 가 다음과 같지 않다는 것을 알 수 있습니다:votest1의 용기 정보:
    [root@localhost vo_test]# docker inspect votest1
    "Mounts": [
                {
                    "Name": "4ae9914bc4bd127e669b89ee6b703a0c9cc91f18c8dfe5034dbb838de2ca8062",
                    "Source": "/var/lib/docker/volumes/4ae9914bc4bd127e669b89ee6b703a0c9cc91f18c8dfe5034dbb838de2ca8062/_data",
                    "Destination": "/datavolume1",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                },
                {
                    "Name": "753a10fd08491a41aa953427a4cf7b30276604175b8e237cfea2aed0ddbeaf48",
                    "Source": "/var/lib/docker/volumes/753a10fd08491a41aa953427a4cf7b30276604175b8e237cfea2aed0ddbeaf48/_data",
                    "Destination": "/dockervolume2",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],

    votest2의 컨테이너 정보:
    [root@localhost _data]# docker inspect votest2
    "Mounts": [
                {
                    "Name": "a455e9d38eb656375316c0a96ec0dd69d900f3477d39752a417dac725d8b6854",
                    "Source": "/var/lib/docker/volumes/a455e9d38eb656375316c0a96ec0dd69d900f3477d39752a417dac725d8b6854/_data",
                    "Destination": "/dockervolume2",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                },
                {
                    "Name": "449d3f7c271d0f6ab8f3cd7df0fc4f79510ebeeee888b65283db58c77031d66c",
                    "Source": "/var/lib/docker/volumes/449d3f7c271d0f6ab8f3cd7df0fc4f79510ebeeee888b65283db58c77031d66c/_data",
                    "Destination": "/datavolume1",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],

    해당 호스트 데이터 볼륨 위치:
     [root@localhost _data]# cd /var/lib/docker/volumes/
    [root@localhost volumes]# ll
        32
    drwxr-xr-x. 3 root root    18 3    7 11:48 122d96164df0f84b6132c67cb7db1368b67df81420b03c48ccd0bce682241e4b
    drwxr-xr-x. 3 root root    18 3    7 09:46 174a0ebf6f790834a04d7dda48b1e24702e9a98f805c0c6331aa49e294736143
    drwxr-xr-x. 3 root root    18 3    7 09:47 335c944921f8ec1f4d96fe8a0a15802f69f591549461710fea4bc9c92cd13018
    drwxr-xr-x. 3 root root    18 3    7 10:03 3893ab8ce0aca2128bd3847488f57431285a943ded814843f1aaf993e64b902e
    drwxr-xr-x. 3 root root    18 3   24 11:53 449d3f7c271d0f6ab8f3cd7df0fc4f79510ebeeee888b65283db58c77031d66c
    drwxr-xr-x. 3 root root    18 3   24 11:48 4ae9914bc4bd127e669b89ee6b703a0c9cc91f18c8dfe5034dbb838de2ca8062
    drwxr-xr-x. 3 root root    18 3   23 10:12 6cd6a34adf1fe157cf813a0016011966f97c866874ad10137728ebf824b76e01
    drwxr-xr-x. 3 root root    18 3   24 11:48 753a10fd08491a41aa953427a4cf7b30276604175b8e237cfea2aed0ddbeaf48
    drwxr-xr-x. 3 root root    18 3   22 20:02 7764cd58f82d0d782e97c9b719825c42dc34806ae995257f0082342396b4a630
    drwxr-xr-x. 3 root root    18 3   24 11:53 a455e9d38eb656375316c0a96ec0dd69d900f3477d39752a417dac725d8b6854
    drwxr-xr-x. 3 root root    18 3    7 10:07 a4af7ebbb3da863176fe4db6234d9e69b2e47ce628b0f3770854ed75c40e3604
    drwxr-xr-x. 3 root root    18 3   22 20:02 abecf3deb59ded6262a20ddc94f0e6505ea3dd1c717260594fa4a8b0260c136c
    drwxr-xr-x. 3 root root    18 3    6 15:27 db6529f59f1ceb789047f7c340951c48c463c840e74974d7cfd04d7fad2a3468
    drwxr-xr-x. 3 root root    18 3    7 09:58 e33c562f6e4beb2711ba50cb188ba51faf670b2aa56e571749fc96ce876c0d5c
    drwxr-xr-x. 3 root root    18 3   23 10:12 e82ea714065869185dad3e50703ed44f877794a0a201143679c4b40dc2af4a4d
    -rw-------. 1 root root 65536 3   24 11:53 metadata.db
    [root@localhost volumes]# 

    데이터 볼륨 컨테이너 사용자는 여러 컨테이너 간에 데이터를 공유해야 하기 때문에 데이터 볼륨 컨테이너를 사용할 수 있다.
    이름이 붙은 용기는 데이터 볼륨을 마운트하고 다른 용기는 이 용기를 마운트하여 데이터 공유를 실현하며 데이터 볼륨을 마운트하는 용기를 데이터 볼륨 용기라고 부른다.
    1. 먼저 용기를 만듭니다. 2.그런 다음 마운트합니다.데이터 볼륨 컨테이너를 마운트하는 방법:
    docker run --volumes-from    

    예:
    먼저 컨테이너 votest3을 만듭니다.
    [root@localhost volumes]# docker run --name votest3 -it df_vo
    root@c31f85a96a68:/# ls
    bin  boot  datavolume1  dev  dockervolume2  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@c31f85a96a68:/#

    데이터 볼륨 데이터volume1과 dockervolume2가 있는 것을 볼 수 있으며 데이터volume1에 파일vo 를 생성합니다file:
    root@c31f85a96a68:/# touch datavolume1/vo_file
    root@c31f85a96a68:/# ls datavolume1/
    vo_file

    그리고 용기votest4를 다시 만들어서votest3을 마운트하면 같은 데이터 볼륨을 포함하고 데이터volume1에 파일vo 를 만들 수 있습니다file1:
    [root@localhost volumes]# docker run -it --name votest4 --volumes-from votest3 hub.c.163.com/library/ubuntu /bin/bash
    root@917fc6a610df:/# ls
    bin  boot  datavolume1  dev  dockervolume2  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@917fc6a610df:/# ls datavolume1/
    vo_file
    root@917fc6a610df:/# touch datavolume1/vo_file1 
    root@917fc6a610df:/# ls datavolume1/       
    vo_file  vo_file1

    마찬가지로 용기votest5를 하나 더 만들고 데이터volume에서 파일vofile2
    [root@localhost volumes]# docker run -it --name votest5 --volumes-from votest3 hub.c.163.com/library/ubuntu /bin/bash
    root@61eb42648402:/# ls
    bin  boot  datavolume1  dev  dockervolume2  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@61eb42648402:/# ls datavolume1/
    vo_file  vo_file1
    root@61eb42648402:/# touch datavolume1/vo_file2 
    root@61eb42648402:/# ls datavolume1/
    vo_file  vo_file1  vo_file2
    root@61eb42648402:/#

    우리 연결 각각 votest3 및 vo테스트 4에서 파일을 보려면 다음과 같이 하십시오.
    [root@localhost volumes]# docker attach votest3
    root@c31f85a96a68:/# 
    root@c31f85a96a68:/# ls datavolume1/
    vo_file  vo_file1  vo_file2
    root@c31f85a96a68:/# 
    [root@localhost volumes]# docker attach votest4
    root@917fc6a610df:/# 
    root@917fc6a610df:/# ls datavolume1/
    vo_file  vo_file1  vo_file2
    root@917fc6a610df:/# 

    데이터가 동기화된 것을 볼 수 있다.votest3을 삭제하면 데이터 볼륨이 삭제되지 않은 것을 알 수 있습니다.
    [root@localhost volumes]# docker rm votest3
    votest3
    [root@localhost volumes]# docker attach votest4
    root@917fc6a610df:/# 
    root@917fc6a610df:/# ls datavolume1/
    vo_file  vo_file1  vo_file2
    root@917fc6a610df:/# 

    데이터 볼륨 백업 및 복원 데이터 볼륨 백업에 사용되는 명령:
    docker run --volumes-from        -v $(pwd):/backup --name            tar cvf /backup/backup.tar    

    $(pwd) 현재 경로
    예(이전에 생성된 votest5 사용):
    [root@localhost volumes]# docker run --volumes-from votest5 -v /root/backup:/backup hub.c.163.com/library/ubuntu tar cvf /backup/vof.tar /datavolume1
    tar: Removing leading `/' from member names
    /datavolume1/
    /datavolume1/vo_file
    /datavolume1/vo_file1
    /datavolume1/vo_file2
    [root@localhost volumes]# ls /root/backup/
    vof.tar
    [root@localhost volumes]# 

    /root/backup/에 백업된 것을 볼 수 있습니다.
    데이터 볼륨 복원:
    다음과 같이 명령을 사용합니다.
    docker run --volumes-from        -v $(pwd):/backup --name            tar xvf /backup/backup.tar

    예: 컨테이너votest8 복원 데이터 볼륨 만들기
    [root@localhost backup]# docker run --volumes-from votest5 -v /root/backup:/backup --name votest8 hub.c.163.com/library/ubuntu tar xvf /backup/vof.tar
    datavolume1/
    datavolume1/vo_file
    datavolume1/vo_file1
    datavolume1/vo_file2

    그리고 용기 마운트votest8 만들기
    [root@localhost backup]# docker run -it --volumes-from votest8 hub.c.163.com/library/ubuntu /bin/bash
    root@ee4d4f932ce4:/# 
    root@ee4d4f932ce4:/# ls
    backup  bin  boot  datavolume1  dev  dockervolume2  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@ee4d4f932ce4:/# cd backup/ 
    root@ee4d4f932ce4:/backup# ll
    -rw-r--r--.  1 root root 10240 Mar 24 06:44 vof.tar
    root@ee4d4f932ce4:/backup# 

    이상은 데이터 볼륨과 데이터 볼륨 용기의 관련 조작이다.
  • 좋은 웹페이지 즐겨찾기