Blog.081 Docker 資料管理
本章目錄
1. 管理 Docker 容器中資料
1.1 資料卷
1.2 資料卷容器
2. 容器互聯(使用 centos 映象)
3. Docker 映象建立
3.1 基於現有映象建立
3.2 基於本地模板建立
3.3 基於 Dockerfile 建立
管理 Docker 容器中資料主要有兩種方式:資料卷(Data Volumes)和資料卷容器(DataVolumes Containers)。
資料卷是一個供容器使用的特殊目錄,位於容器中。
可將宿主機的目錄掛載到資料捲上,對資料卷的修改操作立刻可見,並且更新資料不會影響映象,從而實現資料在宿主機與容器之間的遷移。
資料卷的使用類似於 Linux下對目錄進行的 mount 操作。
需求:宿主機目錄 /var/www 掛載到容器中的 /data1。
1 docker pull centos: 7 2 3 注意:宿主機本地目錄的路徑必須是使用絕對路徑。如果路徑不存在,Docker會自動建立相應的路徑。 4 docker run -it --name test6 -v /var/www:/data1 centos:7 bash 5 #-v選項可以在容器內建立資料卷 6 7 ls 8 echo "this is test6 file" > /data1/test.txt 9 exit10 11 #返回宿主機進行檢視 12 cd /var/www/ 13 cat test.txt
如果需要在容器之間共享一些資料,最簡單的方法就是使用資料卷容器。
資料卷容器是一個普通的容器,專門提供資料卷給其他容器掛載使用。
1 #建立一個容器作為資料卷容器 2 docker run -it --name test1 -v /data1 -v /data2 centos:7 bash #建立並進入容器 3 echo "this is test7 file" > /data1/test.txt #容器內建立測試檔案14 echo "THIS IS TEST7 FILE" > /data2/TEST.txt #容器內建立測試檔案1 5 6 #使用--volumes-from來掛載test2容器中的資料捲到新的容器 7 docker run -it --name test2 --volumes-from test1 centos:7 bash #建立並進入容器 8 cat data1/test.txt #檢視測試資料是否同步 9 cat data2/TEST.txt
容器互聯是通過容器的名稱在容器間建立一條專門的網路通訊隧道。
簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的資訊。
1 #建立並執行源容器取名web1 2 docker run -itd -P --name web1 centos:7 /bin/bash 3 #建立並執行接收容器取名web2,使用--link選項指定連線容器以實現容器互聯 4 docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash #--link容器名:連線的別名 5 6 #進web2容器,ping web1 7 docker exec -it web2 bash 8 ping web1
建立映象有三種方法,分別為基於已有映象建立、基於本地模板建立以及基於Dockerfile建立。
(1)首先啟動一個映象,在容器裡做修改
1 docker create -it centos:7 bash 2 3 docker ps -a 4 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5 fb555aed6d9c centos:7 "bash" 17 seconds ago Created agitated_germain 6 7 docker start fb555aed6d9c 8 yum install net-tools -y # 可以在容器裡面安裝net-tools工具 9 exit
(2)然後將修改後的容器提交為新的映象,需要使用該容器的 id 號建立新映象
1 docker commit -m "new" -a "centos" 000550eb36da centos:test 2 #常用選項: 3 -m說明資訊: 4 -a作者資訊; 5 -p生成過程中停止容器的執行 6 7 docker images
通過匯入作業系統模板檔案可以生成映象,模板可以從 OPENVZ 開源專案下載。
下載地址:https://wiki.openvz.org/Download/template/precrated
1 wget http://download.openvz.org/template/precreated/debian-7.0-x86 -minimal.tar.gz 2 #匯入為映象 3 cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test
docker export import:匯出容器 export
Tips:export 匯出的是容器,不是映象。
1 docker export <CONTAINER ID > > my_container.tar
匯入容器為映象 import
1 cat my_container.tar |docker import - image_name:tag
(1)聯合檔案系統(UnionFS)
UnionFS(聯合檔案系統):Union檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下。AUFS、OberlayFS 及 Devicemapper 都是一種 UnionFS。
Union 檔案系統是 Docker 映象的基礎。
映象可以通過分層來進行繼承,基於基礎映象(沒有父映象),可以製作各種具體的應用映象。
特性:一次同時載入多個檔案系統,但從外面看起來,只能看到一個檔案系統,聯合載入會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄。
我們下載的時候看到的一層層的就是聯合檔案系統。
(2)映象載入原理
Docker 的映象實際上由一層一層的檔案系統組成,這種層級的檔案系統就是 UnionFS。
bootfs 主要包含 bootloader 和 kernel,bootloader 主要是引導載入 kernel,Linux 剛啟動時會載入 bootfs 檔案系統。
在 Docker 映象的最底層是 bootfs,這一層與我們典型的 Linux/Unix 系統是一樣的,包含 boot 載入器和核心。
當 boot 載入完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由 bootfs 轉交給核心,此時系統也會解除安裝 bootfs。
rootfs,在 bootfs 之上,包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和檔案。
rootfs 就是各種不同的作業系統發行版,比如 Ubuntu, Centos 等等。
我們可以理解成一開始核心裡什麼都沒有,操作一個命令下載 debian,這時就會在核心上面加了一層基礎映象;再安裝一個 emacs,會在基礎映象上疊加一層 image;接著再安裝一個 apache,又會在 images 上面再疊加一層 image。
最後它們看起來就像一個檔案系統即容器的 rootfs。在 Docker 的體系裡把這些 rootfs叫做 Docker 的映象。但是,此時的每一層 rootfs 都是 read-only 的,我們此時還不能對其進行操作。
當我們建立一個容器,也就是將 Docker 映象進行例項化,系統會在一層或是多層 read-only 的 rootfs 之上分配一層空的 read-write 的 rootfs。
(3)為什麼Docker裡的centos的大小才200M?
因為對於精簡的 OS,rootfs 可以很小,只需要包含最基本的命令、工具和程式庫就可以了,因為底層直接用宿主機的 kernel,自己只需要提供 rootfs 就可以了。
由此可見對於不同的 linux 發行版,bootfs 基本是一致的,rootfs 會有差別,因此不同的發行版可以公用 bootfs。
(4)Dockerfile
Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。
映象不包含任何動態資料,其內容在構建之後也不會被改變。
映象的定製實際上就是定製每一層所新增的配置、檔案。
如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個指令碼,用這個指令碼來構建、定製映象,那麼映象構建透明性的問題、體積的問題就都會解決。這個指令碼就是Dockerfile。
Dockerfile 是一個文字檔案,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
有了 Dockerfile,當我們需要定製自己額外的需求時,只需在 Dockerfile 上新增或者修改指令,重新生成 image 即可,省去了敲命令的麻煩。
除了手動生成 Docker 映象之外,可以使用 Dockerfile 自動生成映象。Dockerfile 是由 多條的指令組成的檔案,其中每條指令對應 Linux 中的一條命令,Docker 程式將讀取Dockerfile 中的指令生成指定映象。
Dockerfile 結構大致分為四個部分:基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行指令。
Dockerfile 每行支援一條指令,每條指令可攜帶多個引數,支援使用以 “#“ 號開頭的註釋。
(5)Docker映象結構的分層
映象不是一個單一的檔案,而是有多層構成。
容器其實是在映象的最上面加了一層讀寫層,在執行容器裡做的任何檔案改動,都會寫到這個讀寫層。
如果刪除了容器,也就刪除了其最上面的讀寫層,檔案改動也就丟失了。
Docker使用儲存驅動管理映象每層內容及可讀寫層的容器層。
- Dockerfile 中的每個指令都會建立一個新的映象層;
- 映象層將被快取和複用;
- 當 Dockerfile 的指令修改了,複製的檔案變化了,或者構建映象時指定的變數不同了,對應的映象層快取就會失效;
- 某一層的映象快取失效,它之後的映象層快取都會失效;
- 映象層是不可變的,如果在某一層中新增一個檔案,然後在下一層中刪除它,則映象中依然會包含該檔案,只是這個檔案在Docker容器中不可見了。
-