1. 程式人生 > >docker入門——鏡像簡介

docker入門——鏡像簡介

reg play rep linux roo create 操作系統 一個 eat

什麽是docker鏡像

Docker鏡像是由文件系統疊加而成。

  • 最底端是一個引導文件系統,即bootfs:
    • 這很像典型的Linux/Unix的引導文件系統。Docker用戶幾乎永遠不會和引導文件系統有什麽交互。實際上,當一個容器啟動後,它將會被移到內存中,而引導文件系統則會被卸載(unmount),以留出更多的內存供initrd磁盤鏡像使用。
  • Docker鏡像的第二層是root文件系統rootfs:
    • 它位於引導文件系統之上。rootfs可以是一種或多種操作系統(如Debian或者Ubuntu文件系統)。

在傳統的Linux引導過程中,root文件系統會最先以只讀的方式加載,當引導結束並完成了完整性檢查之後,它才會被切換為讀寫模式。但是在Docker裏,root文件系統永遠只能是只讀狀態,並且Docker利用聯合加載(union mount)技術又會在root文件系統層上加載更多的只讀文件系統。聯合加載指的是一次同時加載多個文件系統,但是在外面看起來只能看到一個文件系統。聯合加載會將各層文件系統疊加到一起,這樣最終的文件系統會包含所有底層的文件和目錄。

Docker將這樣的文件系統稱為鏡像。一個鏡像可以放到另一個鏡像的頂部。位於下面的鏡像稱為父鏡像(parent image),可以一次類推,直到鏡像棧的最底部,最底部的鏡像稱為基礎鏡像(base image)。最後,當從一個鏡像啟動容器時,Docker會在該鏡像的最頂層加載一個讀寫文件系統。我們想在Docker中運行的程序就是在這個讀寫層中執行。

技術分享

當Docker第一次啟動一個容器時,初始的讀寫層是空的。當文件系統發生變化時,這些變化都會應用到這一層上。比如,如果想要修改一個文件,這個文件首先會從該讀寫層下面的只讀層復制到讀寫層。該文件的只讀層版本依然存在,但是已經被讀寫層中的該文件副本所隱藏。通常這種機制被稱為寫時復制(copy on write),這也是使Docker如此強大的技術之一。每個只讀鏡像層都是只讀的,並且以後永遠不會變化。當創建一個新容器時,Docker會構建出一個鏡像棧,並在棧的最頂端添加一個讀寫層。這個讀寫層再加上其下面的鏡像層以及一些配置數據,就構成了一個容器。在上一章我們已經知道,容器可以修改,它們有自己的狀態,並且是可以啟動和停止的。容器的這種特點加上鏡像分層框架(image-layering framework),使我們可以快速構建鏡像並運行包含我們自己的應用程序和服務的容器。

鏡像管理

列出鏡像:

通過docker images命令列出docker主機上可用的鏡像:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              f5bb94a8fac4        2 weeks ago         117.3 MB

在之前我們執行了docker run命令的同時將ubuntu的鏡像也下載到了本地,本地鏡像都保存在Docker宿主機的/var/lib/docker目錄下。鏡像從倉庫下載下來,而倉庫在Registry中。默認的Registry是由Docker公司運營的公共Registry服務,即Docker Hub。https://hub.docker.com/ 

我們可以通過docker pull來拉去我們想要的鏡像,比如說Centos:

# docker pull centos
latest: Pulling from centos

5932f74ff0cd: Pull complete 
4a7b890637c2: Pull complete 
4beff0251382: Pull complete 
Digest: sha256:cb2a2bffb199880da9c69e7f647c01c720c6f95b186a86cfbd3ef168b8032074
Status: Downloaded newer image for centos:latest

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              4beff0251382        3 days ago          192.5 MB
ubuntu              latest              f5bb94a8fac4        2 weeks ago         117.3 MB

我們雖然稱之為Ubuntu操作系統,但實際上它並不是一個完整的操作系統。它只是一個裁剪版,只包含最低限度的支持系統運行的組件。

為了區分同一個倉庫中的不同鏡像,Docker提供了一種稱為標簽(tag)的功能。每個鏡像在列出來時都帶有一個標簽,每個標簽對組成特定鏡像的一些鏡像層標記。這種機制使得在同一個倉庫中可以存儲多個鏡像。我們可以通過在倉庫名後面加上一個冒號和標簽名來指定該倉庫中的某一個鏡像。用docker run命令從鏡像啟動一個容器時,如果該鏡像不在本地,Docker會先從Docker Hub下載該鏡像。如果沒有指定具體的鏡像標簽,那麽Docker會自動下載latest標簽的鏡像。

查找鏡像:

通過docker search命令來查找所有Docker Hub上公共的可用鏡像:

# docker search puppet
NAME                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
devopsil/puppet                     Dockerfile for a container with puppet ins...   22                   [OK]
camptocamp/puppetserver             Puppetlabs‘s puppetserver                       7                    [OK]
devopsil/puppet-yum                                                                 5                    [OK]
vladgh/puppet                       Ubuntu 16.04 LTS Base image with Puppet         2                    [OK]
solict/provisionous-puppet-centos   CentOS provisions with Puppet included          2                    [OK]
...

這條命令會完成鏡像查找工作,返回如下信息:

  • 倉庫名;
  • 鏡像描述;
  • 用戶評論(Stars)——反映出一個鏡像的受歡迎程度;
  • 是否官方(Official)——由上遊開發者管理的鏡像;
  • 自動構建(Automated)——表示這個鏡像是由Docker Hub的自動構建(Automated Build)流程創建的。
## 這條命令將會下載devopsil/puppet鏡像到本地
# docker pull devopsil/puppet

## 構建容器
# docker run -i -t devopsil/puppet /bin/bash
[[email protected] /]# facter 
architecture => x86_64
augeasversion => 1.0.0

[[email protected] /]# puppet --version
3.7.4

這裏我們以交互的方式啟動了該容器,並且在裏面運行了Bash shell。在進入容器shell之後,我們運行了Facter(Puppet的主機探測應用),它也是預安裝在鏡像之內的。最後,在容器裏,我們運行了puppet程序以驗證Puppet是否安裝正常。

docker入門——鏡像簡介