簡介
基本組成
體系結構
鏡像管理
docker鏡像管理常用的指令
容器管理
Dockerfile
Dockerfile定制鏡像
建構鏡像
指令
Compose
管理應用程式資料
管理應用程式示例
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協定開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實作虛拟化。
容器是完全使用沙箱機制,互相之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
Docker 從 17.03 版本之後分為 CE(Community Edition: 社群版) 和 EE(Enterprise Edition: 企業版),我們用社群版就可以了。
Docker Client 用戶端
Docker daemon 守護程序
Docker Image 鏡像
Docker Container 容器
Docker Registry 倉庫
docker image鏡像
鏡像是容器的基石,容器基于鏡像啟動和運作。鏡像就好像容器的源代碼,儲存了容器各種啟動的條件。鏡像是一個層疊的隻讀檔案系統。
docker container 容器
容器通過鏡像來啟動,容器是docker的執行來源,可以執行一個或多個程序。鏡像相當于建構和打包階段,容器相當于啟動和執行階段。容器啟動時,Docker容器可以運作、開始、停止、移動和删除。每一個Docker容器都是獨立和安全的應用平台。
docker registry 倉庫
docker倉庫用來儲存鏡像。docker倉庫分為公有和私有。docker公司提供公有倉庫docker hub,網址:https://hub.docker.com/。我們也可以建立自己私有的倉庫。

