天天看點

Docker 的資料管理

一、管理docker 容器中資料

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

1、資料卷

  資料卷是一個供容器使用的特殊目錄,位于容器中。可将主控端的目錄挂載到資料卷上,對資料卷的修改操作立刻可見,并且更新資料不會影響鏡像,進而實作資料在主控端與容器之間的遷移。資料卷的使用類似于Linux 下對目錄進行的mount 操作。

  需求:主控端目錄/var/www挂載到容器中的/data1.

Docker 的資料管理

docker pull centos: 7
 
#注意:主控端本地目錄的路徑必須是使用絕對路徑。如果路徑不存在,Docker會自動建立相應的路徑。
docker run -it --name test6 -v /var/www:/data1 centos:7 bash
#-v選項可以在容器内建立資料卷
 
ls
echo "this is test6 file" > /data1/test.txt
exit
 
#傳回主控端進行檢視
cd /var/www/
cat test.txt      
Docker 的資料管理

2、資料卷容器

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

Docker 的資料管理
#建立一個容器作為資料卷容器
docker run -it --name test1 -v /data1 -v /data2 centos:7 bash                               #建立并進入容器
echo "this is test7 file" > /data1/test.txt                          #容器内建立測試檔案1
echo "THIS IS TEST7 FILE" > /data2/TEST.txt                          #容器内建立測試檔案1
 
#使用--volumes-from來挂載test2容器中的資料卷到新的容器
docker run -it --name test2 --volumes-from test1 centos:7 bash                               #建立并進入容器
cat data1/test.txt                                       #檢視測試資料是否同步
cat data2/TEST.txt      
Docker 的資料管理

二、容器互聯(使用Centos鏡像)

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

Docker 的資料管理
#建立并運作源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash
#建立并運作接收容器取名web2,使用--link選項指定連接配接容器以實作容器互聯
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash          #--link容器名:連接配接的别名
 
#進web2容器,ping web1
docker exec -it web2 bash
ping web1      
Docker 的資料管理

三、docker 鏡像建立

  建立鏡像有三種方法,分别為基于已有鏡像建立、基于本地模闆建立以及基于Dockerfile建立

1、基于現有鏡像建立

  1.1 首先啟動一個鏡像,在容器裡做修改

Docker 的資料管理
docker create -it centos:7 bash
 
docker ps -a
CONTAINER ID   IMAGE      COMMAND   CREATED          STATUS    PORTS     NAMES
fb555aed6d9c   centos:7   "bash"    17 seconds ago   Created             agitated_germain
 
docker start fb555aed6d9c
yum install net-tools -y            # 可以在容器裡面安裝net-tools工具
exit      
Docker 的資料管理

  1.2 然後将修改後的容器送出為新的鏡像,需要使用該容器的ID号建立新鏡像

Docker 的資料管理
docker commit -m "new" -a "centos" 000550eb36da centos:test
#常用選項:
-m說明資訊:
-a作者資訊;
-p生成過程中停止容器的運作
 
docker images      
Docker 的資料管理

2、基于本地模闆建立

  通過導入作業系統模闆檔案可以生成鏡像,模闆可以從OPENVZ開源項目下載下傳,下載下傳位址為:https://wiki.openvz.org/Download/template/precrated

wget http://download.openvz.org/template/precreated/debian-7.0-x86 -minimal.tar.gz
#導入為鏡像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test       

  注釋:docker export import

  導出容器export

  注意:export導出的是容器,不是鏡像

docker export <CONTAINER ID >  > my_container.tar      

  導入容器為鏡像import

cat my_container.tar |docker import - image_name:tag      

3、基于dockerfile 建立

  3.1 聯合檔案系統(UnionFS)

  UnionFS(聯合檔案系統):Union檔案系統(UnionFS)是一種分層、輕量級并且高性能的檔案系統,它支援對檔案系統的修改作為一次送出來一層層的疊加,同時可以将不同目錄挂載到同一個虛拟檔案系統下。AUFS、OberlayFS及Devicemapper 都是一種UnionFS。

  Union檔案系統時Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。

  特性:一次同時加載多個檔案系統,但從外面看起來,隻能看到一個檔案系統,聯合加載會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄。

  我們下載下傳的時候看到的一層層的就是聯合檔案系統。

  3.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。

