Docker 爲容器提供了兩種存放數據的資源:html
docker的鏡像分層結構,以下所示:
Docker鏡像中引入層layer的概念,鏡像的製做過程當中的每一步擦歐總,都會生成一個新的鏡像層node
容器由最上面一個可寫的容器層,以及若干只讀的鏡像層組成,容器的數據就存放在這些層中。這樣的分層結構最大的特性是 Copy-on-Write:linux
Docker info
可查看當前系統使用的Storage driver
centos默認的driver用的是overlay2,底層的文件系統是xfs,各層數據存放在/var/lib/dockerdocker
對於某些容器如busybox只是個工具箱,不須要保存數據之後使用,使用完成後直接退出,容器刪除時存放在容器層中的工做數據也一塊兒被刪除。apache
docker容器中持久化數據通常採用兩種存儲方式:
volume
bind mount
不管是volume仍是bind mount,其本質上是宿主機文件系統中的目錄或者文件
不管是volume仍是bind mount,其上存放的數據生命週期對立於容器,即容器刪除以後,volume或者bind mount上的數據,依舊存在centos
Volume 本質上是 Docker Host 文件系統中的目錄或文件,可以直接被 mount 到容器的文件系統中。Volume 有如下特色:bash
由於 volume 其實是 docker host 文件系統的一部分,因此 volume 的容量取決於文件系統當前未使用的空間。架構
volume使用注意事項:app
bind mount 是將 host 上已存在的目錄或文件 mount 到容器。
ide
bind mount其實是一個inode替換的過程。
bind mount機制主要做用,容許一個目錄或者文件(不是整個設備)掛載到一個指定的目錄上,並且在該掛載點上進行任何的操做,只是發生在被掛載的目錄或者文件上,而原掛載點的內容則會被隱藏起來不受影響。
bind mount使用注意事項:
bind mount的用法是使用-v選項將host已經存在的目錄或者文件mount到容器
以下所示:
-v 的格式爲 <host path>:<container path>。/usr/local/apache2/htdocs 就是 apache server 存放靜態文件的地方。因爲 /usr/local/apache2/htdocs 已經存在,原有數據會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數據,這與 linux mount 命令的行爲是一致的。
數據共享是volume的關鍵特性,主機與容器數據共享:
volume container是專門爲其餘容器提供volume的容器。
由於 volume 其實是 host 文件系統中的目錄和文件,因此 volume 的備份其實是對文件系統的備份
volume 的恢復也很簡單,若是數據損壞了,直接用以前備份的數據拷貝
若是使用更新版本的 Registry,這就涉及到數據遷移,方法是:
volume刪除後數據是找不回來的,注意
docker 不會銷燬 bind mount,刪除數據的工做只能由 host 負責,再在執行 docker rm 刪除容器時能夠帶上 -v 參數,docker 會將容器使用到的 volume 一併刪除,但前提是沒有其餘容器 mount 該 volume。
建立一個卷,並掛載一個httpd容器docker run -d -p 8080:80 -v /usr/local/apache2/htdocs httpd
-v 將其mount到httpd容器
-v格式爲<host path>:<container path>。/usr/local/apache2/htdocs就是Apache Server存放靜態文件的地方,
因爲 /usr/local/apache2/htdocs 已經存在,原有數據會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數據。
檢查volume信息
docker volume ls
查看容器的volume掛載信息,同時獲得volume路徑,Type=volume
docker inspect d5db6a048612
查看volume中的數據
cd /var/lib/docker/volumes/6189c90831d019229a2e8593453fe1c334faec1fcc56db80b9f99773d21c9c55/_data
查看容器中相應的數據,結果:容器中的數據=volume中數據
進入容器更新index.html文件內容
docker exec -it d5db6a048612 bash cd htdocs && echo "update the index" > index.html
再次查看volume中的內容,已經同步跟新
由此實現容器和Host的數據共享。
強制刪除容器,而後查看volume中的數據,能夠看到依舊存在
docker rm -f d5db6a048612
將宿主機的/root/htdocs目錄以只讀的方式掛載給一個名爲httpd1的httpd容器,映射端口8081
docker run --name httpd1 -d -p 8081:80 -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd
查看容器掛載信息。Type=bind
docker inspect httpd1
在宿主機host上跟新index.html文件數據,印證httpd1容器中的數據也一塊兒跟新
由此 ,容器和Host的實現了數據共享
進入httpd1容器中更新index.html文件數據,提示Read-only
將宿主機/root/htdocs掛載給名爲httpd2的http容器,映射端口8082,不設置ro
docker run --name httpd2 -d -p 8082:80 -v /root/htdocs/:/usr/local/apache2/htdocs httpd
進入httpd2容器中更新index.html
docker exec -it httpd2 bash
分別查看宿主機、http1,http2中的數據,三者數據一致
此時印證容器間的數據實現共享