(二)Docker基礎概念

基本概念

Docker 包括三個基本概念
鏡像(Image)
容器(Container)
倉庫(Repository)
理解了這三個概念,就理解了 Docker 的整個生命週期。
然後是安裝

Docker 鏡像

我們都知道,操作系統分爲內核和用戶空間。對於 Linux 而言,內核啓動後,會掛
載 root 文件系統爲其提供用戶空間支持。而 Docker 鏡像(Image),就相當於 是一個root 文件系統。比如官方鏡像Ubuntu14.04就包含了完整的一套Ubuntu 14.04 最小系統的root文件系統。

分層存儲
因爲鏡像包含操作系統完整的root件系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計爲分層存儲的架構。所以 嚴格來說,鏡像並非是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其 實際體現並非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系 統聯合組成。
鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生 改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作, 實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容 器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因 此,在構建鏡像的時候,需要額外小心,每一層儘量只包含該層需要添加的東西, 任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至可以用之前構建好的 鏡像作爲基礎層,然後進一步添加新的層,以定製自己所需的內容,構建新的鏡 像。

Docker 容器

鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中 的類和實例一樣鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被 創建、啓動、停止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的 獨立的 命名空間。因此容器可以擁有自己的root文件系統、自己的網絡配置、自己的進程空間,甚至自己的ID空間。容器內的進程是運行在一個隔離的環 境裏,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容 器封裝的應用比直接在宿主運行更加安全。也因爲這種隔離的特性,很多人初學 Docker 時常常會把容器和虛擬機搞混。
前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像爲 基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個爲容器運行時讀寫而 準備的存儲層爲容器存儲層。
容器存儲層的生存週期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此, 任何保存於容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲 層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume)、或者 綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發 生讀寫,其性能和穩定性更高。
數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。因此,使用數據卷 後,容器可以隨意刪除、重新run,數據卻不會丟失。

Docker Registry

鏡像構建完成後,可以很容易的在當前宿主上運行,但是,如果需要在其它服務器 上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。
一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多 個標籤(Tag);每個標籤對應一個鏡像。
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的 各個版本。我們可以通過 <倉庫名>:<標籤>的格式來指定具體信息,如果不給出標籤則用latest作爲默認。

具體講一下CentOS安裝
Docker 最低支持 CentOS 7。
Docker 需要安裝在 64 位的平臺,並且內核版本不低於 3.10。 CentOS 7 滿足最低 內核的要求,但由於內核版本比較低,部分功能可能無法使用。

阿里雲的安裝腳本

curl    -sSL    http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/
docker-engine/internet  |   sh  -

daocloud

curl    -sSL    https://get.daocloud.io/docker  |   sh

手動安裝
添加內核參數
默認配置下,在 CentOS 使用 Docker 可能會碰到下面的這些警告信息:
WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled

添加內核配置參數以啓用這些功能。
$ sudo tee -a /etc/sysctl.conf <<-EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF

$ sudo sysctl -p

$  sudo    tee /etc/yum.repos.d/docker.repo    <<-'EOF'
[dockerrepo] 
name=Docker Repository 
baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 
gpgcheck=1 
gpgkey=https://yum.dockerproject.org/gpg
EOF

$  sudo yum update
$  sudo yum install docker-engine
$   sudo systemctl enable  docker  
$   sudo systemctl start   docker
 

默認情況下,docker命令會使用unix socket 與docker引擎進行通信。而只有root用戶和docker用戶纔可以訪問,處於安全考慮,生產環境一般不使用root用戶。因此要建立docker用戶組

$ sudo groupadd docker

$sudo usermod -aG docker docker

一個安裝小腳本

#!/bin/bash
yum remove docker docker-common docker-selinux docker-engine
yum -y install  yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
yum-config-manager --enable docker-ce-test
yum makecache fast
yum list docker-ce.x86_64 --showduplicates | sort -r
yum install docker-ce -y

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lbw697tm.mirror.aliyuncs.com"]
}
EOF

systemctl start docker
systemctl enable docker
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章