什么是Docker
Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國(guó)期間發(fā)起的一個(gè)公司內(nèi)部項(xiàng)目,
它是基于 dotCloud 公司多年云服務(wù)技術(shù)的一次革新,并于 2013 年 3 月以 Apache 2.0 授權(quán)協(xié)議開源,
主要項(xiàng)目代碼在 GitHub 上進(jìn)行維護(hù)。Docker 項(xiàng)目后來還加入了 Linux 基金會(huì),并成立推動(dòng) 開放容器聯(lián)盟(OCI)。
為什么要使用Docker
1.更高效的利用系統(tǒng)資源
2.更快速的啟動(dòng)時(shí)間
3.一致的運(yùn)行環(huán)境
4.持續(xù)交付和部署
5.更輕松地遷移
6.更輕松的維護(hù)和擴(kuò)展
Docker包括三個(gè)基本概念
鏡像Image
容器Container
倉庫Repository
Docker鏡像
Docker 鏡像是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫、資源、配置等文件外,
還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。
鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。
Docker容器
1.鏡像和容器的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類和實(shí)例一樣,鏡像是靜態(tài)的定義,
容器是鏡像運(yùn)行的時(shí)的尸體。容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。
2.容器的實(shí)質(zhì)是進(jìn)程,但與直接在宿主機(jī)執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行屬于自己
獨(dú)立的命名空間,可以擁有自己的root文件系統(tǒng)、網(wǎng)絡(luò)配置、進(jìn)程空間、用戶ID空間。
容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里,使用起來,就好像在一個(gè)獨(dú)立于宿主的系統(tǒng)
下操作一樣,這種容器封裝的應(yīng)用比直接在宿主機(jī)上運(yùn)行更加的安全。
3.容器的存儲(chǔ)和鏡像一樣是分層存儲(chǔ),每一個(gè)容器運(yùn)行時(shí)是以鏡像為基礎(chǔ)層
在其上面創(chuàng)建一個(gè)當(dāng)前容器的存儲(chǔ)層,稱這個(gè)為容器運(yùn)行時(shí)讀寫而準(zhǔn)備的存儲(chǔ)曾為
容器存儲(chǔ)層。
4.容器存儲(chǔ)成的生命周期和容器一樣,容器消亡時(shí),容器存儲(chǔ)層也隨之消亡,
任何保存于容器存儲(chǔ)層的信息都會(huì)和容器刪除而丟失。
5.Docker最佳實(shí)踐需求,容器不應(yīng)該向存儲(chǔ)層內(nèi)寫入任何數(shù)據(jù),存儲(chǔ)層要保持無狀態(tài)化。
所有文件的寫入操作,都應(yīng)該使用數(shù)據(jù)卷(Volume)、或者綁定宿主目錄、這些操作會(huì)直接
跳過容器存儲(chǔ)層,直接對(duì)宿主發(fā)生讀寫,性能和穩(wěn)定性更高。
6.數(shù)據(jù)卷的生命周期獨(dú)立于容器,容器消亡,數(shù)據(jù)卷不會(huì)消亡。容器刪除或者重新
運(yùn)行之后,數(shù)據(jù)不會(huì)丟失。
7.獲取鏡像倉庫的命令是 docker pull
8.運(yùn)行容器的命令是 docker run -it --rm \
ubuntu:18.04 \
bash
-it:這是兩個(gè)參數(shù),一個(gè)是
-i:交互式操作,一個(gè)是
-t 終端。
我們這里打算進(jìn)入 bash 執(zhí)行一些命令并查看返回結(jié)果,
因此我們需要交互式終端。
--rm:這個(gè)參數(shù)是說容器退出后隨之將其刪除。
默認(rèn)情況下,為了排障需求,退出的容器并不會(huì)立即刪除,
除非手動(dòng) docker rm。我們這里只是隨便執(zhí)行個(gè)命令,看看結(jié)果,
不需要排障和保留結(jié)果,因此使用 --rm 可以避免浪費(fèi)空間。
ubuntu:18.04:這是指用 ubuntu:18.04 鏡像為基礎(chǔ)來啟動(dòng)容器。
bash:放在鏡像名后的是 命令,這里我們希望有個(gè)交互式 Shell,
因此用的是 bash。
9.列出鏡像 docker images ls(注意:Docker Hub上顯示的鏡像體積是壓縮后的)
10.虛懸鏡像
這個(gè)鏡像既沒有倉庫名字也沒有標(biāo)簽均為<none>,原為mongo:3.2,
因官方鏡像維護(hù)后,docker pull mongo:3.2獲取這個(gè)鏡像的時(shí)候這個(gè)鏡像名字被轉(zhuǎn)移到
新下載的鏡像身上,而舊的鏡像上的這個(gè)名稱則被取消,從而成
為了<none>,docker build 也同樣可以導(dǎo)致這種現(xiàn)象
11.中層鏡像
docker image ls 只會(huì)顯示最上層的鏡像
docker image ls -a顯示中層需要加參數(shù)
12.列出特定的某個(gè)鏡像,也就是指定的倉庫名字和標(biāo)簽
docker image ls --filter(簡(jiǎn)寫:-f 作用:過濾)
docker image ls -f since(before)=mongo:3.2查看在mongo:3.2之后(之前)建立的鏡像
docker image ls -f label=com.example.version=0.1通過標(biāo)簽來過濾
docker image ls -q--filter 配合 -q 產(chǎn)生出指定范圍的 ID 列表
13.刪除本地鏡像
docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]
14.查看鏡像、容器、數(shù)據(jù)卷所占用的空間
docker system df
Docker Registry
作用:集中存儲(chǔ),分發(fā)鏡像服務(wù)
1.Docker Registry可以包含多個(gè)倉庫,每個(gè)倉庫可以包含多個(gè)標(biāo)簽,每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像。
2.一個(gè)倉庫會(huì)包含一個(gè)軟件不同版本的鏡像,標(biāo)簽就常用于對(duì)應(yīng)用該軟件的各個(gè)版本
通過<倉庫名>:<標(biāo)簽>的格式來指定具體是這個(gè)軟件那個(gè)版本的鏡像,如果不給出標(biāo)簽
,將以latest為默認(rèn)標(biāo)簽
3.倉庫名經(jīng)常以兩段路徑形式出現(xiàn)
4.Docker Registry 公開服務(wù)開放給用戶使用、允許用戶管理鏡像的 Registry 服務(wù)。
一般這類公開服務(wù)允許用戶免費(fèi)上傳、下載公開的鏡像,并可能提供收費(fèi)服務(wù)供用戶管理私有鏡像。
5.私有 Docker Registry
利用commit理解鏡像的構(gòu)成
不要使用 docker commit 定制鏡像,定制鏡像應(yīng)該使用 Dockerfile 來完成
docker diff webserver 修改了容器的存儲(chǔ)層 可查看具體改動(dòng)
Dockerfile
每一個(gè)命令就是建立一個(gè)鏡像,run也是
運(yùn)行多個(gè)命令僅使用一個(gè)run指令,并使用&&連接起來可表示為一層
容器
守護(hù)態(tài)運(yùn)行(后臺(tái)運(yùn)行)
docker在后臺(tái)運(yùn)行的時(shí)不直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下
使用-d來實(shí)現(xiàn),輸出結(jié)果不會(huì)顯示在宿主機(jī)上 結(jié)果可以用docker logs查看
使用-d啟動(dòng)后會(huì)返回一個(gè)唯一的id,也可以通過docker container ls 查看容器信息
docker container logs [container ID or NAMES]
終止容器
docker container stop 終止容器的運(yùn)行
當(dāng)docker容器中指定的應(yīng)用終結(jié)時(shí),容器也自動(dòng)終止
docker container ls -a查看容器的狀態(tài)
docker container start 將一個(gè)已經(jīng)終止的容器啟動(dòng)運(yùn)行
docker container restart 命令會(huì)將一個(gè)運(yùn)行態(tài)的容器終止,然后再重新啟動(dòng)它
進(jìn)入容器
docker attach 或者 docker exec(推薦使用)
exit或Ctrl+d來退出終端
attach命令
docker attach ubuntu:18.04
從這個(gè)stdin中exit,會(huì)導(dǎo)致容器的停止
exec命令(后可跟-i t)
只用-i參數(shù)時(shí),由于沒有分配偽終端,界面沒有我們熟悉的Linux運(yùn)算符,但命令執(zhí)行結(jié)果仍可以返回
當(dāng)-i -t 一起使用的時(shí)候 可看到Linux命令提示符號(hào)
從這個(gè)stdin中exit,不會(huì)導(dǎo)致容器的停止
導(dǎo)出容器
docker export
示例:docker export 7691a814370e > ubuntu.tar這樣將導(dǎo)出快照到本地文件
導(dǎo)入容器快照
docker import 從快照文件中再導(dǎo)入為鏡像
示例:
cat ubuntu.tar | docker import - test/ubuntu:v1.0
也可以通過指定URL或者某個(gè)目錄來導(dǎo)入
示例:
docker import http://example.com/exampleimage.tgz example/imagerepo