Docker 的資料管理

  3.3 為什麼docker裡的Centos的大小才200M?

  因為對于精簡的OS,rootfs可以很小,隻需要包含最基本的指令、工具和程式庫就可以了,因為底層直接用主控端的kernel,自己隻乣提供rootfs就可以了。

  由此可見對于不同的linux發行版,bootfs基本是一緻的,rootfs會有差别,是以不同的發行版可以公有bootfs。

  3.4 dockerfile

  Docker鏡像是一個特殊的檔案系統,除了提供容器運作時所需的程式、庫、資源、配置等檔案外,還包含了一些為運作時準備的配置參數(如匿名卷、環境變量、使用者等)。

  鏡像不包含任何動态資料,其内容在建構之後也不會被改變。

  鏡像的定制實際上就是定制每一層所添加的配置、檔案。

  如果我們可以把每一層修改、安裝、建構、操作的指令都寫入一個腳本,用這個腳本來建構、定制鏡像,那麼鏡像建構透明性的問題、體積的問題就都會解決。這個腳本就是Dockerfile。

  Dockerfile是一個文本檔案,其内容包含了一條條的指令(Instruction),沒一條指令建構一層,是以每一條指令的内容,就是描述該層應當如何建構。

  有了Dockerfile,當我們需要定制自己額外的需求時,隻需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲指令的麻煩。

  除了手動生成Docker鏡像之外,可以使用Dockerfile自動生成鏡像。Dockerfile是由多條的指令組成的檔案,其中每條指令對應Linux中的一條指令,Docker程式将讀取Dockerfile中的指令生成指定鏡像。

  Dockerfile結構大緻分為四個部分:基礎鏡像資訊、維護者資訊、鏡像操作指令和容器啟動時執行指令。

  Dockerfile每行支援一條指令,每條指令可攜帶多個參數,支援使用以“#”号開頭的注釋。

  3.5 docker鏡像結構的分層

  鏡像不是一個單一的檔案,而是有多層構成。容器其實是在鏡像的最上面加了一層讀寫層,在運作容器裡做的任何檔案改動,都會寫到這個讀寫層。如果删除了容器,也就删除 其最上面的讀寫層,檔案改動也就丢失了。

  Docker使用存儲驅動管理鏡像每層内容及可讀可寫層。

  • Dockerfile中的每個指令都會建立一個新的鏡像層;
  • 鏡像層将被緩存和複用;
  • 當Dockerfile的指令修改了,複制的檔案變化了,或者建構鏡像時指定的變量不同了對應的鏡像層緩存就會失效;
  • 某一層的鏡像緩存失效,它之後的鏡像層緩存都會失效;
  • 鏡像層是不可變的,如果在某一層中添加一個檔案,然後再下一層中删除它,則鏡像中依然會包含該檔案,隻是這個檔案在Docker容器中不可見了。

四、dockerfile操作常用的指令

1、FROM 鏡像

  指定新鏡像所基于的鏡像,第一條指令必須為FROM指令,每建立一個鏡像就需要一條FROM指令

2、MAINTAINER 名字

  說明新鏡像的維護人資訊

3、RUN指令

  在所基于的鏡像上執行指令,并送出到新的鏡像中

4、ENTRYPOINT ["要運作的程式","參數1","參數2"]

  設定容器啟動時第一個運作的指令及其參數。

  可以通過 使用指令docker run --entrypoint 來覆寫鏡像中的ENTRYPOINT指令的内容

5、CMD ["要運作的程式","參數1","參數2"]

  上面 的是exec形式, shell形式: CMD指令 參數1 參數2

  啟動容器時預設執行的指令或者腳本,Dockerfile隻 能有一條CMD指令。如果指定多條指令,隻執行最後一條指令。

  如果在docker  run時指定了指令或者鏡像中有ENTRYPOINT,那麼cmd就會被覆寫。

  CMD可以為ENTRYPOINT指令提供預設參數。

6、EXPOSE 端口号

  指定新鏡像加載到Docker 時要開啟的端口

7、ENV 環境變量 變量值

  設定一個環境變量的值,會被後面的RUN使用

