devops基礎---docker容器數據持久化和數據共享

docker 主要有兩種數據存儲形式, 一種是storage driver(也叫做 Graph driver), 另一種是 volume driver.下面我們就來看看這二種的存儲形式那些不同。

devops基礎---docker容器數據持久化和數據共享

1.storage driver

容器運行的文件系統是鏡像層和容器層組成的, 一層一層疊加, 只有最上面的那層是可寫的, 其他層都是隻讀的. Docker通過Union FS技術支持文件的讀寫和新建, Docker 採用插件式的方式支持多種Union FS實現, 官方文檔中一般使用stroage driver術語, 目前已經有多種實現的插件, 比如:
aufs/overlay/overlay2/devicemanger等等.

修改Docker存儲形式

要修改docker的存儲形式,實現還是蠻簡單的,主要用如下二種方法:

1.創建或者修改/etc/docker/daemon.json

{
"storage-driver": "overlay2" 
}

2.修改
/usr/lib/systemd/system/docker.service

[root@centos7 mycentos]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -D -s overlay2 --graph=/data/docker/images -H unix:///var/run/docker.sock --insecure-registry=10.16.15.210

在ExecStart這一行加 -s overlay2 參數。

下面給出幾個查詢storage driver的命令:

docker info 命令, 查詢docker運行環境使用的storage-driver.
docker image inspect 命令,查看鏡像使用的存儲driver.
docker container inspect 命令,查看容器使用的存儲driver.

2.volume driver

volume driver 經常用來實現數據持久化和文件共享功能, 具體有下面的存在方式, 分別是:

2.1 bind mount 方式:

是將host的目錄或文件直接mount到容器中, host的目錄或文件既可以容器運行之前就已存在的, 也可以是在容器運行之前不存在的.

如果在docker run 命令中採用了 -v
/host/dir_or_file:/container/dir_or_file的形式, 就是bind mount方式, 即指定了host的掛載點的絕對路徑.

例子:

[root@centos7 mycentos]#
docker run -d --name web -v /data/webapp
:/opt/webapp busybox /bin/sh -c "while true; do echo hello world; sleep 1; done"

#使用 bind mount 方式, host上的目錄為 /data

查看數據卷的具體信息:在主機裡使用以下命令可以查看 web容器的信息

[root@centos7 mycentos]# docker inspect web
...
"Mounts": [
 {
 "Type": "bind",
 "Source": "/data/webapp",
 "Destination": "/opt/webapp",
 "Mode": "",
 "RW": true,
 "Propagation": "rprivate"
 }
],

掛載一個本地主機文件作為數據卷:

[root@centos7 mycentos]#docker run -d --name web 
 -v $HOME/.bash_history:/root/.bash_history busybox /bin/sh

2.2 volume 方式:

是由 Docker 管理, 默認情況下該volume最終存儲到host的 /var/lib/docker/volumes 下. volume 方式還分為 named volume 和 Anonymous volume.

devops基礎---docker容器數據持久化和數據共享

數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過UFS,可以提供很多有用的特性:

  • 數據卷 可以在容器之間共享和重用
  • 對 數據卷 的修改會立馬生效
  • 對 數據卷 的更新,不會影響鏡像
  • 數據卷 默認會一直存在,即使容器被刪除

named volume 有兩種創建方法,

(1) docker run 命令中採用了 -v
one_volume_name:/container/dir_or_file , 這裡的one_volume_name不是host中的絕對路徑, 而是一個名稱.

(2) 通過 docker volume create 創建的, 該命令支持更多的選項, 推薦使用.

匿名volume方式 是通過 docker run 命令中傳入了 -v /container/dir 類型的參數.

bind mount 方式和volume方式的簡單對比:

bind mount方式, docker容器直接訪問host的目錄或文件, 性能是最好的.

bind mount方式, docker容器直接訪問host的目錄或文件, 對於該host絕對目錄可能會引入權限問題. 如果容器僅需要只讀訪問權限, 最好是顯式設定只讀方式.

對於 volume方式, 如果host中落地目錄為空, docker先將容器中的對應目錄複製到host下, 然後再進行掛載操作; 對於bind mount方式, 掛載之前沒有複製操作.

容器要依賴host主機的一個絕對路徑, 使得容器的移植性變差, docker 官方並不推薦這個方法, 而是推薦使用volume.

創建一個數據卷:

[root@centos7 mycentos]#docker volume create my-vol

查看所有的數據卷:

[root@centos7 mycentos]# docker volume ls
local my-vol

在主機裡使用以下命令可以查看指定數據卷的信息

[root@centos7 mycentos]# docker volume inspect my-vol
[
 {
 "Driver": "local",
 "Labels": {},
 "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
 "Name": "my-vol",
 "Options": {},
 "Scope": "local"
 }
]

在容器中掛載指定數據卷

[root@centos7 mycentos]# docker run -d -P --name web -v my-vol:/wepapp \
busybox /bin/sh
掛載上來後,我們就像上面一樣,用docker inspect web來查看詳細的信息。

2.3 數據容器

數據容器是指那些只用來保存數據的容器。通常會在容器中創建一個或多個卷,其他的容器就可以通過--volumes-from選項來訪問它們。

devops基礎---docker容器數據持久化和數據共享

例如,我們先運行一個名為storage的數據容器,它包含一個卷並在後臺運行:

[root@centos7 mycentos]# docker run -d -v /data --name storage centos

接下來我們運行另一個容器:

[root@centos7 mycentos]# docker run -it --volumes-from storage centos bash


分享到:


相關文章: