Docker 第六章 存儲卷

Docker volume 的幾種形態

有狀態容器都有數據持久化需求。前一篇文章中提到過,Docker 採用分層文件系統時,文件系統的改動都是發生在最上面的容器層。在容器的生命週期內,它是持續的,包括容器在被中止後。可是,當容器被刪除後,該數據層也隨之被刪除了。所以,Docker 採用 volume (卷)的形式來向容器提供持久化存儲。Docker volume 有以下幾種形態。

 

  不使用 Docker volume

默認狀況下,容器不使用任何 volume,此時,容器的數據被保存在容器以內,它只在容器的生命週期內存在,會隨着容器的被刪除而被刪除。固然,也可使用 docker commit 命令將它持久化爲一個新的鏡像。

  

  Data volume (數據卷)

 

一個 data volume 是容器中繞過 Union 文件系統的一個特定的目錄。它被設計用來保存數據,而無論容器的生命週期。所以,當你刪除一個容器時,Docker 確定不會自動地刪除一個volume。有以下幾種方式來使用 data volume:

  (1)使用 「-v 容器內目錄」 形式git

[root@localhost ~]# docker run -dit --name v1 -v /test_data busybox
ca436842125042039399e9b8c5854d1e45e27c9798f4f4547749f6f07593643e
[root@localhost ~]# 

  

  "Mounts": [           -v /test_data 在docker 容器中建立一個 test_data 目錄而且經過聯合文件系統將docker 自動建立的目錄掛在到一塊兒,我理解至關於容器和宿主機文件目錄的互相映射
            {
                "Type": "volume",
                "Name": "16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45",
                "Source": "/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data",
                "Destination": "/test_data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

  

[root@localhost ~]# docker exec -it ca4368421250 sh

/ # ls
bin        etc        proc       sys        tmp        var
dev        home       root       test_data  usr
/ # 

 

其實,在busybox  容器被刪除後,/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data目錄及其中的內容都還會保留下來,可是,新啓動的容器沒法再使用這個目錄,也就是說,已有的數據不能自動地被重複使用了 

  

使用 -v 來掛載一個主機上的目錄到容器的目錄  github

#format :    -v host_file:docker_faile
 
[root@localhost /]# docker run -it --name v2 -v /boot:/boot busybox / # ls bin boot dev etc home proc root sys tmp usr var / # cd boot /boot # ls System.map-3.10.0-957.el7.x86_64 config-3.10.0-957.el7.x86_64 efi grub grub2 initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.img initramfs-3.10.0-957.el7.x86_64.img initramfs-3.10.0-957.el7.x86_64kdump.img symvers-3.10.0-957.el7.x86_64.gz vmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389 vmlinuz-3.10.0-957.el7.x86_64

  

使用 data container

若是要在容器之間共享數據,最好是使用 data container。這種 container 中不會跑應用,而只是掛載一個卷。好比:

建立一個 data container:
#format  :  --volumes-from v2   #繼承某個容器的卷文件

[root@localhost boot]# docker run -it --name v3 --volumes-from v2 busybox / # / # ls bin boot dev etc home proc root sys tmp usr var / # ls /boot System.map-3.10.0-957.el7.x86_64 config-3.10.0-957.el7.x86_64 efi grub grub2 initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.img initramfs-3.10.0-957.el7.x86_64.img initramfs-3.10.0-957.el7.x86_64kdump.img symvers-3.10.0-957.el7.x86_64.gz vmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389 vmlinuz-3.10.0-957.el7.x86_64

  

使用 docker volume 命令

[root@localhost boot]# docker volume --help

Usage:	docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
[root@localhost boot]# 

Docker 新版本中引入了 docker volume 命令來管理 Docker volume。docker

(1)使用默認的 ‘local’ driver 建立一個 volumebash

[root@localhost boot]# docker volume create --name voll
voll
[root@localhost boot]# docker volume inspect voll
[
    {
        "CreatedAt": "2019-06-12T22:58:45-04:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/voll/_data",
        "Name": "voll",
        "Options": {},
        "Scope": "local"
    }
]
[root@localhost boot]# 

使用這個 volumespa

[root@localhost _data]# docker run -it --name v6 -v voll:/volume busybox
/ # ls
bin     dev     etc     home    proc    root    sys     tmp     usr     var     volume
/ # cd volume/
/volume # ls
1qaz
/volume # 

  

可使用 docker rm -vf 命令在刪除容器時刪除該容器的卷。

 

[root@localhost /]# docker volume ls   #強制刪除容器和卷文件
DRIVER              VOLUME NAME
local               d8a9ddb3f7ce482f170b88485b1f5802a9437c0921daf5e77ab170a18bf4ad4e
[root@localhost /]# docker rm -vf v1
v1
[root@localhost /]# docker volume ls
DRIVER              VOLUME NAME
[root@localhost /]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost /]# 

  

 

github 上有不少腳本能夠自動化地清理孤單卷,好比:設計

相關文章
相關標籤/搜索