docker 内部ping不通宿主机_Docker容器数据管理
在Docker容器內部創建的文件默認存儲在可寫的容器層,容易產生幾個問題:
- 當容器不存在時,數據文件不能持久化,同時這些數據文件不方便在容器之外被其他進程使用。
- 當容器運行的時候容器可寫層嚴重依賴宿主機,不能輕易移動這些數據文件到其他地方。
- 在容器層寫數據文件需要存儲驅動(storage driver)來管理文件系統,存儲驅動使用Linux內核提供的聯合文件系統, 與data volumes直接將文件寫到宿主機文件系統相比,性能降低。
Docker為容器提供了兩種方式將數據文件存儲到宿主機上,即使容器停止運行或者被刪除數據文件都可以持久化,這兩種方式分別為 volumes與bind mounts,當然如果Docker容器在Linux運行,也可以使用tmpfs mounts。不管使用哪種mount方式,數據文件在Docker容器內部文件系統中是相同的, 要么是一個文件夾,或者一個獨立的文件。
- volumes 存儲在Docker安裝目錄下,在Linux上默認指的是/var/lib/docker/volumes,Docker會自動管理,非Docker進程不應該修改這些文件系統,volumes是在Docker中是最好的數據持久化方式。
- bind mount 存儲在宿主機文件系統的任何地方,宿主機上的非Docker進程或者Docker容器都可以在任何時候修改它。
- tmpfs mount 始終存儲在宿主機系統內存中,不會被寫到宿主機的文件系統中。
詳細介紹
- volumes
Docker會自動創建并管理volumes,當然可以通過命令docker volumes create明確的創建一個volume,當成功創建了一個volume時,它存儲在宿主機的某個目錄下, 當把這個volume掛載到一個Docker容器時,這個目錄自然會掛載到容器內部,volumes與bind mount工作方式類似,除了volumes是被Docker自動管理以及隔離性, 兩者沒什么區別。
[root@ins ~]# docker volume create mmmm[root@ins ~]# docker volume createcc0613fe5a32273134a76e5670f166f6e248634e909d64cf00061130086f5ae5[root@ins ~]# docker volume lsDRIVER VOLUME NAMElocal cc0613fe5a32273134a76e5670f166f6e248634e909d64cf00061130086f5ae5local mm[root@ins ~]#一個volume可以同時掛載到多個Docker容器,當沒有任何Running狀態的容器使用這個volume,這個volume仍然有效并且不會被自動刪除,除非通過執行命令 docker volume prune進行刪除。當掛載一個volume時,這個volume可能匿名或者有一個名字,當它首次掛載到容器中的時候如果Docker發現該volume沒有一個明確的名字, 則會給它分配一個隨機的名字,這個名字在Docker宿主機上是唯一的。
volumes支持volume driver,允許通過driver將數據存儲到遠程機器或者云廠商等。
- bind mounts
這種方式與volumes相比,有一些功能限制。當使用bind mounts時,宿主機上的一個文件或者目錄被掛載到Docker容器中,這個文件或者目錄通過它在 宿主機上的完整路徑名被引用,他們在宿主機上不是必須存在的,在需要的時候Docker會自動創建它。bind mounts非常高效,但是他們依賴于宿主機文件系統明確的目錄結構, 同時通過Docker CLI命令無法直接管理這些bind mounts。
注意:正在運行的容器中進程可以直接改變宿主機上的文件系統,包括創建、修改以及刪除重要的文件或者目錄,會引發安全風險問題,影響宿主機上運行的其它非Docker進程,請注意控制權限。
- tmpfs mounts
這種方式不能將數據持久化到磁盤,一個tmpfs可以被一個容器在整個生命周期內使用,用于存儲一些非持久狀態或者敏感數據,比如swarm services使用tmpfs將secrets 掛載到service的容器中。
volumes與bind mounts都能通過-v 或者 --volume flag參數掛載到容器中,對于 tmpfs mount,可以使用--tmpfs flag參數,在Docker17.06以及更高版本中, 推薦使用--mount,對于這三種方式--mount語法更明確。
三種方式優點
volumes可以在多個運行的容器之間共享,解耦Docker容器與宿主機文件系統,支持存儲遠程以及云廠商,方便在不同的Docker機器上遷移數據。
bind mounts可以讓多個容器共享宿主機文件,比如Docker就是通過將/etc/resolv.conf掛載到每個容器方式實現DNS解決方案,開發的時候可以共享項目源代碼,在容器內編譯運行。
tmpfs保存敏感數據,非持久化數據,由于保存在內存中,相比文件系統性能更高。
默認規則:
- 如果將一個空的volumes掛載到容器內的某個目錄,如果該目錄中已經有一些文件或者目錄,那么這些文件或者目錄會直接復制到volumes中。
- 如果將一個bind mount或者非空volume掛載到容器的某個目錄,這個目錄中已經存在文件或者目錄,那么這個目錄中的文件或者目錄會被mount覆蓋,被覆蓋的文件或者目錄只是暫時被隱藏,當移除掛載時即可恢復。
使用介紹
早期,Docker都是通過flag -v或者--volume給單機容器實現掛載,而swarm service則是通過 flag --mount實現,在Docker 17.06版本開始,--mount也適用于單機容器掛載,該命令的 語法更靈活明確,在使用-v或者--volume時盡量使用--mount代替。
-v or –volume
-v db:/var/lib/mysql,通過英文冒號分隔,如果volume有名字,冒號之前的是volume,如果volume匿名,則直接 -v /var/lib/mysql,如果需要控制容器讀寫volume權限,可以 -v db:/var/lib/mysql:ro
–mount
--mount包含許多以英文逗號分隔的key-value鍵值對,它的語法比-v以及--volume更詳細,key的順序無關緊要,主要包含以下key(只列舉部分)
- type 它的值可以為 volume、bind或者tmpfs
- source 對于已命名的volume,source即為volume名字,volume匿名,則該值為空,source也可定義為src
- destination 指定掛載到容器中的path路徑,可以定義為dst、destination或者target
- readonly 如果存在,則被掛載的volume在容器中只能讀
- volume-opt 可選參數,可以定義多次,key-value形式
基礎使用
創建一個volume
docker volume create sunjinfu查看volume
docker inspect sunjinfu[ { "CreatedAt": "2019-04-20T15:00:12+08:00總結
以上是生活随笔為你收集整理的docker 内部ping不通宿主机_Docker容器数据管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 复制文件到指定文件夹_按
- 下一篇: mysql scrapy 重复数据_my