導(dǎo)語:一篇我自己的docker學(xué)習(xí)總結(jié),重在基礎(chǔ),如有錯(cuò)誤,歡迎各種討論、建議、批評(píng)、指正。
1、docker是什么
docker是一種Linux容器(LXC,即linux container)引擎,它與傳統(tǒng)的虛擬化技術(shù)的區(qū)別在于容器本身不做硬件層級(jí)的虛擬化,而是一種操作系統(tǒng)級(jí)的虛擬化技術(shù),通過Linux內(nèi)核的一些特性(namespace、control group)實(shí)現(xiàn)容器與容器、容器與宿主機(jī)之間的隔離,它是一種半虛擬化技術(shù)。
docker的特點(diǎn)有:
- 擁有獨(dú)立的根文件系統(tǒng)、存儲(chǔ)空間和網(wǎng)絡(luò)
- 只能創(chuàng)建Linux容器
- 極快的啟動(dòng)速度與極低的運(yùn)行開銷
- 引擎運(yùn)行的依賴環(huán)境非常簡單
- 可將應(yīng)用及其依賴環(huán)境一起打包到容器中
2、docker有什么
在docker官網(wǎng)上有這么幾款開源工具:
- docker engine:基本的完整功能docker包,包含docker引擎和客戶端,適用于單臺(tái)主機(jī)
- docker compose:一個(gè)用于一組不同功能容器的docker工具。例如用django搭建一個(gè)博客時(shí),需要同時(shí)用到nginx容器、mysql容器、redis容器,可以使用docker compose進(jìn)行統(tǒng)一編排
- docker registry:私有docker鏡像倉庫搭建工具,docker中的每一個(gè)容器都是從鏡像建立的。
- docker machine:一個(gè)幫助我們簡化部署docker引擎的工具,可以通過一條命令在各種架構(gòu)中部署docker
- docker swarm:一個(gè)docker機(jī)群的編排調(diào)度工具,類似工具還有g(shù)oogle出品的kubernetes
docker由哪幾部分組成呢?
- docker 引擎:即docker daemon,docker守護(hù)進(jìn)程,它根據(jù)鏡像生成容器,運(yùn)行容器。docker引擎有點(diǎn)像虛擬光驅(qū),iso文件就是docker鏡像,而容器就是我們在資源管理器中看到的虛擬光驅(qū)加載的光盤
- docker 客戶端:用來向daemon發(fā)送指令,這也說明docker是一個(gè)C/S架構(gòu)程序
- docker 鏡像:即docker image,容器產(chǎn)生的圖紙和材料。docker的容器鏡像是基于一種特殊的層式文件系統(tǒng),這種方式便于鏡像的重復(fù)利用與容器回滾,更多信息可以看一下這篇文章還有這一篇
- docker 倉庫:即docker registry,鏡像倉庫,有docker公司搭建的公有庫docker hub,由于速度的問題可以使用國內(nèi)的一些公共庫比如daocloud或者自建私有庫,docker的倉庫概念與git、github相似
- docker 容器:即docker container,docker所建立的虛擬化實(shí)例,類似傳統(tǒng)虛擬化里的虛擬機(jī)
3、docker怎么裝
安裝前的檢查
docker依賴條件極少,各平臺(tái)安裝包發(fā)行較為完善,安裝過程也非常簡單。安裝之前首先要檢查以下先決條件:
- 安裝主機(jī)必須是64位CPU架構(gòu)的機(jī)器
- 操作系統(tǒng)內(nèi)核為3.8或更高
- 內(nèi)核必須支持以下幾種存儲(chǔ)驅(qū)動(dòng)之一(一篇深入探討存儲(chǔ)驅(qū)動(dòng)的文章):
- Device Mapper
- AUFS
- vfs
- btrfs
- ZFS(docker1.7中引入)
- overlay1或2
-通常默認(rèn)驅(qū)動(dòng)是Device Mapper或AUFS
- 內(nèi)核必須開啟cgroup、namespace功能
docker安裝
具體安裝ubuntu使用apt-get安裝docker-engine包,redhat/centos 6.X中需先添加epel源后使用yum安裝docker-io包。
P.S. Ubuntu中如果使用了UFW,需要修改/etc/default/ufw文件中的配置并重新加載:
DEFAULT_FORWARD_POLICY="ACCEPT"(默認(rèn)是DROP)
$ sudo ufw reload
docker服務(wù)器啟動(dòng)
redhat/centos 6.X中:
$ sudo service docker start
redhat/centos 7.X中:
$ sudo systemctl start docker
4、docker怎么玩
啟動(dòng)docker服務(wù)器:docker daemon
要想創(chuàng)建運(yùn)行容器,首先要運(yùn)行docker守護(hù)進(jìn)程,docker daemon命令在1.16版本開始被dockerd命令代替。以下是一些啟動(dòng)docker守護(hù)進(jìn)程時(shí)的可選參數(shù):
$ dockerd --help
Usage: dockerd COMMAND
A self-sufficient runtime for containers.
Options:
-b, --bridge string [指定守護(hù)進(jìn)程使用的網(wǎng)橋接口,默認(rèn)是docker0] Attach containers to a network bridge
-D, --debug [啟用調(diào)試模式] Enable debug mode
-g, --graph string [設(shè)置守護(hù)進(jìn)程運(yùn)行時(shí)根目錄] Root of the Docker runtime (default "/var/lib/docker")
-G, --group string [設(shè)置unix socket的屬組] Group for the unix socket (default "docker")
-H, --host list [指定守護(hù)進(jìn)程的通信接口,可以是一個(gè)unix socket、IP、域名] Daemon socket(s) to connect to (default [])
-l, --log-level string [設(shè)置日志等級(jí)] Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
-p, --pidfile string [指定守護(hù)進(jìn)程PID文件地址] Path to use for daemon PID file (default "/var/run/docker.pid")
-s, --storage-driver string [設(shè)置存儲(chǔ)驅(qū)動(dòng)] Storage driver to use
-v, --version [查看docker版本] Print version information and quit
創(chuàng)建并運(yùn)行一個(gè)容器
docker守護(hù)進(jìn)程也啟動(dòng)好了,不管別的,先運(yùn)行一個(gè)容器嘗嘗:
docker run -i -t ubunt /bin/bash
稍等片刻,我們會(huì)發(fā)現(xiàn)shell發(fā)生了變化:

