1 概論
1.1 定義
“build once, configure once and run anywhere”。
Docker是一個開源的引擎,可以輕鬆的爲任何應用創建一個輕量級的、可移植的、自給自足的容器。
虛擬化技術包括硬件級虛擬化(如VMWare、VirtualBox、AWS、阿里雲等)和操作系統級虛擬化(如Docker)。
Docker是操作系統虛擬化(容器化)技術中目前最流行的一種實現。
1.2 應用場景
Docker通常用於如下場景:
Ø web應用的自動化打包和發佈;
Ø 自動化測試和持續集成、發佈;
Ø 在服務型環境中部署和調整數據庫或其他的後臺應用;
Ø 從頭編譯或者擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。
Docker能處理的事情包括:
Ø 隔離應用依賴
Ø 創建應用鏡像並進行復制
Ø 創建容易分發的即啓即用的應用
Ø 允許實例簡單、快速地擴展
Ø 測試應用並隨後銷燬它們
2 基礎概念
2.1 Docker鏡像
類似虛擬機的快照,是自定義一套的操作系統環境。
創建鏡像有兩種方式:
Ø 從公共Docker倉庫裏選擇一個鏡像在其基礎上修改(常用)。
Ø 自己創建(後續詳解)。
2.2 Docker倉庫
Docker倉庫用於保存鏡像, Docker 倉庫分爲公有和私有倉庫。公有的 Docker 倉庫名字爲Docker Hub,提供了大量的鏡像集合供使用。
2.3 Docker容器
使用鏡像創建Docker容器,可以理解爲鏡像的一個實例,容器裏可以運行應用。容器可以對外開放服務端口。
容器是設計來運行一個應用的,而非一臺機器。停止一個Docker容器,對初始狀態(創建容器所用的鏡像的狀態)做的所有變化都會丟失,所以業務數據不能存儲在容器裏,容器只是運行應用的環境。
Docker設計者極力推崇“一個容器一個進程的方式”,容器被設計用來運行單進程,無法很好地模擬一個完整的環境(如需模擬完整環境則參閱LXC)。
當容器被啓動後,一個讀寫層會被添加到鏡像的頂層。當分配到合適的網絡和IP地址後,需要的應用程序就可以在容器中運行了。
2.4 數據卷
數據卷使得開發者可以不受容器生命週期影響而進行數據持久化。它們表現爲容器內的空間,但實際數據保存在容器之外,從而允許我們在不影響數據的情況下銷燬、重建、修改、丟棄容器。
Docker允許定義應用部分和數據部分,並提供工具可以將它們分開。使用Docker時必須做出的最大思維變化之一就是:容器應該是短暫和一次性的。
卷是針對容器的,可以使用同一個鏡像創建多個容器並定義不同的卷。卷保存在運行Docker的宿主文件系統上,可以指定卷存放的目錄,或讓Docker保存在默認位置。保存在其他類型文件系統上的都不是一個卷。卷還可以用來在容器間共享數據。
2.5 鏈接
Docker允許在創建一個新容器時引用其它現存容器,在剛創建的容器裏被引用的容器將獲得一個別名,則視爲這兩個容器鏈接在了一起。
容器啓動時,將被分配一個隨機的私有IP,其它容器可以使用這個IP地址與其進行通訊。這點非常重要,原因有二:一是它提供了容器間相互通信的渠道,二是容器將共享一個本地網絡。
3 安裝(CentOS 7)
參考:https://docs.docker.com/engine/installation/linux/centos/
3.1 前置條件
安裝Docker需要64位的內核爲3.10或以上的Linux系統。
可使用以下命令查看內核:
# uname -r
輸出如:3.10.0-229.el7.x86_64
3.2 通過yum安裝
3.2.1 更新yum軟件包到最新版本
# yum update
3.2.2 添加docker yum repo
# vi /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
3.2.3 安裝
# yum install -y docker-engine
3.2.4 啓用服務
# systemctl enable docker.service
3.2.5 啓動
# systemctl start docker
3.2.6 驗證
# docker run --rm hello-world
docker將自動下載hello-world:latest鏡像,下載完成後運行結果包含:
Hello from Docker!
This message shows that your installation appears to beworking correctly.
則表示docker已正確安裝。
3.3 通過官方腳本安裝
下載官方的docker安裝腳本進行安裝,本質上也是通過yum安裝,步驟與yum安裝類似。
# yum update
# curl -fsSL https://get.docker.com/ | sh
# systemctl enable docker.service
# systemctl start docker
# docker run --rm hello-world
3.4 創建docker group
Docker的守護進程啓動後會爲名稱爲docker的用戶組下的用戶賦予Unix Socket的讀寫權限,有需要的話可以創建docker用戶組。
4 鏡像操作
在使用 docker 的時候,首先需要拉取鏡像,然後再通過一個容器來運行這個鏡像。通過鏡像是可以生成容器的。同時,當容器運行到一個時間的時候,我們也可以通過 docker commit,將容器的可讀可寫層轉化爲鏡像。因此,鏡像和容器是相生相伴的,缺一不可的。
本節以下載ubuntu鏡像爲例。
4.1 查看本機鏡像
# docker images
4.2 搜索鏡像
# docker search <鏡像名關鍵詞>
4.3 下載鏡像
# docker pull ubuntu
docker pull 會默認從 docker hub 拉取鏡像,如果本地已經有了就直接結束,否則的話會根據文件系統分層逐個下載。
4.4 push鏡像到遠程庫
4.4.1 tag鏡像
# docker tag <鏡像名稱[:TAG]> <要標記成的鏡像名稱[:TAG]>
如:
# docker tag ubuntu my-ubuntu-tag
4.4.2 push
# docker push <標記成鏡像名稱[:TAG]>
4.5 刪除鏡像
# docker rmi <要刪除的鏡像名稱>
5 容器操作
5.1 從鏡像運行一個含shell的容器
# docker run -i -t <鏡像名稱> /bin/bash
如:
# docker run -i -t ubuntu /bin/bash
5.2 查看運行的容器
# docker ps
運行容器後,可通過該命令查看到運行的容器的信息,如ID:f70b2a474d88。
5.3 容器的啓停
包括啓動、停止、重啓、強行停止和刪除。
# docker start f70b2a474d88
# docker stop f70b2a474d88
# docker restart f70b2a474d88
# docker kill f70b2a474d88
# docker remove f70b2a474d88
5.4 持久化容器
容器在退出後並不會更改鏡像,如果希望保存容器中的數據,就需要通過 commit 來保存成鏡像:
# docker commit <容器ID> <要保存成的鏡像名>
如:
# docker commit f70b2a474d88 my-ubunt-checkpoint
5.5 查看容器配置
# docker inspect <容器ID>
6 參考
http://www.docker.org.cn/book/docker/what-is-docker-16.html
http://yuedu.baidu.com/ebook/d817967416fc700abb68fca1?pn=1