20200206 Docker 5. Docker容器數據卷

Docker 5. Docker容器數據卷

是什麼

先來看看Docker的理念:docker

  • 將運用與運行的環境打包造成容器運行 ,運行能夠伴隨着容器,可是咱們對數據的要求但願是持久化的
  • 容器之間但願有可能共享數據

Docker容器產生的數據,若是不經過docker commit生成新的鏡像,使得數據作爲鏡像的一部分保存下來, 那麼當容器刪除後,數據天然也就沒有了。json

爲了能保存數據在docker中咱們使用卷。centos

一句話:有點相似咱們Redis裏面的rdb和aof文件bash

能幹嗎

卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,所以可以繞過Union File System提供一些用於持續存儲或共享數據的特性:ui

卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以Docker不會在容器刪除時刪除其掛載的數據卷spa

特色:設計

  1. 數據卷可在容器之間共享或重用數據
  2. 卷中的更改能夠直接生效
  3. 數據卷中的更改不會包含在鏡像的更新中
  4. 數據卷的生命週期一直持續到沒有容器使用它爲止

做用:code

  • 容器的持久化
  • 容器間繼承+共享數據

容器內添加數據卷

直接命令添加

docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名

示例:視頻

docker run -it -v /outData:/inData centos

-v 命令有新建文件夾功能繼承

查看數據卷是否掛載成功

docker inspect 容器ID

若是存在數據卷,從json中能夠看出

...
	"HostConfig": {
            "Binds": [
                "/outData:/inData"
            ],
...

容器和宿主機之間數據共享

相似於共享文件夾,文件夾內的文件和文件內容互通

容器中止退出後,主機修改後數據依然同步

命令(帶權限)

docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名

ro即read only,表示Docker容器對數據卷的權限爲只讀。

備註

Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied 解決辦法:在掛載目錄後多加一個--privileged=true參數便可

DockerFile添加

  1. 根目錄下新建mydocker文件夾並進入

  2. 可在Dockerfile中使用VOLUME指令來給鏡像添加一個或多個數據卷

    VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

    說明:

    出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能直接在Dockerfile中實現。 因爲宿主機目錄是依賴於特定宿主機的,並不可以保證在全部的宿主機上都存在這樣的特定目錄。

  3. File構建

    在mydocker目錄下建立dockerfile文件,內容以下:

    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished,--------success1"
    CMD /bin/bash
  4. build後生成鏡像

    docker build -f /mydocker/dockerfile -t hwj/centos .
  5. 使用鏡像生成容器

    進入容器後能夠發如今根目錄存在兩個數據卷目錄

  6. 查看主機對應的目錄地址

    docker inspect 容器ID

    返回的json串中有相關信息,這裏與視頻教程不一樣,應該是由於Docker版本差別致使

    "Mounts": [
                {
                    "Type": "volume",
                    "Name": "adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3",
                    "Source": "/var/lib/docker/volumes/adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3/_data",
                    "Destination": "/dataVolumeContainer1",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                },
                {
                    "Type": "volume",
                    "Name": "94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f",
                    "Source": "/var/lib/docker/volumes/94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f/_data",
                    "Destination": "/dataVolumeContainer2",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],

數據卷容器

命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器

容器間傳遞共享(--volumes-from)

  1. 以上面的DockerFile添加建立的鏡像,先啓動一個父容器dc01

    在dataVolumeContainer2新增內容

  2. 啓動容器dc02/dc03繼承自dc01

    docker run -it --name dc02 --volumes-from dc01 hwj/centos
  3. 回到dc01能夠看到02/03各自添加的都能共享了

結論:容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止

相關文章
相關標籤/搜索