那么這個(gè)命令運(yùn)行過程中發(fā)生了什么?
- docker在本地查找名為ubuntu的鏡像,沒找到
- 由于未指明tag,docker將會(huì)從docker hub拉取
ubuntu:latest這個(gè)鏡像,latest就是默認(rèn)的tag,最新版 - 然后我們經(jīng)過漫長的等待(有可能)會(huì)看到幾行亂碼后面跟著
Pull complete,鏡像就下載完了。這其中每一行實(shí)際上是鏡像的每一層,亂碼是每一層的ID,這一層又一層實(shí)際上從Dockerfile(用于創(chuàng)建鏡像的文件)生成的。Dockerfile怎么玩?以后再寫。。。 - 鏡像有了docker開始創(chuàng)建容器,-i表示打開容器的STDIN,-t分配一個(gè)偽tty終端,然后運(yùn)行bash shell
docker命令
docker從1.13開始對(duì)現(xiàn)有的40多個(gè)頂級(jí)命令進(jìn)行組織整理,形成一組管理命令,讓用戶使用和理解命令更方便更容易。
現(xiàn)有管理命令如下:
container Manage containers(容器管理)
image Manage images(鏡像管理)
network Manage networks(docker內(nèi)部網(wǎng)絡(luò)管理)
node Manage Swarm nodes(swarm節(jié)點(diǎn)管理)
plugin Manage plugins(插件管理)
secret Manage Docker secrets(密鑰管理)
service Manage services(docker 服務(wù)管理,負(fù)責(zé)
讓運(yùn)行在docker中的應(yīng)用保持一個(gè)理想可用的狀態(tài)。此處理解不到位,待深入)
stack Manage Docker stacks(docker捆綁包管理,即docker compose創(chuàng)建的一組容器。此處理解不到位,待深入)
swarm Manage Swarm(Swarm集群管理)
system Manage Docker(docker服務(wù)器管理)
volume Manage volumes(卷管理)
管理命令展開
1.容器命令:docker container
該命令包括與docker容器相關(guān)的操作
docker container attach|commit|cp|create|diff|exec|export|inspect|kill|logs|ls| pause|port|prune|rename|restart|rm|run|start|stats|stop|top|unpause|update|wait
常用子命令如下:
ls 列出容器
logs 獲取容器日志
inspect 顯示容器詳細(xì)信息
diff 顯示容器變化(A-add 新增,C-change 改變,D-delete 刪除)
stats 實(shí)時(shí)顯示容器的物理資源資源占用情況
top 顯示容器中正在運(yùn)行的進(jìn)程
port 列出容器與宿主機(jī)所有端口映射
exec 在一個(gè)正在運(yùn)行的容器中執(zhí)行一條命令
attach 連接至容器的stdout、stdin、stderr
cp 在容器用宿主機(jī)之間復(fù)制文件
create 從鏡像創(chuàng)建一個(gè)新容器
run 新建一個(gè)容器并執(zhí)行一條命令
rm 刪除容器
prune 刪除所有停止容器
rename 重命名一個(gè)容器
start 啟動(dòng)容器
stop 停止容器(發(fā)送SIGTERM后再發(fā)送SIGKILL)
restart 重啟容器
kill 強(qiáng)行停止容器(直接發(fā)送SIGKILL)
pause 使用cgroup的freezer順序掛起/解掛容器中所有進(jìn)程
unpause 解除容器掛起
update 更新容器自身的配置參數(shù)(如容器CPU、內(nèi)存的分配參數(shù)等)
commit 將容器的變化創(chuàng)建為一個(gè)新的鏡像(就是把在容器內(nèi)執(zhí)行的一些命令寫到一個(gè)新的鏡像層商)
export 將容器導(dǎo)出為鏡像,生成一個(gè)tar包(export導(dǎo)出的鏡像會(huì)丟失鏡像層結(jié)構(gòu),無法回滾)
wait 阻塞指定容器直到容器停止,并返回退出碼
2、鏡像命令:docker image
該命令包括與docker鏡像相關(guān)的操作
docker image build|history|import|inspect|load|ls|prune|pull|push|rm|save|tag
常用子命令如下:
build 從Dockerfile創(chuàng)建一個(gè)鏡像
history 顯示一個(gè)鏡像的創(chuàng)建歷史
inspect 顯示鏡像詳細(xì)信息
ls 列出本地鏡像
prune 刪除所有沒有使用的鏡像
pull 從倉庫拉去一個(gè)鏡像(默認(rèn)是從docker hub)
push 向倉庫上傳一個(gè)鏡像(默認(rèn)是從docker hub)
rm 刪除一個(gè)鏡像
save 將鏡像導(dǎo)出,如果不指定文件,將直接輸出至STDOUT
load 對(duì)應(yīng)docker image save,將save導(dǎo)出的tar包導(dǎo)入成鏡像,或者從STDIN直接輸入
import 對(duì)應(yīng)docker container export,將export導(dǎo)出的tar包導(dǎo)入成鏡像
tag 為鏡像添加TAG,便于鏡像管理
補(bǔ)充一個(gè)命令:
docker search [OPTIONS] TERM
該命令用于搜索倉庫中的鏡像(默認(rèn)還是在docker hub中搜索)。
3、docker服務(wù)器命令:docker system
該命令包括整個(gè)docker的一些相關(guān)操作
docker system df|events|info|prune
常用子命令有:
df 顯示本機(jī)docker占用的硬盤空間,包括鏡像、容器還有卷
events 實(shí)時(shí)顯示docker服務(wù)器的事件
info 顯示整個(gè)docker服務(wù)器信息,比如容器數(shù)量,鏡像數(shù)量等等等等
prune 刪除所有沒有使用的數(shù)據(jù),比如停止的容器,沒用到的鏡像等待
4、還有一些頂級(jí)命令。。。。
這個(gè)我也不知道是啥的東西已經(jīng)被我寫成一個(gè)純粹的命令堆疊了。。。無所謂了。。。。當(dāng)成是個(gè)命令查詢手冊吧。。。
docker login|logout|search
這三個(gè)命令沒有對(duì)應(yīng)的管理命令子命令,其實(shí)就是docker倉庫的登陸、注銷、查詢(默認(rèn)當(dāng)然還是對(duì)docker hub的),其他的頂級(jí)命令都有對(duì)應(yīng)的管理命令子命令。
剩下的管理命令子命令諸如volume、network、stack、service之類的怎么不介紹?看多了你也吐,寫多了我也惡心。當(dāng)然最重要的是我還沒研究明白。以上這些對(duì)于docker最基本使用已經(jīng)足夠了,可以折騰一會(huì)了。
下一期,我寫一下docker的一些簡單的使用場景,以及怎么寫dockerfile然后創(chuàng)建鏡像并運(yùn)行容器。