Docker 數據管理html
如何在 Docker 內部以及容器之間管理數據,在容器中管理數據主要有兩種方式:nginx
數據卷(Volumes)web
掛載主機目錄 (Bind mounts)docker
數據卷 ubuntu
是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:bash
數據卷 能夠在容器之間共享和重用curl
對 數據卷 的修改會立馬生效ide
對 數據卷 的更新,不會影響鏡像測試
數據卷 默認會一直存在,即便容器被刪除url
注意:數據卷的使用,相似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定爲掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的數據卷。
建立一個數據卷
# docker volume create my-vol
my-vol
查看全部的數據卷
# docker volume ls
DRIVER VOLUME NAME
local my-vol
查看指定數據卷的信息
# docker volume inspect my-vol
[ { "CreatedAt": "2018-05-16T11:17:19+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]
啓動一個掛載數據卷的容器
Docker 新用戶推薦使用 --mount 參數,將數據卷掛載到容器裏。在一次docker run 中能夠掛載多個數據卷。
# docker run -d -p 8080:80 --name web --mount source=my-vol,target=/usr/share/nginx/html nginx
把宿主機本地my-vol數據卷掛載到nginx容器的默認目錄;
[root@localhost _data]# pwd
/var/lib/docker/volumes/my-vol/_data
[root@localhost _data]# ls -l
-rw-r--r-- 1 root root 39 May 16 11:24 index.html
使用curl測試,訪問到的內容是本地文件;
# curl http://localhost:8080
<html>
<h1>Docker is fun!</h1>
</html>
查看數據卷的具體信息
# docker inspect web
數據卷的信息在Mounts這一段
"Mounts": [ { "Type": "volume", "Name": "my-vol", "Source": "/var/lib/docker/volumes/my-vol/_data", "Destination": "/usr/share/nginx/html", "Driver": "local", "Mode": "z", "RW": true, "Propagation": ""
刪除數據卷
# docker volume rm my-vol
數據卷是被設計用來持久化數據的,它的生命週期獨立於容器,Docker 不會在容器被刪除後自動刪除數據卷,而且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷。
若是須要在刪除容器的同時移除數據卷。能夠在刪除容器的時候使用 docker rm -v 這個命令。
清理無主的數據卷命令
# docker volume prune
監聽主機目錄
掛載一個主機目錄做爲數據卷
# docker run -d -p 8080:80 --name nginx-web --mount type=bind,source=/usr/local/src,target=/opt,readonly nginx
加載宿主機的/usr/local/src 目錄到容器的/opt目錄,readonly只讀掛載。
本地目錄必須是絕對路徑而且目錄要存在,不然會報錯bind source path does not exist
在容器內創建文件會提示只讀系統。
# docker exec -it afa bash
root@afa7bbf270ce:/opt# touch abc
touch: cannot touch 'abc': Read-only file system
查看數據卷的具體信息
# docker inspect nginx-web
"Mounts": [ { "Type": "bind", "Source": "/usr/local/src", "Destination": "/opt", "Mode": "", "RW": false, "Propagation": "rprivate" }
掛載一個本地主機文件做爲數據卷
# docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:16.04 bash
root@9a22d85fba61:/# whoami
root
root@9a22d85fba61:/# pwd
/
root@9a22d85fba61:/# exit
exit
把本地.bash_history文件掛載到容器裏,就能夠記錄在容器輸入過的命令
[root@localhost volumes]# cat /root/.bash_history
whoami
pwd
exit