## 數據卷
數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
* 數據卷可以在容器之間共享和重用
* 對數據卷的修改會立馬生效
* 對數據卷的更新,不會影響鏡像
* 數據卷默認會一直存在,即使容器被刪除
*注意:數據卷的使用,類似于 Linux 下對目錄或文件進行 mount,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的數據卷。
### 創建一個數據卷
在用 `docker run` 命令的時候,使用 `-v` 標記來創建一個數據卷并掛載到容器里。在一次 run 中多次使用可以掛載多個數據卷。
下面創建一個名為 web 的容器,并加載一個數據卷到容器的 `/webapp` 目錄。
```
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
```
*注意:也可以在 Dockerfile 中使用 `VOLUME` 來添加一個或者多個新的卷到由該鏡像創建的任意容器。
### 刪除數據卷
數據卷是被設計用來持久化數據的,它的生命周期獨立于容器,Docker不會在容器被刪除后自動刪除數據卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數據卷。如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用 `docker rm -v` 這個命令。無主的數據卷可能會占據很多空間,要清理會很麻煩。Docker官方正在試圖解決這個問題,相關工作的進度可以查看這個[PR](https://github.com/docker/docker/pull/8484)
### 掛載一個主機目錄作為數據卷
使用 `-v` 標記也可以指定掛載一個本地主機的目錄到容器中去。
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
```
上面的命令加載主機的 `/src/webapp` 目錄到容器的 `/opt/webapp`
目錄。這個功能在進行測試的時候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,如果目錄不存在 Docker 會自動為你創建它。
*注意:Dockerfile 中不支持這種用法,這是因為 Dockerfile 是為了移植和分享用的。然而,不同操作系統的路徑格式不一樣,所以目前還不能支持。
Docker 掛載數據卷的默認權限是讀寫,用戶也可以通過 `:ro` 指定為只讀。
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py
```
加了 `:ro` 之后,就掛載為只讀了。
### 查看數據卷的具體信息
在主機里使用以下命令可以查看指定容器的信息
```
$ docker inspect web
...
```
在輸出的內容中找到其中和數據卷相關的部分,可以看到所有的數據卷都是創建在主機的`/var/lib/docker/volumes/`下面的
```
"Volumes": {
"/webapp": "/var/lib/docker/volumes/fac362...80535"
},
"VolumesRW": {
"/webapp": true
}
...
```
### 掛載一個本地主機文件作為數據卷
`-v` 標記也可以從主機掛載單個文件到容器中
```
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
```
這樣就可以記錄在容器輸入過的命令了。
*注意:如果直接掛載一個文件,很多文件編輯工具,包括 `vi` 或者 `sed --in-place`,可能會造成文件 inode 的改變,從 Docker 1.1
.0起,這會導致報錯誤信息。所以最簡單的辦法就直接掛載文件的父目錄。
- 前言
- Docker 簡介
- 什么是 Docker
- 為什么要用 Docker
- 基本概念
- 鏡像
- 容器
- 倉庫
- 安裝
- Ubuntu
- CentOS
- 鏡像
- 獲取鏡像
- 列出
- 創建
- 存出和載入
- 移除
- 實現原理
- 容器
- 啟動
- 守護態運行
- 終止
- 進入容器
- 導出和導入
- 刪除
- 倉庫
- Docker Hub
- 私有倉庫
- 配置文件
- 數據管理
- 數據卷
- 數據卷容器
- 備份、恢復、遷移數據卷
- 使用網絡
- 外部訪問容器
- 容器互聯
- 高級網絡配置
- 快速配置指南
- 配置 DNS
- 容器訪問控制
- 端口映射實現
- 配置 docker0 網橋
- 自定義網橋
- 工具和示例
- 編輯網絡配置文件
- 實例:創建一個點到點連接
- 實戰案例
- 使用 Supervisor 來管理進程
- 創建 tomcat/weblogic 集群
- 多臺物理主機之間的容器互聯
- 標準化開發測試和生產環境
- 安全
- 內核名字空間
- 控制組
- 服務端防護
- 內核能力機制
- 其它安全特性
- 總結
- Dockerfile
- 基本結構
- 指令
- 創建鏡像
- 底層實現
- 基本架構
- 名字空間
- 控制組
- 聯合文件系統
- 容器格式
- 網絡
- Docker Compose 項目
- 簡介
- 安裝
- 使用
- 命令說明
- YAML 模板文件
- Docker Machine 項目
- 簡介
- 安裝
- 使用
- Docker Swarm 項目
- 簡介
- 安裝
- 使用
- 調度器
- 過濾器
- Etcd 項目
- 簡介
- 安裝
- 使用 etcdctl
- Fig 項目
- 簡介
- 安裝
- 命令參考
- fig.yml參考
- 環境變量參考
- 實戰 Django
- 實戰 Rails
- 實戰 wordpress
- CoreOS 項目
- 簡介
- 工具
- 快速搭建CoreOS集群
- Kubernetes 項目
- 簡介
- 快速上手
- 基本概念
- kubectl 使用
- 架構設計
- Mesos 項目
- 簡介
- 安裝與使用
- 原理與架構
- 配置項解析
- 常見框架
- 附錄一:命令查詢
- 附錄二:常見倉庫介紹
- Ubuntu
- CentOS
- MySQL
- MongoDB
- Redis
- Nginx
- WordPress
- Node.js
- 附錄三:有用的資源