8、ADD 源檔案/目錄 目标檔案/目錄

  将源檔案複制到鏡像中,源檔案要與Dockerfile 位于相同目錄中,或者是一個URL

  有如下注意事項:

  • 如果源路徑是個檔案,且目标路徑是以/結尾, 則docker會把目标路徑當作一個目錄,會把源檔案拷貝到該目錄下;如果目标路徑不存在,則會自動建立目标路徑
  • 如果源路徑是個檔案,且目标路徑是不是以/結尾,則docker會把目标路徑當作一個檔案;如果目标路徑不存在,會以目标路徑為名建立一個檔案,内容同源檔案;如果目标檔案是個存在的檔案,會用源檔案覆寫它,當然隻是内容覆寫,檔案名還是目标檔案名;如果目标檔案實際是個存在的目錄,則會源檔案拷貝到該目錄下。注意,這種情況下,最好顯示的以/結尾,以避免混淆
  • 如果源路徑是個目錄,且目标路徑不存在,則docker會自動以目标路徑建立一個月錄,把源路徑月錄下的檔案拷貝進來;如果目标路徑是個已經存在的目錄,則docker 會把源路徑目錄下的檔案拷貝到該目錄下
  • 如果源檔案是個歸檔檔案(壓縮檔案),則docker會自動幫解壓;URL"下載下傳和解壓特性不能一起使用。任何壓縮檔案通過URL拷貝,都不會自動解壓

9、COPY 源檔案/目錄 目标檔案/目錄

  隻複制本地主機.上的檔案/目錄複制到目标地點,源檔案/目錄要與Dockerfile 在相同的目錄中

10、VOLUME ["目錄"]

  在容器中建立一個挂載點

11、USER 使用者名/UID

  指定運作容器時的使用者

12、WORKDIR 路徑

  為後續的RUN、CMD、ENTRYPOINT指定工作目錄

13、ONBUILD 指令

  • 指定所生成的鏡像作為一個基礎鏡像時所要運作的指令
  • 當在一個Dockerfile檔案中加上ONBUILD指令, 該指令對利用該Dockerfile建構鏡像(比如為A鏡像)不會産生實質性影響
  • 但是當編寫一個新的Dockerfile檔案來基于A鏡像建構一-個鏡像( 比如為B鏡像)時,這時構造A鏡像的Dockerfile檔案中的ONBUILD指令就生效了,在建構B鏡像的過程中,首先會執行ONBUILD指令指定的指令,然後才會執行其它指令

14、HEALTHCHECK

  健康檢查

  在編寫Dockerfile時,有嚴格的格式需要遵循:

  • 第一行必須使用FROM指令指明所基于的鏡像名稱
  • 之後使用MAINTAINER 指令說明維護該鏡像的使用者資訊
  • 然後是鏡像操作相關指令,如RUN指令。每運作一條指令,都會給基礎鏡像添加新的一層
  • 最後使用CMD指令指定啟動容器時要運作的指令操作

五、dockerfile案例

Docker 的資料管理
cd /opt/
#建立工作目錄
mkdir /opt/apache
cd apache/
 
vim Dockerfile
#基于的基礎鏡像
FROM centos:7
#維護鏡像的使用者資訊
MAINTAINER this is apache image <ly>
#鏡像操作指令安裝Apache軟體
RUN yum install -y httpd
#開啟80端口
EXPOSE 80
#複制網站首頁檔案
ADD index.html /var/www/html/
 
##方法一:
-----------------------------------------------------------------------------
#将執行腳本複制到鏡像中
ADD run.sh /run.sh
RUN chmod +x /run.sh
#啟動時執行腳本
CMD ["/run.sh"]
-----------------------------------------------------------------------------
 
##方法二:
-----------------------------------------------------------------------------
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D","FOREGROUND"]
————————————————
 
##準備執行腳本
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*                         #清理httpd的緩存
/usr/sbin/apachectl -D FOREGROUN            #指定為前台運作
#因為Docker容器僅在它的1号程序(PID為1) 運作時,會保持運作。如果1号程序退出了,Docker容 器也就退出了。
 
#準備網站頁面
echo "this is test dockerfile web" > index.html
 
#生成鏡像
docker build -t httpd:centos7 .             #注意!!!末尾的“.”不要忘記
 
#新鏡像運作容器
docker run -d -p 1314:80 httpd:centos7              #大寫P随機端口,小寫P指定端口
 
#浏覽器通路測試
http://192.168.229.90:1314       
Docker 的資料管理

标簽: docke人

繼續閱讀