數(shù)據(jù)卷
是一個可提供一個或多個容器使用的特殊目錄诡挂,它繞過 UFS
,可以提供很多有用的特性
- 可以在容器見共享和重用
- 修改立即生效
- 更新不影響鏡像
- 默認一致存在半火,即使容器被刪除
注意:數(shù)據(jù)卷的使用,類似 Linux 下對目錄或文件進行 mount
,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉方库,能顯示看的是掛載的數(shù)據(jù)卷
選擇 -v
還是 --mount
參數(shù):Docker 新用戶應該選擇 --mount
參數(shù),經(jīng)驗豐富的 Docker 使用者對 -v
或者 --volume
已經(jīng)很熟悉了障斋,但是推薦使用 --mount
參數(shù)
創(chuàng)建一個數(shù)據(jù)卷
$ docker volume create my-vol
查看所有的數(shù)據(jù)卷
$ docker volume ls
DRIVER VOLUME NAME
local my-vol
在主機里使用一下命令可以查看指定數(shù)據(jù)卷的信息
$ docker volume inspect my-vol
[
{
"CreatedAt": "2020-03-03T16:43:26+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
啟動一個掛載數(shù)據(jù)卷的容器纵潦,在用 docker run
命令的時候,使用 --mount
標記來將數(shù)據(jù)卷掛載到容器里垃环。在一次 docker run
中可以掛載多個數(shù)據(jù)卷邀层。下面創(chuàng)建一個名為 web 的容器,并加載一個數(shù)據(jù)卷到容器的 /webapp
目錄
$ docker run -d -p --name web --mount source=my-vol,target=/webapp training/webapp python app.py
查看數(shù)據(jù)卷的具體信息
$ docker inspect web
...
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
刪除數(shù)據(jù)卷
$ docker volume rm my-vol
數(shù)據(jù)卷是被設計用來持久化數(shù)據(jù)的遂庄,它的聲明周期獨立于容器寥院,Docker 不會在容器被刪除后自動刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數(shù)據(jù)卷涛目。如果需要在刪除容器的同時移除數(shù)據(jù)卷秸谢。可以在刪除容器的時候使用 docker rm -v
這個命令霹肝。無主的數(shù)據(jù)卷可能會占據(jù)很多空間估蹄,要清理可用如下命令
$ docker volume prune
掛載主機目錄
選擇 -v
還是 --mount
參數(shù),Docker 新用戶應該選擇 --mount
參數(shù)沫换,經(jīng)驗豐富的 Docker 使用者對 -v
或者 -volume
已經(jīng)很熟悉了臭蚁,但是推薦使用 --mount
參數(shù)
掛載一個主機目錄作為數(shù)據(jù)卷,使用 --mount
標記可以指定掛載一個本地主機的目錄到容器中去
$ docker run -d -p --name web --mount type=bind,source=/src/webapp,target=/opt/webapp training/webapp python app.py
上面的命令加載主機的 /src/webapp
目錄到容器的 /opt/webapp
目錄讯赏。這個功能在進行測試的時候十分方便垮兑,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作待逞。本地目錄的路徑必須是絕對路徑甥角,以前使用 -v
參數(shù)時如果本地目錄不存在 Docker 會自動創(chuàng)建一個文件夾,現(xiàn)在使用 --mount
參數(shù)時如果本地目錄不存在识樱,Docker 會報錯
Docker 掛載主機目錄的默認權(quán)限是 rw
嗤无,用戶也可以通過增加 readonly
指定為只讀
$ docker run -d -p --name web --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly training/webapp python app.py
加了 readonly
之后,就掛載為只讀了怜庸,若在容器內(nèi) /opt/webapp
目錄新建文件当犯,會顯示如下錯誤
/opt/webapp # touch new.txt
touch: new.txt: Read-only file system
查看數(shù)據(jù)卷的具體信息,在主機里使用一下命令可以查看 web 容器的信息
$ docker inspect web
...
"Mounts": [
{
"Type": "bind",
"Source": "/src/webapp",
"Destination": "/opt/webapp",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
掛載一個本地主機文件作為數(shù)據(jù)卷割疾,--mount
標記也可以從主機掛載單個文件至容器中
$ docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:17.10 bash
root@2affd44b4667:/# history
1 ls
2 diskutil list
這樣就可以記錄容器中輸入的命令了