Docker詳解(三)

  • 2019 年 10 月 3 日
  • 筆記

序言:前兩章我們主要介紹了Docker的概念和體系,以及Docker的鏡像和容器命令,這一章我們將深入Docker鏡像以及熟悉Docker的容器數據卷。OK,我們開始第三章的學習吧。

Docker詳解(一)
Docker詳解(二)
 
  

1. Docker鏡像

1.1 鏡像存儲

要了解 Docker鏡像的存儲首先務必得了解聯合文件系統 UnionFS(Union File System).

UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級並且高性能的文件系統,它支援對文件系統的修改作為一次提交來一層層的疊加,並且可以將不同目錄掛載到同一個虛擬文件系統下。Union文件系統是Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像,可以製作各種具體的應用鏡像。

 

Docker鏡像載入原理:

Docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。

bootfs(boot file system):主要包含bootloader和kernel, bootloader主要是引導載入kernel, Linux剛啟動時會載入bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot載入器和內核。當boot載入完成之後整個內核就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。

rootfs (root file system) :在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等等。

 

1.2 base鏡像

在了解base鏡像之前,我們先說一下dockerFile,之前我們把鏡像比作、容器比作實例,如果有人不理解dockerFile的話,那麼橫向對比,你可以把它看作是 .class 文件

那麼base鏡像就是 沒有 FROM 或者 FROM scratch開頭的 DockerFile所構建出來的鏡像

base鏡像通常都是各種 Linux發行版的鏡像,如 Centos,Ubuntu,Debian 等

且base 鏡像提供的是最小安裝的Linux發行版,此外 Docker Hub上 99% 的鏡像都是通過在base鏡像中安裝和配置需要的軟體構建而來

下圖是 官方 Centos 鏡像 的 DockerFile內容

 

1.3 鏡像Commit

docker commit 提交容器副本使之成為一個新的鏡像

docker commit -m="提交的描述資訊" -a="作者" 容器ID 要創建的目標鏡像名:[標籤名]

 

案例演示

1. 從Hub 上下載tomcat鏡像到本地並成功運行 (也可採用阿里雲加速下載)

docker pull tomcat

 

2. 故意刪除上一步鏡像生產tomcat的文檔

註:如果不想新開窗口,可以 後台啟動 tomcat ( docker run -d -p 8888:8080 tomcat )

docker exec -it 088c813ad8ca /bin/bash

 

3. 提交刪除文檔的 tomcat容器副本 作為一個新的鏡像

docker commit -a="coke" -m="del tomcat docs" 088c813ad8ca coke/tomcat02:1.2

 

4. 運行我們上傳成功的測試鏡像

docker run -it  -p 8888:8080 coke/tomcat02:1.2

 

2. Docker容器數據卷

2.1 基本介紹

Docker容器產生的數據,如果不通過docker commit生成新的鏡像,使得數據做為鏡像的一部分保存下來,

那麼當容器刪除後,數據自然也就沒有了。

為了保存數據,使容器之間可以進行數據共享,在Docker 中我們使用容器數據卷。

卷的設計目的就是數據的持久化,完全獨立於容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷

主要用途: 1. 容器的持久化 2. 容器間繼承 + 共享數據

特點:

  • 數據卷可在容器之間共享或重用數據
  • 卷中的更改可以直接生效
  • 數據卷中的更改不會包含在鏡像的更新中
  • 數據卷的生命周期一直持續到沒有容器使用它為止

 

2.2 數據卷

我們接下來進行操作,嘗試在容器 或者 DockerFile中 添加數據卷

直接命令添加

1、 命令添加

docker run -it -v /宿主機目錄:/容器內目錄 centos /bin/bash

 

2、查看容器卷是否掛載成功

docker inspect 容器ID

 

3、容器和宿主機之間數據共享

①. 嘗試在Docker 容器內進行寫入,主機查看是否實時更新

 

②. 嘗試在主機進行文件修改,在Docker容器進行查看是否實時更新

注意:容器停止退出,主機修改文件,容器再次重啟進入,主機修改的文件依然會同步到容器哦,有興趣的可以試試。

 

DockerFile 添加 (此處我們只要學會使用Dockerfile添加容器卷就行,Dockerfile後面會介紹)

1、在主機根目錄下 新建mydocker 文件夾,並進入

mkdir mydocker 新建一個mydocker文件夾

 

2、構建一個DockerFile

vim DockFile vim編輯器 編輯DockerFile文件

# volume test  FROM centos  VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]  CMD echo "finished,--------success1"  CMD /bin/bash

docker build -f /mydocker/Dockerfile -t coke/centos . 在centos基礎上構建自己的Dockfile

 

3、run 容器

docker run -it coke/centos 運行我們剛剛構建的鏡像的實例容器

 

4、獲取主機的默認目錄,後面 容器卷同步數據操作 同直接命令添加

docker inspect 容器ID

 

2.3 數據卷容器

命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器

  • 我們以上一步新建的鏡像 coke/centos 為模板運行容器 dc01/dc02/dc03
  • 它們已經具有的容器卷:/dataVolumeContainer1、/dataVolumeContainer2

 

1、先啟動一個父容器dc01,在dataVolumeContainer2新增內容

cd dataVolumeContainer2  touch doc01_add.txt

 

2、dc02/dc03繼承自dc01,分別在dataVolumeContainer2中新增內容

docker run -it --name dc02 --volumes-from dc01 coke/centos dc02繼承dc01

說明:doc02繼承doc01後,容器卷中的文件做到了共享

 

docker run -it --name dc03 --volumes-from dc01 coke/centos dc03繼承dc02

 

3、回到dc01可以看到02/03各自添加的數據都能共享了

 

4、刪除dc01,dc02修改後打dc03可否訪問

 

結論:容器之間的配置資訊的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止。