Docker容器實戰-簡單使用
一、hello-world
在之間CentOS安裝的時候,我們運行了hello-world第一個容器,hello-world是Docker官方推薦的第一個學習映象,它的功能就是簡單的輸出一段日誌在終端上。
Docker是基於Linux核心的Namespace、CGroups和UnionFS三項基本功能實現的,通過docker run hello-world
就可以執行Docker容器。
命令的格式
docker:Docker客戶端程式
run:子命令,執行容器
hello-world:映象名稱執行過程
首先在本地查詢是否有hello-world這個映象,如果沒有則去Dockerhub即Docker主倉庫拉取
啟動一個容器,並把映象裝載進容器執行
使用docker images
檢視系統中有哪些映象
REPOSITORY:映象名稱
TAG:映象版本,在Run時如果不帶版本就會拉取最新版本
IMAGE ID:映象的截斷後ID
CREATED:映象建立時間
VIRTUAL SIZE:映象佔用空間
二、容器與映象
上面有說到容器和映象兩個關鍵字,容器和映象是Docker最核心的部分,使用Docker時實際就是在容器中執行映象
(1)容器
很多人在最初可能會認為容器就是一種輕量級的虛擬機器,但從根本形態上來看,容器其實就是執行在作業系統上的一個程序,不過加入了對資源的隔離和限制
通常,在執行一個程序如果程序中出現死迴圈,CPU就會被佔用完;如果程序出現記憶體洩漏或大記憶體分配就可能把系統記憶體用完,因為預設程序間共用了CPU和記憶體,這種不進行隔離的處理方式,就會遇到相互間干擾的問題
前面也說了,Docker基於的三大核心功能是CGroups、Namespace和UnionFS
CGroups:限定一個程序的資源使用,如CPU、記憶體,使使用者主機更好地執行多個容器而相互不受影響
Namespace:隔離工作區,通過Namespace,容器執行在自己的獨立名稱空間,外層沒有訪問許可權,目前Docker 使用了PID、NET、IPC、MNT、UTS(UNIX Timesharing System) Namespace
Union FS:處理分層映象,是映象更加輕量級和快速,Docker可使用AUFS、VFS、Btrfs等不同的Union FS
(2)映象
容器是一個動態概念,映象則是一個相對靜止的概念,簡單來說映象就是容器中的檔案系統(* 映象除了檔案系統,還集成了一部分容器執行引數,可以將映象看成容器模板)
檔案系統管理技術在很早前就出現了,即chroot系統呼叫技術,通過該技術可以改變程序執行目錄,並將其限定在這個目錄中,但其僅僅只是簡單的隔離
因此Docker使用了Layered FS,把檔案系統分為多個層,是多個容期間可以使用公共的部分,而映象就是有Layered FS組成,並且映象是隻讀的,當容器執行時,會在映象上添上一層可讀可寫層
(3)關係
容器和映象二者缺一不可,可相互轉換
三、基本操作
(1)檢視資訊
功能描述:檢視Docker執行狀態及版本資訊(Docker Daemon守護程序執行狀態縮影)
語法:docker info
輸出:容器個數、映象個數、Daemon版本、儲存驅動
(2)下載映象
Docker映象是分層的,使用時都需要從第一個基礎映象開始,官方推薦的基礎映象為Ubuntu
功能描述:從Docker Hub拉取映象,如映象存在則直接返回
語法:docker pull ubuntu
(3)執行含Shell終端的映象
在之前的hello-world中,容器輸出日誌執行完成後就自動退出了,當然,Docker也可以執行一個可互動的容器,如果在互動式容器中執行exit命令,則整個容器都會停止執行,如果需要退出互動模式且不影響容器執行則可以使用Ctrl+PQ
剛剛拉取了一個Ubuntu映象,現在可以通過docker命令執行容器
語法:docker run -i -t ubuntu /bin/bash
-i 啟動一個可互動容器
-t 使用pseudo-TTY,關聯到容器的stdin和stdout
-d 後臺執行容器(本例子中未使用)
ubuntu 表明執行的映象
/bin/bash 啟動容器時執行的命令
提示:對一個虛擬網路伺服器來說,Pseudo-TTY(PTY,假冒的TTY)是等價的終端
當執行一個終端模擬程式或GNOME終端程式時,PTY對虛擬的使用者或者如終端模擬程式一樣的偽終端來說,就像是一個TTY在執行。
(4)檢視容器
功能描述:檢視容器
語法:docker ps [-a]
-a 檢視所有容器
注意:使用ps命令檢視時若容器退出,該命令就列舉不出容器,需要使用-a選項
因為我之前在執行ubuntu容器時,通過Ctrl+PQ
退出的互動模式,並未停止容器,所以通過ps可以看到其正在執行,而通過docker ps -a
則可以看到我在昨天寫上一篇博文時執行的hello-world容器資訊。
使用docker kill 容器號
殺掉容器後可以看到使用ps命令看不到執行容器存在了。