咱們能夠在概念上把docker看作虛擬機,當容器被刪除的時候,容器裏全部數據都會被刪除,兩個不一樣容器之間沒法互通
能夠把數據卷理解爲虛擬機的虛擬磁盤,他是獨立於容器的文件.在容器中他被掛載爲一個目錄的形式.
對於容器中的應用來講,數據卷是透明的,沒法感知它的存在,他就是一個普通的文件夾
因爲數據卷獨立於容器而存在,所以刪除容器的時候數據卷也不會受影響。數據卷有如下優勢:html
# 建立一個volume docker volume create testvolume # 列出全部數據卷 docker volume ls # 刪除一個數據卷 docker volume rm testvolume
# 先建立數據卷 docker volume create web # 在運行容器的時候,使用參數--mount 以下 # 下面的參數含義是把數據卷(web)掛載到容器的/volume目錄上面 # 這裏的webimage 鏡像能夠用我前面文章寫得Dockerfile生成 # 這樣就運行了一個帶有數據卷的容器,這個容器的/volume目錄中的內容在容器被刪除以後仍然存在. # 由於它其實是存在Docker數據卷中。 docker run -d --name demovolume --mount source=web,target=/volume webimage
# 執行命令在容器的 /b.txt 寫入時間內容並查看 docker exec demovolume sh -c 'date > /b.txt' docker exec demovolume sh -c 'cat /b.txt' # 刪除容器後從新啓動一個同名容器在查看,以前容器的內容已經沒有了 docker rm -f demovolume docker run -d --name demovolume --mount source=web,target=/volume webimage docker exec demovolume sh -c 'cat /b.txt' # 保存在數據捲上的文件,即便容器被刪除仍然存在 docker exec demovolume sh -c 'date > /volume/b.txt' docker rm -f demovolume docker run -d --name demovolume --mount source=web,target=/volume webimage docker exec demovolume sh -c 'cat /volume/b.txt'
除了掛載數據卷之外,docker還能夠掛載共享目錄(這一點和虛擬機同樣),共享目錄的優點是使用方便,易於理解,能夠在某些場景下方便使用
(好比開發是在宿主機中修改源代碼docker中實時生效省卻build鏡像的過程)
下面用一個具體的例子來演示掛載共享目錄的用法:nginx
在當前目錄下建立index.htmlgit
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>volume</title> </head> <body> <h1>這是一個在宿主機的 index.html 文件。</h1> </body> </html>
打開終端輸入github
# 下面的命令會從nginx鏡像運行一個名爲nginx1的容器 # 而且設置了8080:80的端口映射 # --mount 參數的 type=bind 代表要掛載的共享目錄 # 把宿主機的當前目錄映射爲容器的 /usr/share/nginx/html (這是nginx容器的靜態頁面文件存放路徑) # 這樣在宿主機中訪問localhost:8080會自動訪問宿主機當前目錄下的index.html文件 (這是nginx的默認靜態文件首頁) docker run -p 8080:80 --name nginx1 --mount type=bind,source="${PWD}",target=/usr/share/nginx/html/ nginx # 須要注意的是source參數必須使用絕對路徑 # 因此這裏使用"${PWD}"的方式來在 Mac/Linux/Windows 中獲取當前目錄路徑 # 這是一個能夠在多平臺通用的獲取當前目錄路徑的方法 (windows下必須使用PowerShell) # 加引號是由於路徑中可能含有空格等特殊符號,若是路徑有空格而未加引號,會產生錯誤
除了掛載整個目錄,還能夠單獨掛載一個文件。 若是要掛載單個文件,必定要要保證宿主機文件存在,不然整個路徑會被認爲是一個目錄掛載web
打開終端輸入如下命令docker
docker run -p 8081:80 \ --name nginx2 \ --mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/html/test.html \ nginx # 這時候咱們訪問http://localhost:8081 返回的是nginx的默認首頁 # 而訪問http:/localhost:8081/test.html 返回的是掛載的單個文件
注意:能夠建立多文件掛載windows
docker run -p 8082:80 \ --name nginx3 \ --mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/test.html/ \ --mount type=bind,source="${PWD}"/test.html,target=/usr/share/nginx/test2.html/ \ nginx