19-数据持久化-Bind Mounting
19-數據持久化-Bind Mounting
Bind Mounting 與 Data Volume區別
Data Volume 需要在 Dockerfile 內聲明需要創建的 volume 目錄。
Bind Mounting 則不需要在 Dockerfile 聲明 volume,只需要在創建容器的時候,也就是 run 的時候聲明即可。
如:
docker run -v /home/aaa:/root/aaa demo上一節中 -v 參數是 mysql:/var/lib/mysql,冒號 “:” 左邊是對 /var/lib/mysql 這個目錄產生的volume起一個別名。
而在 Bind Mounting 中,-v 參數冒號 “:” 左邊是本地的目錄路徑,右邊是創建容器內的路徑,做一個映射。
Bind Mounting
通過 Bind Mounting 創建的 volume,在我們修改本地的目錄時,容器內對應的目錄也會跟著修改,因為是同一個volume。
接下來我們通過一個實驗來查看。
創建一個docker-nginx文件夾,并進入
mkdir docker-nginx cd docker-nginx創建Dockerfiile和index.html兩個文件
touch Dockerfile index.html修改Dockerfile文件如下:
FROM nginx:latestWORKDIR /usr/share/nginx/htmlCOPY index.html index.html修改index.html文件如下:
<html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>創建鏡像
docker build -t vincent/my-nginx .創建容器
docker run -d -p 80:80 --name web vincent/my-nginx查看運行狀態
[vagrant@10 docker-nginx]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 190b2e296c54 vincent/my-nginx "nginx -g 'daemon of…" 2 seconds ago Up 1 second 0.0.0.0:80->80/tcp web可以看到web容器是up的。
訪問本機80端口獲取web容器的內容
[vagrant@10 docker-nginx]$ curl 127.0.0.1 <html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>curl使用http協議的時候默認是80端口,https默認是443,我們是可以不需要加端口號的。
我們也可以在筆記本中去訪問這臺虛擬機的80端口服務
vincent@dell-Inspiron-7559$: curl http://192.168.2.32 <html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>也可以通過瀏覽器訪問查看,ip首先要在虛擬機內通過ip a獲取。
重新創建web容器并指定volume
刪除web容器
docker rm -f web這條命令會強制刪除一個正在運行的容器,不推薦使用。
重新創建容器,并指定掛載 /home/vagrant/docker-nginx/ 目錄。
docker run -d -p 80:80 -v /home/vagrant/docker-nginx/:/usr/share/nginx/html --name web vincent/my-nginx查看被掛載的目錄在容器內情況
進入web容器
docker exec -it web /bin/bash查看 /usr/share/nginx/html 目錄下有哪些內容
root@cb7e310d02fd:/usr/share/nginx/html# ls /usr/share/nginx/html Dockerfile index.html我們發現在 /home/vagrant/docker-nginx/ 文件夾內的Dockerfile文件被映射進來了。
那我們在 /usr/share/nginx/html 文件夾內創建一個 test.txt 文件,看看是否在 外部也能看到
touch test.txt創建好之后退出web容器,進入/home/vagrant/docker-nginx/目錄下查看
exit [vagrant@10 docker-nginx]$ ls Dockerfile index.html test.txt我們發現同樣被映射到了外面 docker-nginx 目錄下。同樣我們可以測試在容器內修改 test.txt 文件看看里外是否同步。
進入web容器
docker exec -it web /bin/bash修改test.txt文件
root@cb7e310d02fd:/usr/share/nginx/html# echo "1234" >> test.txt root@cb7e310d02fd:/usr/share/nginx/html# cat test.txt 1234完成后我們退出容器并查看這個文件是否同步了
exit [vagrant@10 docker-nginx]$ cat test.txt 1234結果是同樣發生了同步。因為我們修改的其實是同一個文件。
熱更新
我們再次執行一次curl獲取web內容
[vagrant@10 flask-app]$ curl 127.0.0.1 <html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>此時我們手動修改本機目錄下的index.html文件
nano docker-nginx/index.html修改如下:
<html> <body><h1>Bind Mounting</h1><p>This is a app.</p></body> </html>驗證在不重啟nginx服務器的情況下是否web內容發生變化
[vagrant@10 docker-nginx]$ curl 127.0.0.1 <html> <body><h1>Bind Mounting</h1><p>This is a app.</p></body> </html>我們可以看到web內容已經發生了變化。
這對于開發或后續更新來說是很好的。
總結
以上是生活随笔為你收集整理的19-数据持久化-Bind Mounting的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 18.04安装NVIDIA
- 下一篇: MIP 支付组件,支付流程: