docker學習筆記03-數據卷

docker 容器在停止運行後將刪除用戶所存在的一切痕跡,也就是說你在服務器所保留的所有產生的數據將會消除痕跡,什麼mysql、redis將不保留任何數據,所以這個時候我們希望將用戶數據保留下來,就需要用到docker中一個非常重要的概念——數據卷

數據卷是一個可供一個或多個容器使用的特殊目錄, 它繞過 UFS, 可以提供很多有
用的特性:
數據卷可以在容器之間共享和重用
對數據卷的修改會立馬生效
對數據卷的更新, 不會影響鏡像
數據卷默認會一直存在, 即使容器被刪除

其實當我們安裝完docker的時候,就有數據捲了,默認位置存在於/var/lib/docker/volumes這個目錄下邊
我們也可以直接輸入docker volume ls 這條命令,查看現在當前存在的數據卷
在這裏插入圖片描述
我們看到當前數據卷沒有任何東西,我們可以通過命令docker volume create cent-volume來創建一個自己的數據卷:
在這裏插入圖片描述
這樣我們就完成創建了一個名爲cent-volume的數據卷,我們再通過上述命令來查看一下:
在這裏插入圖片描述
現在就能查看到了,
我們再到docker默認存儲volume的路徑下邊去看看:cd /var/lib/docker/volumes
在這裏插入圖片描述
我們看到在這個路徑下邊已經產生了相應的文件
輸入:docker volume inspect cent-volume
在這裏插入圖片描述
我們可以看到制定數據卷的詳細信息
當不再需要當前數據卷的時候,我們需要刪除數據卷信息:docker volume rm cent-volume
在這裏插入圖片描述
這樣就刪除了一個數據捲了

我們現在完成一個nginx掛在卷的綜合實驗,首先***我們需要準備好nginx鏡像***
1:創建一個掛在卷用來掛在nginx裏邊的數據,這裏我們去掛在nginx的html目錄,nginx默認安裝好後html路徑位於/usr/share/nginx/html

docker volume create nginx-vlo

這樣創建好了一個nginx掛在的數據卷
2:啓動nginx容器

docker run  -it --name=nginx -p 8800:80

之前我們的名是這樣,運行nginx,現在需要掛在的話修改下格式如下

docker run -d -it --name nginx -p 8800:80 -v nginx-vol:/usr/share/nginx/html  nginx:latest  

這裏-v 的意思就是掛在我們的數據捲到容器的某個文件位置去
我們現在來進入到這個數據卷中去,進入數據卷目錄的_data目錄中
在這裏插入圖片描述
我們發現多了連個文件夾,這裏就是把nginx-html文件夾中的數據掛在到我們在宿主機創建的目錄中來了
我們現在直接訪問,剛纔我們把nginx容器的80端口映射到了我們的8800端口(命令中),這個時候我們直接訪問宿主機的8800端口
在這裏插入圖片描述
(比自己安裝nginx快得多了)證明我們真實訪問到了容器,那麼我們現在直接修改宿主機掛載文件的類容
/var/lib/docker/volumes/nginx-vol/_data 這個目錄下修改index.html的類容如下
在這裏插入圖片描述
重點修改了紅線位置,我們再次去刷新頁面
在這裏插入圖片描述
頁面已經跟隨我們的改變而改變了
我們現在進入到容器裏邊去,和進入cent os docker attach f37f14ef6e7d 這種方式有點差別

docker exec -it nginx /bin/bash

這兩種命令的區別是

Docker attach可以attach到一個已經運行的容器的stdin,然後進行命令執行的動作。
但是需要注意的是,如果從這個stdin中exit,會導致容器的停止。
而exec是利用/bin/bash分配了一個終端

當使用exec命令進入終端後,我們輸入exit命令即可退出,而且不會把容器停止掉
在這裏插入圖片描述
這樣就進去了,我們找到nginx默認安裝html文件的位置cd /usr/share/nginx/html
在這裏插入圖片描述
可以清楚的看到
在這裏插入圖片描述
也就是說當我們改變的數據卷掛在的類容後,我們容器裏邊的類容也會同步發生改變

當然,有時候我們重要的數據,不希望直接掛載到我們docker默認數據卷的位置去,我們這個時候就需要採用Bind Mounts 去把docker的數據卷掛載到我們需要的位置去

假設我需要把nginx中的html目錄掛在到/usr目錄下,我們首先來看下/usr路徑
在這裏插入圖片描述
運行容器:docker run -d -it --name nginx -p 8800:80 -v /usr/html:/usr/share/nginx/html nginx:latest
這個時候我們/usr路徑下是沒有html目錄的的
在這裏插入圖片描述
運行成了
在這裏插入圖片描述
自動幫我們掛載了數據卷並且創建了文件,我們現在進入html目錄
在這裏插入圖片描述
並沒有和數據卷一樣把nginx的html中的index.html和50.html幫我們拷貝過來
我們在這個文件夾下邊自己創建一個index.html的文件
在這裏插入圖片描述
類容如下:


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>websocket通訊</title>

</head>

<body>
hello docker

</body>

</html>

再去瀏覽器中訪問
在這裏插入圖片描述
可以正常運行的,但是掛在卷爲啥不正常顯示呢?因爲

與volumes不同,bind mounts的方式會隱藏掉被掛載目錄裏面的內容(如果非空的話),這裏是/usr/share/nginx/html 目錄下的內容被隱藏掉了,因此我們看不到

但是這樣的好處就是我們不需要自己去創建數據卷,並且可以把文件掛在任意我們需要的位置去
Ps:這裏需要注意的是,容器及時沒有停止,依舊能刪除這種方式掛載的數據卷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章