1. 程式人生 > 其它 >Blog.081 Docker 資料管理

Blog.081 Docker 資料管理

本章目錄

1. 管理 Docker 容器中資料
  1.1 資料卷
  1.2 資料卷容器
2. 容器互聯(使用 centos 映象)
3. Docker 映象建立
  3.1 基於現有映象建立
  3.2 基於本地模板建立
  3.3 基於 Dockerfile 建立

1. 管理 Docker 容器中資料

    管理 Docker 容器中資料主要有兩種方式:資料卷(Data Volumes)和資料卷容器(DataVolumes Containers)。


  1.1 資料卷

    資料卷是一個供容器使用的特殊目錄,位於容器中。
    可將宿主機的目錄掛載到資料捲上,對資料卷的修改操作立刻可見,並且更新資料不會影響映象,從而實現資料在宿主機與容器之間的遷移。


    資料卷的使用類似於 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 exit
10 11 #返回宿主機進行檢視 12 cd /var/www/ 13 cat test.txt


  1.2 資料卷容器

    如果需要在容器之間共享一些資料,最簡單的方法就是使用資料卷容器。
    資料卷容器是一個普通的容器,專門提供資料卷給其他容器掛載使用。

1 #建立一個容器作為資料卷容器
2 docker run -it --name test1 -v /data1 -v /data2 centos:7 bash                               #建立並進入容器
3 echo "this is test7 file" > /data1/test.txt                          #容器內建立測試檔案1
4 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

2. 容器互聯(使用 centos 映象)

    容器互聯是通過容器的名稱在容器間建立一條專門的網路通訊隧道。
    簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的資訊。

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

3. Docker 映象建立

    建立映象有三種方法,分別為基於已有映象建立、基於本地模板建立以及基於Dockerfile建立。


  3.1 基於現有映象建立

    (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

  3.2 基於本地模板建立

    通過匯入作業系統模板檔案可以生成映象,模板可以從 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


  3.3 基於 Dockerfile 建立

    (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容器中不可見了

-