您好,登錄后才能下訂單哦!
本篇內容主要講解“Docker中怎么如何管理數據”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker中怎么如何管理數據”吧!
到目前我們介紹了一些Docker的基礎感念, 知道了如何使用Docker的image, 也知道了如何在多個container間通過網絡通訊. 在這章里我們將介紹如何在docker的container內管理數據以及如何在不同的container間共享數據。
我們將介紹兩種主要的在docker中管理數據的方法:
Data volumes 和
Data volume container
一個 data volume 就是一個在一個或者多個container里的特殊用途的目錄。它繞過了 Union File System (譯者: 這里不確定, 需要研究)為持久化數據、共享數據提供了下面這一些有用的特性:
Data volumes 可以在不同的container之間共享和重用數據
對 Data volume 的修改及時生效(譯者:data volumn是一個目錄, 多個container都掛載這個目錄, 具體的可以通過 docker inspect 看 volumne的信息)
對 data volume 修改內容在升級image的時候不會被包括進去 (譯者:在docker的整個設計中image是一個無狀態的, 這樣對升級重用非常有利。而標記狀態的數據, 比如數據庫的數據, 生產的log之類的應該放到volume里。volume的持久化和恢復在下面有介紹, 是通過文件的形式的, 而不是通過image)
Volumes 的持久化直到沒有container使用他們
你可以在docker run
的時候使用 -v
來添加一個 data volume。這個參數在docker run
的時候可以多次使用來添加多個 data volumes。讓我們為我們的web application container掛載一個 volume。
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
這里一個新的volume會創建到container里的 /webapp
. (譯者:如果你通過ssh或者通過 -i
登陸到你的container的一個shell里, 使用 ls /webapp
可以驗證掛載成功了)
注意: 你也可以在
Dockerfile
里添加VOLUME
字段,這樣在創建一個新的image的 container是就會自動的創建新的volume.
使用 -v
不僅能創建一個新的 volume, 還可以把宿主機一個目錄mount到container里。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
這條命令會把本地目錄 /src/webapp
mount到container里的 /opt/webapp
目錄上。用這個方法來測試程序非常方便, 比如我們可以把我們的源代碼通過這個方法mount到container里, 修改本地代碼后立即就可以看到修改后的代碼是如何在container里工作的了。宿主機的目錄必須是絕對路徑, 如果這個目錄不存在docker會為你自動創建。
注意 這里是沒法用
Dockerfile
實現的, 因為這樣的用法有悖于可移植性和共享. 因為本地目錄就像他名字告訴我們的, 是和本地相關的, 不一定可以在所有的宿主機上工作.(譯者: 鬼知道你在使用image的時候的host是啥樣子的)
Docker默認設置volume是可讀寫的,但是我們也可以mount一個目錄為只讀:
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
這里我們同樣mount了 /src/webapp
目錄, 但是我們加上了 ro
參數, 告訴docker這個volume是只讀的.
如果你有一些持久化的數據, 并且想在不同的container之間共享這些數據, 或者想在一些沒有持久化的container中使用, 最好的方法就是使用 Data Volumn Container, 在把數據mount到你的container里.(譯者:如開篇譯者提到的docker的container是無狀態的, 也就是說標記狀態的數據,例如:數據庫數據, 應用程序的log 等等, 是不應該放到container里的, 而是放到 Data Volume Container里, 這點和funcational programming很像, 所以我喜歡把一般的docker container 叫做 functional container用來區分 data volume container )
讓我們創建一個有名字的 Data Volume Container 來共享數據.
$ docker run -d -v /dbdata --name dbdata training/postgres
這樣做之后就可以通過 --volumes-from
把 /dbdata
mount到其他的container里了
$ docker run -d --volumes-from dbdata --name db1 training/postgres
還可以繼續共享到另外一個container里
$ docker run -d --volumes-from dbdata --name db2 training/postgres
-volumes-from
可以多次使用來 mount 多個conatainer里的多個volumes。
這個操作是鏈式的, 我們在db1 中通過 --volumes-from
mount進來的 volume可以繼續被其他container使用
$ docker run -d --name db3 --volumes-from db1 training/postgres
(譯者: 這里我們不是直接使用 volume container, 而是使用db1 這個functional container 把volume 掛載到另外一個 funcational container上的,所謂的鏈式就是 dbdata -> db1 -> db3)
如果你把所有mount volumes的container都移除掉, 包括初始化的那個 dbdata
container, volume才會被移除掉。通過這個屬性可以方便的升級升級數據或者在不同container間migrate數據.
Volume的另外一個用處就是備份、恢復和migrate數據。 具體的做法如下,使用 --volumes-from
來創建一個新的container mount這個volume
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
這里我們啟動了一個新的container, 從 dbdata
掛載了一個volume。同時掛載了一個本地目錄到這個container里。最后我們通過一個 tar
命令把 dbdata
里的數據備份到了 /backup
里。命令結束并且停止這個container后我們就在本地得到了一個備份的數據.
(譯者: 這里使用的 ubuntu
container, 就是為了把volume中的數據打包備份到host的某一個目錄里。)
備份的數據可以恢復到這個container, 或者其他使用這個volume的container。首先創建一個container
$ sudo docker run -v /dbdata --name dbdata2 ubuntu
之后un-tar備份文件到 data volume 里
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
你可以使用你喜歡的工具加上上面的技術來自動備份,遷移和恢復數據.
現在我們有多學了一些如何使用docker的知識。 下面我們將看下如何把Docker和Docker Hub提供的服務結合起來實現自動build,以及學習一些私有repository的知識.
到此,相信大家對“Docker中怎么如何管理數據”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。