docker修改容器映射的端口_解密 Docker 挂载文件,宿主机修改后容器里文件没有修改...
問題
使用 Docker Volumes 時,有時需要掛載一個宿主機目錄或者文件,提供數據可持續或者容器內部服務配置文件。
使用命令 docker run -it --rm -v /root/test.txt:/root/test.txt debian:10 bash 掛載文件(test.txt 默認權限 644)時,通過 vim 修改宿主 test.txt 文件,但是容器中 test.txt 沒有修改。這是為什么?
問題分析
Docker 中,mount volume 的原理是借用了 Linux Namespace 中的 Mount NameSpace,隔離系統中不同進程的掛載點視圖,實際文件是沒有變化。比如上面的例子,在container中,bash 實際就是一個運行在宿主機上的進程,被Docker用Linux分別隔離了 Mount Namespace、UTS Namespace、IPC Namespace、PID Namespace、Network Namespace和User Namespace,使得它看上去好像運行在了一個獨立的、相對隔離的系統上,但實際它的一切資源都是宿主機在不同Namespace中的一個投影,文件也不例外。
為什么宿主機上修改 test.txt 文件,而容器中 test.txt 文件沒有變化?
Linux中,證明文件是否相同的根本途徑是,判斷其 inode,如果兩個文件的inode相同,兩個文件必定為同一文件,從而兩個文件的內容也必然相同。
驗證問題
1、在宿主機上創建一個 /root/test.txt 文件,使用命令 stat 查看 inode 值,如下圖:
2、使用命令 docker run -it --rm -v /root/test.txt:/root/test.txt debian:10 bash 臨時啟動一個容器,把宿主機文件 /root/test.txt 掛載到容器中。
3、另開一個終端,使用 vi 命令修改 /root/test.txt 文件,編輯完后保存,再次使用 stat 命令查看 /root/test.txt 文件 inode 值。從下圖已經發現,inode 值已經改變。
4、登陸容器查看 /root/test.txt 文件 ?inode 值。如下圖,inode 值還是 vi 修改前的值。而不是修改后的值。這也就解釋為什么宿主機上修改了文件而容器中文件沒有更新的原因。因為容器與宿主機使用的不是同一個文件。
簡述 vi 或者 vim 修改文件過程
Linux 默認情況下,vim為了防止在你修改文件的過程中,由于磁盤或者系統出現問題而導致當前被修改的文件的損壞,它做了類似如下邏輯:
- 1、復制出一個需要修改文件的副本,命名為在原來文件的基礎上增加 ".swp" 后綴以及 "." 前綴。
- 2、修改內容保存到有 .swp 后綴的文件,并 flush 到磁盤
- 3、執行 :wq 就會交換原文件和 swp 文件的名稱
- 4、刪除臨時 swp 文件
從上面可以看出,原來的文件已經被刪除,但是容器還是會一直記錄以前的文件,只有當 restart 容器時,容器才會重新讀取新的文件。宿主機上修改的內容才會更新。
解決方法
方法一
使用 echo 修改文件,而不是使用 vim 或者 vi。
方法二
修改 vim 配置。執行 vim 命令,輸入 :scriptnames 查看 vim 配置文件路徑,這邊配置文件路徑是 /etc/vimrc ,在配置文件最后添加如下兩行。
set?backup這樣可以解決問題,不過也有一個很大的副作用,那就是每次用vim編輯文件保存之后,vim會生成一個類似該被修改文件,但末尾增加了一個"~"后綴,用以保存修改之前的文件內容。此方法不推薦。
方法三
修改文件權限,文件默認權限是 644,把權限修改為 666。修改完權限后,再次通過 vim 修改并保存后,原文件的 inode 不會發生變化。(推薦此方法)
$ chmod 666 /root/test.txt方法四
掛載目錄,不要掛載文件。掛載目錄不會出現宿主機文件更新,而容器中文件沒有更新。(推薦此方法)
參考鏈接
- https://forums.docker.com/t/modify-a-file-which-mount-as-a-data-volume-but-it-didnt-change-in-container/2813/13
- https://www.cnblogs.com/lylex/p/12781007.html
熱門文章推薦
- 分享Linux內存占用幾個案例
- 如何實現rsync多并發同步?
- 我們如何用 K8S 搞定 1000 個應用的測試環境
- Kubernetes YAML 生成器
- Kubernetes故障排查指南-分析容器退出狀態碼
- IT運維面試問題總結-運維工具、開源應用(Ceph、Docker、Apache、Nginx等)
最后
- 歡迎您加我微信【ypxiaozhan01】,拉您進技術群,一起交流學習...
- 歡迎您關注【YP小站】,學習互聯網最流行的技術,做個專業的技術人...
【文章讓您有收獲,👇?贊或者在看支持我吧】
總結
以上是生活随笔為你收集整理的docker修改容器映射的端口_解密 Docker 挂载文件,宿主机修改后容器里文件没有修改...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: file watchers怎么默认打开_
- 下一篇: 谷粒商城高级篇资料_一文搞定剑指offe