Docker簡介
一種虛擬容器技術。
- 一種虛擬化分方案;
- 操作系統級別的虛擬化;
- 只能運行相同或相似內核的操作系統;
- 依賴與linux內核特性:Namespace和Cgroups(Control Group)
虛擬機技術和容器技術最大的區別就是對資源的占用。
Docker目標
- 提供簡單輕量的建模方式
- 職責的邏輯分離
- 快速高效的開發生命周期
- 鼓勵使用面向服務的架構
Docker使用場景
- 使用Docker容器開發、測試、部署服務
- 創建隔離的運行環境
- 搭建測試環境
- 構建多用戶的平台即服務(PaaS)基礎設施
- 提供軟件即服務(SaaS)應用程序
- 高性能、超大規模的宿主機部署
Docker的基本組成
- Docker Client 客戶端
- Docker Daemon 守護進程
- Docker Image 鏡像
- Docker Container 容器
- Docker Registry 倉庫
Docker Client 客戶端
- C/S架構
- 本地/遠程調用
Docker客戶端向服務器端發出請求,也就是守護進程。守護進程處理完所有工作將結果返回給客戶端。Docker客戶端對服務器端的訪問既可以在本地也可以在遠程。
Docker Image 鏡像
- 容器的基石
- 層疊的只讀文件系統
Docker鏡像是容器的基石,保存了啟動容器的條件,容器基於鏡像啟動和運行。 Docker鏡像是一個層疊的只讀文件系統,他的最底端是一個引導文件系統及bootfs。 Docker用戶幾乎永遠都不會和引導文件系統有交互,實際上當一個容器啟動后,bootfs會被移到內存中,引導文件將被卸載。
Docker鏡像的第二層是rootfs(root文件系統),位於引導文件系統之上,可以有多種操作系統。 在傳統的linux系統中root文件系統最先會以只讀的方式加載,當引導和啟動完成后他才會被切換成讀寫模式。 但是在Docker里,root文件系統永遠只能是只讀,並且Docker會用聯合加載系統在rootfs之上加載更多的只讀文件系統。 聯合加載只得是一次加載多個文件系統。但是在外面開來只有一個文件系統。聯合加載會將各層文件系統加載到一起, 這樣最終的文件系統會包含所有的文件及目錄。Docker將這樣的文件系統稱為鏡像。 一個鏡像可以放到另一個鏡像頂部,位於下面的鏡像稱為父鏡像。以此類推,直到鏡像棧的最底部。最底部的鏡像稱為基礎鏡像。 也就是bootfs文件系統。
Docker Container 容器
- 容器通過鏡像來啟動
- 啟動和執行階段
- 寫時復制(copy on write)
一個容器中可以運行用戶的一個或多個進程。當一個容器啟動時,Docker會在鏡像的最頂層增加一個讀寫文件系統,我們在Docker中運行的程序就是在這個層運行並執行的。第一次啟動Docker時,讀寫層是空的,當文件發生變化后都會應用到這一層。比如修改一個文件,先將該文件從只讀層復制到讀寫層,然后隱藏只讀層,這就是Docker的寫時復制。
當創建一個容器時,Docker會創建一個鏡像棧,在棧的最頂層增加讀寫層,這個讀寫層和下面的鏡像層以及一些配置數據就構成了一個容器。 容器的這個特點及鏡像分層,可以讓我們快速的構建鏡像,並運行包含我們自己的應用程序和服務的容器。
Docker Registry 倉庫
- 共有
- Docker Hub
- 私有
Docker用倉庫來保存用戶構建的鏡像。
從上圖可以看出,Docker客戶端調用守護進程從而操作Docker的容器,而容器是通過鏡像來創建的,而鏡像又保存在倉庫中。
Docker容器的相關技術
Docker依賴的Linux內核特性
- Namespaces 命名空間
- Control groups(cgroups)控制組
Namespaces 命名空間
- PID(Process ID) 進程隔離
- NET(Network) 管理網絡接口
- IPC(Inter Process Communication) 管理跨進程通信的訪問
- MNT(Mount) 管理掛載點
- UTS(Unix Timeshring System) 隔離內核和版本標識
編程語言中命名空間實現封裝,即代碼隔離。 操作系統中命名空間實現系統資源的隔離,進程、網絡、文件系統...
各種隔離的資源時如何管理起來的,這就用到了Cgroups。
Control groups(cgroups)控制組
- 資源限制
- 優先級設定
- 資源計量
- 資源控制
Docker容器的能力
- 文件系統隔離:每個容器都有自己的root文件系統
- 進程隔離:每個容器都運行在自己的進程環境中
- 網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的
- 資源隔離和分組:使用Cgroups將CPU和內存等資源獨立分配給每個Docker容器
在 Ubuntu 中安裝 Docker
安裝前的檢查
-
內核版本
$ uname -a
-
檢查Device Mapper
$ ls -l /sys/class/misc/device-mapper
Ubuntu中安裝Docker的方式
-
安裝Ubuntu維護的版本
$ sudo apt-get install -y docker.io $ source /etc/bash_completion.d/docker.io
-
安裝Docker維護的版本
-
檢查APT對HTTPS的支持,查看/usr/lib/apt/methods/https文件是否存在。如果不存在,運行安裝命令。
$ apt-get update $ apt-get install -y apt-transport-https
-
添加Docker的APT倉庫
$ echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list
-
添加倉庫的key
$ apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
-
安裝
$ apt-get update $ apt-get install -y lxc-docker
-
-
安裝Docker維護的版本(簡易步驟,使用Docker提供的sh腳本)
$ sudo apt-get install -y curl $ curl -sSL https://get.docker.io/ubuntu/ | sudo sh
啟動docker若出現下面錯誤:
FATA[0000] Error loading docker apparmor profile: fork/exec /sbin/apparmor_parser: no such file or directory ()
請安裝apparmor軟件即可
$ sudo apt-get install apparmor
使用非root用戶運行Docker
一般安裝完Docker運行時需要加sudo來操作,其實可以增加用戶歸屬的用戶組來實現不用root權限運行Docker。
-
添加名字為docker的用戶組
$ sudo groupadd docker
-
將當前用戶添加到當前用戶組中
$ sudo gpasswd -a ${user} dokcer
-
重新啟動docker服務
$ sudo service docker restart
針對當前用戶不會立馬生效,需要注銷后重新登錄以獲取用戶組權限。
在 Windows 中安裝 Docker
使用虛擬機實現,守護進程在虛擬機中。
略
在 OS X 中安裝 Docker
在OS X 上Docker的運行環境
在OS X上安裝Docker前我們先看一下Docker的運行要求.
- Linux容器技術
- 操作系統級別的虛擬化
- 依賴於linux內核的Namespaces和Cgroups
Boot2Docker
OS X的內核是Unix,而且一般root用戶蘋果是不給用戶的。所以要運行Docker在OS X上和在Windows上一樣,需要借助虛擬機來實現。
- 輕量級的Linux發行版,為Docker定制
- Virtualbox VM
- Docker客戶端
- 管理工具
安裝前的檢查
- 系統要求:OS X 10.6 "Snow Leopard"以上版本
安裝步驟
-
訪問github上的Boot2Docker
https://github.com/boot2docker/boot2docker
- 下載Boot2Docker-1.7.0.pkg
- 安裝Boot2Docker-1.7.0.pkg
Boot2Docker的啟動過程
- 打開命令行窗口
- 創建 $HOME/.boot2docker/目錄
- 創建VirtualBox ISO
- 啟動虛擬機並運行Docker守護進程
Boot2Docker的啟動命令
- $ mkdir -p ~/.boot2docker
- $ if [ ! -f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2docker.iso ~/.boot2docker/ ; fi
- $ /usr/local/bin/boot2docker init
- $ /usr/local/bin/boot2docker up
- $ /usr/local/bin/boot2docker shellinit
- $ docker version
驗證Boot2Docker及Docker安裝成功
-
運行命令 $ docker run ubuntu echo hello world 如果打印如下日志,說明安裝成功
bash-3.2$ docker run ubuntu echo hello world Unable to find image 'ubuntu:latest' locally latest: Pulling from ubuntu 428b411c28f0: Pull complete 435050075b3f: Pull complete 9fd3c8c9af32: Pull complete 6d4946999d4f: Already exists ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:45e42b43f2ff4850dcf52960ee89c21cda79ec657302d36faaaa07d880215dd9 Status: Downloaded newer image for ubuntu:latest hello world bash-3.2$
參考:
mac安裝docker指南: http://docs.docker.com/installation/mac/#command-line-docker-with-boot2docker
極客學院視頻: http://www.jikexueyuan.com/path/docker/
doker入門指南: http://my.oschina.net/dlpinghailinfeng/blog/384803
pdf文件下載地址: http://pan.baidu.com/s/1c1corG8