概念
Docker中的數據可以存儲在類似於虛擬機磁盤的介質中,在Docker中稱爲數據卷(Data Volume)。數據卷可以用來存儲Docker應用的數據,也可以用來在Docker容器間進行數據共享。
Docker的理念將運行的環境打包形成容器運行,運行可以伴隨容器,但是我們對數據的要求是希望持久化,容器之間可以共享數據,Docker容器產生的數據,如果不通過docker commit生成新的鏡像,使得數據作爲容器的一部分保存下來,那麼當容器被刪除之後,數據也就沒了,爲了能夠保存數據,在docker容器中使用卷。
數據卷呈現給Docker容器的形式就是一個目錄,支持多個容器間共享,不屬於聯合文件系統,修改也不會影響鏡像。使用Docker的數據卷,類似在系統中使用 mount 掛載一個文件系統。
卷的設計目的就是數據的持久化,完全獨立與容器的生命週期,因此Docker不會在容器刪除時刪除其掛載的數據卷。
特點:
- 數據卷可以在容器之間共享和重用數據。
- 卷的更改可以直接生效。
- 數據卷的更改不會包含在鏡像的更新中。
- 數據卷的生命週期一直持續到沒有容器使用它爲止。
容器數據券添加
命令添加
創建數據券
$ docker run -it -v /宿主機目錄:/容器目錄 鏡像名
執行命令後,在宿主機和容器創建數據券目錄
使用命令 docker inspect 6946198b2e8c
查看數據券是否掛載成功
掛載成功後,就可以實現容器和宿主機之間的數據共享,在容器內操作的數據會同步到宿主機,在宿主機操作的數據也會同步到容器
數據券權限
$ docker run -it -v /宿主機目錄:/容器目錄:ro 鏡像名
在容器目錄後加:ro(readonly),是創建只讀數據券,這樣只允許宿主機單向操作數據券,而容器內不能操作數據券
DockerFile添加
出於可移植和分享的考慮,用-v主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。由於宿主機目錄是依賴於特定宿主機的,並不能保證在所有的宿主機上都存在這樣的特定目錄
DockerFile可以使用VOLUME指令給鏡像添加一個或者多個數據券
1.DockerFile的構建
該DockerFile表示基於centos,創建兩個數據卷,並打印“start my docker image…”,然後執行/bin/bash
該DokcerFile含義類似於docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash
2.build後生成鏡像
命令:docker build [OPTIONS] PATH | URL | -
Options:
-f 後綴dockerfile文件路徑
執行build命令,創建鏡像,可以看到,控制檯打印了“start my docker image…”
如圖創建鏡像成功
3. 使用鏡像運行容器
創建鏡像之後,我們就可以使用docker run
來運行容器
運行之後,查看目錄,發現容器券創建成功,但是這時候有個問題,我們在命令添加數據券的時候指定了宿主機的目錄,可以和容器內數據券目錄共享,但是用dockerfile執行因爲沒有指定宿主機目錄,那容器數據券如何共享呢?實際上docker給我們創建了默認的宿主機目錄
注: 如果碰到Dokcer掛載主機目錄Docker訪問出現cannot opendirectory …Permission denied 在掛載目錄後加上 --privileged=true參數即可
數據卷容器
命名的容器掛載數據卷,其他容器通過掛載這個容器(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器
數據卷共享命令:–volumes-from
創建第一個容器,容器內創建容器數據卷,在數據卷內創建一個文件,這個容器就是數據卷容器
我們以第一個容器作爲父容器,創建二個容器
docker run -it --name container02 --volumes-from container01 wmx/centos
docker run -it --name container03 --volumes-from container01 wmx/centos
從上圖我們可以看出,我在父容器中創建的文件出現在了容器2中,容器2中創建的文件也出現在了容器3中,我們在容器3(子容器)中創建的文件,也出現在了容器1中,可見,並不是只有父容器可以向子容器共享文件,子容器中創建的文件也能共享到父容器中。而且即使我們刪除父容器,因爲數據已經共享到子容器,也不會影響數據