容器的存儲
1.容器內(nèi)部掛載和使用宿主機(jī)的存儲卷砌滞。掛載到一個容器的卷也可以讓其他容器使用晴楔。
2.Docker自身會使用宿主機(jī)的一個存儲區(qū)來管理該宿主機(jī)上Docker鏡像和容器泻骤。
討論保證數(shù)據(jù)持久性的幾種模式:
- 默認(rèn)模式:不支持任何持久性
- 數(shù)據(jù)卷:容器持久性
- 僅含數(shù)據(jù)的容器:容器持久性
- 從主機(jī)映射而得的卷:容器持久性
- 從主機(jī)映射而得的卷限书,存儲后端是共享存儲:主機(jī)持久性
- Convoy 卷插件:主機(jī)持久性
上述幾種持久性(我自己發(fā)明的)是什么意思呢奇瘦?
- 容器持久性:升級容器并不會移除數(shù)據(jù)
- 主機(jī)持久性:主機(jī)失效也不會引起數(shù)據(jù)丟失
http://dockone.io/article/1283
數(shù)據(jù)卷
數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS验靡,可以提供很多有用的特性:
- 數(shù)據(jù)卷可以在容器之間共享和重用
- 對數(shù)據(jù)卷的修改會立馬生效
- 對數(shù)據(jù)卷的更新倍宾,不會影響鏡像
- 數(shù)據(jù)卷默認(rèn)會一直存在,即使容器被刪除
注意:數(shù)據(jù)卷的使用胜嗓,類似于 Linux 下對目錄或文件進(jìn)行 mount高职,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的數(shù)據(jù)卷辞州。
創(chuàng)建數(shù)據(jù)卷
創(chuàng)建一個名為 web 的容器怔锌,并加載一個數(shù)據(jù)卷到容器的 /webapp
目錄。
docker run -d -P --name web -v /webapp webapp
刪除數(shù)據(jù)卷
數(shù)據(jù)卷是被設(shè)計用來持久化數(shù)據(jù)的变过,它的生命周期獨立于容器埃元,Docker不會在容器被刪除后自動刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機(jī)制來處理沒有任何容器引用的數(shù)據(jù)卷媚狰。如果需要在刪除容器的同時移除數(shù)據(jù)卷岛杀。可以在刪除容器的時候使用 docker rm -v
掛載主機(jī)目錄作為數(shù)據(jù)卷
使用 -v 標(biāo)記也可以指定掛載一個本地主機(jī)的目錄到容器中去崭孤。
docker run -d -P --name web -v /src/webapp:/opt/webapp webapp
Docker 掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫类嗤,用戶也可以通過 :ro 指定為只讀。
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro webapp
注意:Dockerfile 中不支持這種用法辨宠,這是因為 Dockerfile 是為了移植和分享用的土浸。然而,不同操作系統(tǒng)的路徑格式不一樣彭羹,所以目前還不能支持黄伊。
查看數(shù)據(jù)卷的具體信息
docker inspect --format "{{json .Mounts }}" dock_registry_1
掛載一個本地主機(jī)文件作為數(shù)據(jù)卷
記錄在容器輸入過的命令
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
注意:如果直接掛載一個文件,很多文件編輯工具派殷,包括 vi 或者 sed --inplace 还最,可能會造成文件 inode 的改變,從 Docker 1.1.0起毡惜,這會導(dǎo)致報錯誤信息拓轻。所以最簡單的辦法就直接掛載文件的父目錄。
數(shù)據(jù)卷容器
如果你有一些持續(xù)更新的數(shù)據(jù)需要在容器之間共享经伙,最好創(chuàng)建數(shù)據(jù)卷容器扶叉。
數(shù)據(jù)卷容器勿锅,其實就是一個正常的容器,專門用來提供數(shù)據(jù)卷供其它容器掛載的枣氧。
首先溢十,創(chuàng)建一個名為 webapp_code 的數(shù)據(jù)卷容器
docker run -d -v /webapp --name webapp_code centos
在其他容器中使用 --volumes-from
來掛載 webapp_code 容器中的數(shù)據(jù)卷。--volumes-from
支持級聯(lián)掛載达吞。
docker run -it --volumes-from webapp_code --name webapp_1 centos /bin/bash
docker run -it --volumes-from webapp_1 --name webapp_2 centos /bin/bash
數(shù)據(jù)卷的容器自己并不需要保持在運行狀態(tài)张弛。
借助于容器進(jìn)行數(shù)據(jù)恢復(fù)
備份
首先使用 --volumes-from 標(biāo)記來創(chuàng)建一個加載 database 容器卷容器,并從主機(jī)掛載當(dāng)前目錄到容器的 /backup 目錄酪劫。命令如下:
docker run -d --volumes-from webapp_code -v $(pwd):/backup --name backup centos tar cf /backup/webapp.tar /webapp
容器啟動后吞鸭,使用了 tar 命令來將 database 卷備份為容器中 /backup/backup.tar.gz文件,也就是主機(jī)當(dāng)前目錄下的名為 backup.tar 的文件覆糟。
此處為何不直接從數(shù)據(jù)卷容器備份文件呢刻剥?
數(shù)據(jù)卷容器無法再次掛載用來備份的數(shù)據(jù)卷,所以只能將數(shù)據(jù)卷容器掛載到新的容器的同時掛載用來備份的數(shù)據(jù)卷滩字,將備份文件備份到本地的文件系統(tǒng)中造虏。
備份到本地后,直接解壓踢械,啟動新的數(shù)據(jù)卷容器時將解壓后的內(nèi)容直接掛載到新的數(shù)據(jù)卷容器中酗电。
為何不直接從本地文件系統(tǒng)備份數(shù)據(jù)卷容器中的內(nèi)容魄藕?
恢復(fù)
如果要恢復(fù)數(shù)據(jù)到一個容器内列,首先創(chuàng)建一個帶有空數(shù)據(jù)卷容器 dbdata2。
docker run -d -v /webapp --name new_webapp_code centos
然后創(chuàng)建另一個容器(這個容器只作為解壓使用)背率,掛載 dbdata2 容器卷中的數(shù)據(jù)卷话瞧,并使用 untar 解壓備份文件到掛載的容器卷中。
docker run -it --volumes-from new_webapp_code -v $(pwd):/backup --name temp_data centos tar xf /backup/webapp.tar
為了查看/驗證恢復(fù)的數(shù)據(jù)寝姿,可以再啟動一個容器掛載同樣的容器卷來查看
docker run -it --volumes-from new_webapp_code centos /bin/bash
使用文件系統(tǒng)進(jìn)行數(shù)據(jù)恢復(fù)
創(chuàng)建數(shù)據(jù)卷容器
創(chuàng)建時掛載本地的文件目錄
docker run -d -v /webapp:/webapp --name webapp_code centos
在其他容器中使用 --volumes-from
來掛載 webapp_code 容器中的數(shù)據(jù)卷交排。--volumes-from
支持級聯(lián)掛載。
docker run -it --volumes-from webapp_code --name webapp_1 centos /bin/bash
docker run -it --volumes-from webapp_1 --name webapp_2 centos /bin/bash
本地文件系統(tǒng)備份
cp /webapp /webapp_backup
創(chuàng)建新的數(shù)據(jù)卷容器
docker run -d -v /webapp_backup:/webapp --name webapp_code centos
清理容器
docker將其數(shù)據(jù)保存在/var/lib/docker/
目錄結(jié)構(gòu)中饵筑,需要確保該目錄有足夠的磁盤空間埃篓。
[root@localhost text]# df -h /var/lib/docker/
文件系統(tǒng) 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root 50G 17G 34G 34% /
刪除無用鏡像
docker image ls
精確一點搜索,鏡像的唯一標(biāo)識是 ID 和摘要根资,而一個鏡像可以有多個標(biāo)簽架专。
進(jìn)行鏡像刪除docker rmi (IMAGE ID)
刪除容器并進(jìn)行回收
注意刪除前需要對容器進(jìn)行打包備份
docker ps
查看正在運行或暫停的容器,這里面的是無法進(jìn)行容器刪除的
docker ps -a
里面已經(jīng)停止的容器可以進(jìn)行刪除
刪除容器命令docker rm CONTAINER ID
實際運維過程需要節(jié)省空間
https://blog.fundebug.com/2017/04/19/docker-system-explain/
https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/