導語:一篇我自己的docker學習總結,重在基礎,如有錯誤,歡迎各種討論、建議、批評、指正。
1、docker是什么
docker是一種Linux容器(LXC,即linux container)引擎,它與傳統的虛擬化技術的區別在于容器本身不做硬件層級的虛擬化,而是一種操作系統級的虛擬化技術,通過Linux內核的一些特性(namespace、control group)實現容器與容器、容器與宿主機之間的隔離,它是一種半虛擬化技術。
docker的特點有:
- 擁有獨立的根文件系統、存儲空間和網絡
- 只能創建Linux容器
- 極快的啟動速度與極低的運行開銷
- 引擎運行的依賴環境非常簡單
- 可將應用及其依賴環境一起打包到容器中
2、docker有什么
在docker官網上有這么幾款開源工具:
- docker engine:基本的完整功能docker包,包含docker引擎和客戶端,適用于單臺主機
- docker compose:一個用于一組不同功能容器的docker工具。例如用django搭建一個博客時,需要同時用到nginx容器、mysql容器、redis容器,可以使用docker compose進行統一編排
- docker registry:私有docker鏡像倉庫搭建工具,docker中的每一個容器都是從鏡像建立的。
- docker machine:一個幫助我們簡化部署docker引擎的工具,可以通過一條命令在各種架構中部署docker
- docker swarm:一個docker機群的編排調度工具,類似工具還有google出品的kubernetes
docker由哪幾部分組成呢?
- docker 引擎:即docker daemon,docker守護進程,它根據鏡像生成容器,運行容器。docker引擎有點像虛擬光驅,iso文件就是docker鏡像,而容器就是我們在資源管理器中看到的虛擬光驅加載的光盤
- docker 客戶端:用來向daemon發送指令,這也說明docker是一個C/S架構程序
- docker 鏡像:即docker image,容器產生的圖紙和材料。docker的容器鏡像是基于一種特殊的層式文件系統,這種方式便于鏡像的重復利用與容器回滾,更多信息可以看一下這篇文章還有這一篇
- docker 倉庫:即docker registry,鏡像倉庫,有docker公司搭建的公有庫docker hub,由于速度的問題可以使用國內的一些公共庫比如daocloud或者自建私有庫,docker的倉庫概念與git、github相似
- docker 容器:即docker container,docker所建立的虛擬化實例,類似傳統虛擬化里的虛擬機
3、docker怎么裝
安裝前的檢查
docker依賴條件極少,各平臺安裝包發行較為完善,安裝過程也非常簡單。安裝之前首先要檢查以下先決條件:
- 安裝主機必須是64位CPU架構的機器
- 操作系統內核為3.8或更高
- 內核必須支持以下幾種存儲驅動之一(一篇深入探討存儲驅動的文章):
- Device Mapper
- AUFS
- vfs
- btrfs
- ZFS(docker1.7中引入)
- overlay1或2
-通常默認驅動是Device Mapper或AUFS
- 內核必須開啟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"
(默認是DROP)
$ sudo ufw reload
docker服務器啟動
redhat/centos 6.X中:
$ sudo service docker start
redhat/centos 7.X中:
$ sudo systemctl start docker
4、docker怎么玩
啟動docker服務器:docker daemon
要想創建運行容器,首先要運行docker守護進程,docker daemon命令在1.16版本開始被dockerd命令代替。以下是一些啟動docker守護進程時的可選參數:
$ dockerd --help
Usage: dockerd COMMAND
A self-sufficient runtime for containers.
Options:
-b, --bridge string [指定守護進程使用的網橋接口,默認是docker0] Attach containers to a network bridge
-D, --debug [啟用調試模式] Enable debug mode
-g, --graph string [設置守護進程運行時根目錄] Root of the Docker runtime (default "/var/lib/docker")
-G, --group string [設置unix socket的屬組] Group for the unix socket (default "docker")
-H, --host list [指定守護進程的通信接口,可以是一個unix socket、IP、域名] Daemon socket(s) to connect to (default [])
-l, --log-level string [設置日志等級] Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
-p, --pidfile string [指定守護進程PID文件地址] Path to use for daemon PID file (default "/var/run/docker.pid")
-s, --storage-driver string [設置存儲驅動] Storage driver to use
-v, --version [查看docker版本] Print version information and quit
創建并運行一個容器
docker守護進程也啟動好了,不管別的,先運行一個容器嘗嘗:
docker run -i -t ubunt /bin/bash
稍等片刻,我們會發現shell發生了變化:
那么這個命令運行過程中發生了什么?
- docker在本地查找名為ubuntu的鏡像,沒找到
- 由于未指明tag,docker將會從docker hub拉取
ubuntu:latest
這個鏡像,latest就是默認的tag,最新版 - 然后我們經過漫長的等待(有可能)會看到幾行亂碼后面跟著
Pull complete
,鏡像就下載完了。這其中每一行實際上是鏡像的每一層,亂碼是每一層的ID,這一層又一層實際上從Dockerfile(用于創建鏡像的文件)生成的。Dockerfile怎么玩?以后再寫。。。 - 鏡像有了docker開始創建容器,-i表示打開容器的STDIN,-t分配一個偽tty終端,然后運行bash shell
docker命令
docker從1.13開始對現有的40多個頂級命令進行組織整理,形成一組管理命令,讓用戶使用和理解命令更方便更容易。
現有管理命令如下:
container Manage containers(容器管理)
image Manage images(鏡像管理)
network Manage networks(docker內部網絡管理)
node Manage Swarm nodes(swarm節點管理)
plugin Manage plugins(插件管理)
secret Manage Docker secrets(密鑰管理)
service Manage services(docker 服務管理,負責
讓運行在docker中的應用保持一個理想可用的狀態。此處理解不到位,待深入)
stack Manage Docker stacks(docker捆綁包管理,即docker compose創建的一組容器。此處理解不到位,待深入)
swarm Manage Swarm(Swarm集群管理)
system Manage Docker(docker服務器管理)
volume Manage volumes(卷管理)
管理命令展開
1.容器命令:docker container
該命令包括與docker容器相關的操作
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 顯示容器詳細信息
diff 顯示容器變化(A-add 新增,C-change 改變,D-delete 刪除)
stats 實時顯示容器的物理資源資源占用情況
top 顯示容器中正在運行的進程
port 列出容器與宿主機所有端口映射
exec 在一個正在運行的容器中執行一條命令
attach 連接至容器的stdout、stdin、stderr
cp 在容器用宿主機之間復制文件
create 從鏡像創建一個新容器
run 新建一個容器并執行一條命令
rm 刪除容器
prune 刪除所有停止容器
rename 重命名一個容器
start 啟動容器
stop 停止容器(發送SIGTERM后再發送SIGKILL)
restart 重啟容器
kill 強行停止容器(直接發送SIGKILL)
pause 使用cgroup的freezer順序掛起/解掛容器中所有進程
unpause 解除容器掛起
update 更新容器自身的配置參數(如容器CPU、內存的分配參數等)
commit 將容器的變化創建為一個新的鏡像(就是把在容器內執行的一些命令寫到一個新的鏡像層商)
export 將容器導出為鏡像,生成一個tar包(export導出的鏡像會丟失鏡像層結構,無法回滾)
wait 阻塞指定容器直到容器停止,并返回退出碼
2、鏡像命令:docker image
該命令包括與docker鏡像相關的操作
docker image build|history|import|inspect|load|ls|prune|pull|push|rm|save|tag
常用子命令如下:
build 從Dockerfile創建一個鏡像
history 顯示一個鏡像的創建歷史
inspect 顯示鏡像詳細信息
ls 列出本地鏡像
prune 刪除所有沒有使用的鏡像
pull 從倉庫拉去一個鏡像(默認是從docker hub)
push 向倉庫上傳一個鏡像(默認是從docker hub)
rm 刪除一個鏡像
save 將鏡像導出,如果不指定文件,將直接輸出至STDOUT
load 對應docker image save,將save導出的tar包導入成鏡像,或者從STDIN直接輸入
import 對應docker container export,將export導出的tar包導入成鏡像
tag 為鏡像添加TAG,便于鏡像管理
補充一個命令:
docker search [OPTIONS] TERM
該命令用于搜索倉庫中的鏡像(默認還是在docker hub中搜索)。
3、docker服務器命令:docker system
該命令包括整個docker的一些相關操作
docker system df|events|info|prune
常用子命令有:
df 顯示本機docker占用的硬盤空間,包括鏡像、容器還有卷
events 實時顯示docker服務器的事件
info 顯示整個docker服務器信息,比如容器數量,鏡像數量等等等等
prune 刪除所有沒有使用的數據,比如停止的容器,沒用到的鏡像等待
4、還有一些頂級命令。。。。
這個我也不知道是啥的東西已經被我寫成一個純粹的命令堆疊了。。。無所謂了。。。。當成是個命令查詢手冊吧。。。
docker login|logout|search
這三個命令沒有對應的管理命令子命令,其實就是docker倉庫的登陸、注銷、查詢(默認當然還是對docker hub的),其他的頂級命令都有對應的管理命令子命令。
剩下的管理命令子命令諸如volume、network、stack、service之類的怎么不介紹?看多了你也吐,寫多了我也惡心。當然最重要的是我還沒研究明白。以上這些對于docker最基本使用已經足夠了,可以折騰一會了。
下一期,我寫一下docker的一些簡單的使用場景,以及怎么寫dockerfile然后創建鏡像并運行容器。