1. 程式人生 > >Docker基礎 5.Docker容器資料卷

Docker基礎 5.Docker容器資料卷

Docker基礎

@Author:hanguixian
@Email:[email protected]

Docker文件:https://docs.docker.com/

Dcker中文文件:https://docs.docker-cn.com/


五.Docker容器資料卷

1.是什麼

  • Docker的理念:
    • 將運用與執行的環境打包形成容器執行,執行可以伴隨著容器,但是我們對資料的要求希望是持久化的
    • 容器之間希望有可能共享資料
  • Docker容器產生的資料,如果不通過docker commit生成成新的映象,使得資料做為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就沒有了。 為了能儲存資料在docker中我們使用卷。

2.能做什麼

  • 卷就是目錄或檔案,存在於一一個或多個容器中,由docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System提供些用於持續儲存或共享資料的特性
  • 卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的資料卷
  • 特點:

    • 1.資料卷可在容器之間共享或重用資料
    • 2.卷中的更改可以直接生效
    • 3.資料卷中的更改不會包含在映象的更新中
    • 4.資料卷的生命週期一直持續到沒有容器使用它為止
  • 容器的持久化

  • 容器間繼承+共享資料

3.資料卷

  • 容器內新增

    • 直接命令新增

      • 命令: docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 映象名

        • 例子: docker run -it -v /myDataVolume:/dataVolumeContainer centos
      • 檢視資料卷是否掛載成功

        • 使用 docker inspect 容器id

          
          "Mounts": [
                    {
                        "Type": "bind",
                        "Source
          ": "/myDataVolume", "Destination": "/dataVolumeContainer", "Mode": "", "RW": true, "Propagation": "rprivate" } ] "HostConfig": { "Binds": [ "/myDataVolume:/dataVolumeContainer" ], "省略":[ "....../省略" ] }
      • 容器和宿主機之間資料共享

        • 在宿主機中建立檔案,在容器中修改該檔案,可以看到檔案同步
        • 命令: touch a.txt vim a.txt
      • 容器停止退出後,主機修改後資料是否同步

        • 容器先停止–>主機修改檔案–>容器重啟進入–>檢視主機修改過的檔案–>內容同步
      • 命令(帶許可權)

        • docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 映象名
        • 容器中,檔案是隻讀狀態,不能新增修改
    • DockerFile新增

      • 根目錄下新建mydocker資料夾並進入

        • 命令 : mkdir /mydocker
      • 可在Dockerfile中使用VOLUME指令來給映象新增一個或多個數據卷

        • VOLUME [“/dataVolumeContainer’,”/dataVolumeContainer2”,”/dataVolumeContainer3”]
        • 說明:
        • 出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
        • 由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。
      • File構建

        • 在/mydocker下建立Dockerfile
        
        #volume test
        
        FROM centos
        VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
        CMD echo "finished,------success"
        CMD /bin/bash
        • 相當於:
             docker run -it -v /host1:/dataVolumeContainer -v /host2:/dataVolumeContainer2 cnetos /bin/bash
      • build後生成映象

        • 命令: docker build -f /mydocker/DockerFile -t hanguixian/centos_u .
        [[email protected] mydocker]# docker build -f /mydocker/DockerFile -t hanguixian/centos_u .
        Sending build context to Docker daemon  3.072kB
        Step 1/4 : FROM centos
         ---> 5182e96772bf
        Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
         ---> Using cache
         ---> be7f6ccf6f5e
        Step 3/4 : CMD echo "finished,------success"
         ---> Running in 92492c960ec4
        Removing intermediate container 92492c960ec4
         ---> 6c3c0ea2b54c
        Step 4/4 : CMD /bin/bash
         ---> Running in 053f5f238bf9
        Removing intermediate container 053f5f238bf9
         ---> ca21681a1ecb
        Successfully built ca21681a1ecb
        Successfully tagged hanguixian/centos_u:latest
        • 獲得一個新映象hanguixian/centos_u , run容器

          • docker images

            [root@iZuf64yofkbhpt8m0ackshZ mydocker]# docker images 
            REPOSITORY           TAG       IMAGE ID            CREATED             SIZE
            hanguixian/centos_u  latest   ca21681a1ecb        2 minutes ago       200MB
            
          • docker run -it hanguixian/centos_u

            [root@iZuf64yofkbhpt8m0ackshZ mydocker]# docker run -it hanguixian/centos_u
            [[email protected]26cf1a5a8757 /]# ll
            total 64
            -rw-r--r--   1 root root 12005 Aug  4 22:05 anaconda-post.log
            lrwxrwxrwx   1 root root     7 Aug  4 22:04 bin -> usr/bin
            drwxr-xr-x   2 root root  4096 Aug 27 07:44 dataVolumeContainer1
            drwxr-xr-x   2 root root  4096 Aug 27 07:44 dataVolumeContainer2
            drwxr-xr-x   5 root root   360 Aug 27 07:44 dev
            drwxr-xr-x   1 root root  4096 Aug 27 07:44 etc
            drwxr-xr-x   2 root root  4096 Apr 11 04:59 home
            lrwxrwxrwx   1 root root     7 Aug  4 22:04 lib -> usr/lib
            lrwxrwxrwx   1 root root     9 Aug  4 22:04 lib64 -> usr/lib64
            drwxr-xr-x   2 root root  4096 Apr 11 04:59 media
            drwxr-xr-x   2 root root  4096 Apr 11 04:59 mnt
            drwxr-xr-x   2 root root  4096 Apr 11 04:59 opt
            dr-xr-xr-x 148 root root     0 Aug 27 07:44 proc
            dr-xr-x---   2 root root  4096 Aug  4 22:05 root
            drwxr-xr-x  10 root root  4096 Aug  4 22:05 run
            lrwxrwxrwx   1 root root     8 Aug  4 22:04 sbin -> usr/sbin
            drwxr-xr-x   2 root root  4096 Apr 11 04:59 srv
            dr-xr-xr-x  13 root root     0 Aug 27 07:44 sys
            drwxrwxrwt   7 root root  4096 Aug  4 22:05 tmp
            drwxr-xr-x  13 root root  4096 Aug  4 22:04 usr
            drwxr-xr-x  18 root root  4096 Aug  4 22:04 var
            
      • 通過上述步驟,容器內的卷目錄地址已經知道對應的主機目錄地址哪?

        • docker inspect 26cf1a5a8757
         },
                "Mounts": [
                    {
                        "Type": "volume",
                        "Name": "9a33a9f028e45e7410d0c908ccbcc496e1a321fa96d0781c3c61dac3c5c11f35",
                        "Source": "/var/lib/docker/volumes/9a33a9f028e45e7410d0c908ccbcc496e1a321fa96d0781c3c61dac3c5c11f35/_data",
                        "Destination": "/dataVolumeContainer1",
                        "Driver": "local",
                        "Mode": "",
                        "RW": true,
                        "Propagation": ""
                    },
                    {
                        "Type": "volume",
                        "Name": "0a98062cdb70ecfb32e040c668ed0e1528f0b409173275da4ad6f0c5e0322ac2",
                        "Source": "/var/lib/docker/volumes/0a98062cdb70ecfb32e040c668ed0e1528f0b409173275da4ad6f0c5e0322ac2/_data",
                        "Destination": "/dataVolumeContainer2",
                        "Driver": "local",
                        "Mode": "",
                        "RW": true,
                        "Propagation": ""
                    }
        
      • 主機對應預設地址

        • /var/lib/docker/volumes/9a33a9f028e45e7410d0c908ccbcc496e1a321fa96d0781c3c61dac3c5c11f35/_data
    • 備註

      • Docker掛載主機目錄Docker訪問出現cannot open directory : Permission denied
      • 解決辦法:在掛載目錄後多加一個–privileged=true引數即可
        • 例如: docker run -it -v /myDataVolume:/dataVolumeContainer –privileged=true centos

4.資料卷容器

  • 是什麼

    • 命名的容器掛載資料卷,其他容器通過掛載這個(父容器)實現資料共享,掛載資料卷的容器,稱之為資料卷容器
  • 簡介

    • 以上一步新建的映象hanguixian/centos_u為模板並執行容器dc01/dc02/dc03
    • 它們已經具有容器卷
      • /dataVolumeContainer1
      • /dataVolumeContainer2
  • 容器間傳遞共享(–volume-from)

    • 先啟動一個父容器dc01

      • 命令: docker run -it –name doc1 hanguixian/centos_u
      • 在dataVolumeContainer2新增內容
        • cd dataVolumeContainer2
        • vi a.txt
    • dc02/dc03繼承自dc01

      • –volumes-from

      • 命令

        • docker run -it --name doc2 --volumes-from doc1 hanguixian/centos_u
        [root@iZuf64yofkbhpt8m0ackshZ /]# docker run -it --name doc2 --volumes-from doc1 hanguixian/centos_u
        [root@ac3acc6567f3 /]# cd dataVolumeContainer2
        [root@ac3acc6567f3 dataVolumeContainer2]# ll
        total 4
        -rw-r--r-- 1 root root 7 Aug 27 08:19 a.txt
        • 可以看dataVolumeContainer2中有我們在doc1中建立的a.txt

        • dc02/dc03分別在dataVolumeContainer2各自新增內容

    • 回到dc01可以看到02/03各自新增的都能共享

    • 刪除dc01,dc02修改後dc03可否訪問

      • 可以
    • 刪除dc02後dc03可否訪問

      • 可以
    • 新建dc04繼承dc03後再刪除dc03

      • 可以
    • 結論:容器之間配置資訊的傳遞,資料卷的生命週期一直持續到沒有容器使用它為止