Docker 是一個 C/S 模式的架構,後端是一個松耦合架構,子產品各司其職。
使用者是使用 Docker Client 與 Docker Daemon 建立通信,并發送請求給後者。
Docker Daemon 作為 Docker 架構中的主體部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的請求。
Docker Engine 執行 Docker 内部的一系列工作,每一項工作都是以一個 Job 的形式的存在。
Job 的運作過程中,當需要容器鏡像時,則從 Docker Registry 中下載下傳鏡像,并通過鏡像管理驅動 Graphdriver 将下載下傳鏡像以 Graph 的形式存儲。
當需要為 Docker 建立網絡環境時,通過網絡管理驅動 Networkdriver 建立并配置 Docker容器網絡環境。
當需要限制 Docker 容器運作資源或執行使用者指令等操作時,則通過 Execdriver 來完成。
Libcontainer 是一項獨立的容器管理包,Networkdriver 以及 Execdriver 都是通過 Libcontainer 來實作具體對容器進行的操作。
docker鏡像是一個不包含Linux核心的作業系統。
鏡像由docker公司的公共鏡像倉庫下載下傳 https://hub.docker.com/explore
鏡像與容器關系
通過docker history <id/name>檢視鏡像中各層的内容及大小,每層對應着dockerfile中的一個指令,docker鏡像預設存儲在/var/lib/dockerk/中。
容器其實就是在鏡像的最上面加了一層讀寫層,在運作容器裡做的任何修改,都會寫到這個讀寫層。如果容器删除了,最上面的讀寫層資料也就丢失了。docker使用存儲驅動管理鏡像每層内容及可讀寫的容器層。
存儲驅動
Ubuntu
aufs devicemapper overlay2 overlay zfs vfs
Debian
aufs devicemapper overlay2 vfs overlay
centos(6)
devicemapper vfs overlay(7)
fedora
devicemapper overlay2 overlay vfs
overlay overlay2 - ext4,xfs
aufs -ext4,xfs
devicemapper - direct-lvm
btrfs -btrfs
zfs -zfs
ls列出鏡像
build建構鏡像(來自dockerfile)
history檢視鏡像曆史(執行了那些步驟)
inspect顯示一個或多個鏡像詳細資訊
pull從鏡像倉庫拉取鏡像
push推送一個鏡像到倉庫(需要登入)
rm删除鏡像
prune移除未使用的鏡像。沒有被标記或被任何容器引用的
tag建立一個引用鏡像标記目标鏡像
save儲存一個或多個鏡像到一個tar歸檔檔案
load加載鏡像來自tar歸檔或标準輸入
建立容器常用項
管理容器常用指令
Dockerfile 是一個用來建構鏡像的文本檔案,文本内容包含了一條條建構鏡像所需的指令和說明。
1.定制一個 nginx 鏡像(建構好的鏡像内會有一個 /usr/share/nginx/html/index.html 檔案) 在一個空目錄下,建立一個名為 Dockerfile 檔案,并在檔案内添加以下内容:
2.From和RUN指令的作用
FROM:定制的鏡像都是基于FROM的鏡像,這裡的nginx就是定制需要的基礎鏡像。後續的操作都是基于nginx。
RUN:用于執行後面跟着的指令行指令(兩種格式):
shell
exec格式
注意:Dockerfile 的指令每執行一次都會在 docker 上建立一層。是以過多無意義的層,會造成鏡像膨脹過大。
如上,以 && 符号連接配接指令,這樣執行後,隻會建立 1 層鏡像。
在 Dockerfile 檔案的存放目錄下,執行建構動作。
以下示例,通過目錄下的 Dockerfile 建構一個 nginx:v3(鏡像名稱:鏡像标簽)。
注:最後的 . 代表本次執行的上下文路徑。
上下文路徑
有提到指令最後一個 . 是上下文路徑
上下文路徑,是指 docker 在建構鏡像,有時候想要使用到本機的檔案(比如複制),docker build 指令得知這個路徑後,會将路徑下的所有内容打包。
解析:由于 docker 的運作模式是 C/S。我們本機是 C,docker 引擎是 S。實際的建構過程是在 docker 引擎下完成的,是以這個時候無法用到我們本機的檔案。這就需要把我們本機的指定目錄下的檔案一起打包提供給 docker 引擎使用。
如果未說明最後一個參數,那麼預設上下文路徑就是 Dockerfile 所在的位置。
注意:上下文路徑下不要放無用的檔案,因為會一起打包發送給 docker 引擎,如果檔案過多會造成過程緩慢。
Compose 是用于定義和運作多容器 Docker 應用程式的工具。通過 Compose,您可以使用 YML 檔案來配置應用程式需要的所有服務。然後,使用一個指令,就可以從 YML 檔案配置中建立并啟動所有服務。
docker-compose.yml
上面的 <code>docker-compose.yml</code> 檔案定義了兩個服務 web 和 database, 一個服務在運作時對應一個容器的執行個體, 上面的檔案表示要啟動兩個執行個體。
在部署時, 通常将 <code>docker-compose.yml</code> 檔案放到一個目錄, 表示一個應用, docker 會為這個應用建立一個獨立的網絡, 便于和其它應用進行隔離。
要運作這個程式, 隻要在這個目錄下執行 <code>docker-compose up -d</code> 指令, 就會按照上面的配置啟動兩個容器的執行個體:
要停止上面的容器, 隻需要輸入 <code>docker-compose down</code> 指令:
從上面的指令可以看出, docker-compose 不僅可以根據配置檔案 <code>docker-compose.yml</code> 自動建立網絡, 啟動響應的容器執行個體, 也可以根據配置檔案删除停止和删除容器執行個體, 并删除對應的網絡, 确實是 <code>docker run</code> 指令更加友善, 是以推薦在測試環境或者生産環境中使用。
将資料從主控端到容器的三種方式
volumes:docker管理主控端檔案系統的一部分(/var/lib/docker/volumes)儲存資料的最佳方式
bind mounts 将主控端上的任意位置的檔案或者目錄挂在到容器 (–mount type=bind,src=源目錄,dst=目标目錄)
tmpfs:挂載存儲在主機系統的記憶體中,而不會寫入主機的檔案系統。如果不希望将資料持久存儲在任何位置,可以使用
tmpfs,同時避免寫入容器可寫層提高性能。
參考
http://www.google.com
http://t.cn/RdiV7Sn