docker的volume持久化操作

NO IMAGE

引入持久化volume

之前我們都說過,容器間是獨立存儲的,並且容器內部的修改是沒有被持久化的。

在前一篇中,我們就說過,容器的運行是在image外面套了個容器層,每次修改都是在容器層進行修改,並不修改到內部的image,所以在容器停止的時候,修改也就消失了。

那麼比如我在一個容器裡面運行一個應用,他的數據庫也在該容器中的話,如果這個容器被意外的停止了,那麼數據消失了,這肯定不是我們想看到的。再比如兩三個應用分別跑在各自的容器裡面,但是他們的數據是相通的,也就是要求他們使用的是同一個數據庫,那這該怎麼弄呢?

這就要引入今天要講的持久化volume。

怎麼玩volume

我們先以守護進程的方式啟動一個進程,然後將裡面的某個虛擬地址映射到本機的某個實際地址,具體命令如下。

docker的volume持久化操作docker的volume持久化操作

我們啟動完之後,用docker inspect 命令來查看某容器的詳細信息。由於信息太多,我只截取了部分,將就著看看。

docker的volume持久化操作docker的volume持久化操作

我們來看一下宿主機的路徑和容器內部的路徑指的是不是同一內存。

首先,我們先看一下宿主機的路徑,並查看他的index.html文件,很明顯這是nginx的歡迎頁面。

docker的volume持久化操作docker的volume持久化操作

然後我們修改一下這個文件,改為“我是修改的哈”,查看一下,的確是改好啦的。

接著,我們到容器裡面看一下index.html,發現他也被修改啦。

docker的volume持久化操作docker的volume持久化操作

那我們換個方向,先在容器裡面修改,再到本機實際的地址看一下,發現實際地址也被修改啦。

docker的volume持久化操作docker的volume持久化操作

docker的volume持久化操作docker的volume持久化操作

具體原理

下面來說一下理由是什麼?咱來圖說的清楚點。

docker的volume持久化操作docker的volume持久化操作

容器中的地址其實並不真實的物理路徑,而是虛擬路徑。當我們第一次修改實際路徑的時候,其實修改了實際路徑中的物理地址中的內容,當我們從容器內部去查看這個內容的時候,他其實也就是從實際路徑中獲取了內容,即實際路徑中的物理地址中的內容。反之,也是一樣的。所以總的來說,他們指向的是同一片內存。

長按下圖二維碼,即刻關注【學習Java的小姐姐】 領取超多學習資料哦!

docker的volume持久化操作docker的volume持久化操作

相關文章

InnoDB體系架構

淺談MySQL的整體架構

每週總結第1期(2019061020190616)

是的,我離職了