文章作者:Tyan
博客:noahsnail.com
1. docker安裝及介紹
1.1 docker安裝
Mac上Docker安裝,參考文檔:https://docs.docker.com/docker-for-mac/
1.2 docker平臺(tái)介紹
docker是一個(gè)開發(fā),移植,運(yùn)行應(yīng)用的開放平臺(tái)。docker能使程序和運(yùn)行的基礎(chǔ)環(huán)境進(jìn)行分離,因此你可以快速交付軟件。利用docker的優(yōu)勢(shì),你可以快速移植,測(cè)試,部署代碼,可以顯著的降低代碼編寫與程序運(yùn)行之間的延遲。docker提供了打包并在隔離環(huán)境中運(yùn)行程序的能力,這個(gè)隔離環(huán)境就是容器。容器的隔離性與安全性可以使你在一臺(tái)主機(jī)上同時(shí)運(yùn)行許多容器。由于容器的輕量級(jí)特性,你可以在運(yùn)行虛擬機(jī)的硬件上運(yùn)行更多的容器。
docker提供了管理容器的工具和平臺(tái):
將應(yīng)用封裝到docker的容器中
在團(tuán)隊(duì)中分發(fā)和移植這些容器以便于快速開發(fā)和測(cè)試
在產(chǎn)品環(huán)境中部署應(yīng)用,無論是在本地還是在云上
2. 查看版本
# docker,docker-compose,docker-machine
docker --version
docker-compose --version
docker-machine --version
3. Docker部分命令
# 運(yùn)行一個(gè)docker實(shí)例,如果沒有會(huì)從Docker Hub上pull(類似于git的pull命令),--name 指定docker容器名字,nginx為image
docker run -d -p 80:80 --name webserver nginx
# 列出當(dāng)前運(yùn)行的docker container
docker ps
# 結(jié)果信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5af6a4c418b6 nginx "nginx -g 'daemon off" 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, 443/tcp webserver
# 停止運(yùn)行webserver 的docker container
docker stop webserver
# 運(yùn)行docker ps,不輸出信息
docker ps
# docker中啟動(dòng)webserver,使用docker ps查看
docker start webserver
# 停止webserver容器并刪除,不是刪除了nginx image
docker rm -f webserver
# 列出本地所有docker image
docker images
# 刪除本地的docker image,使用docker images查看
# docker rmi <imageID>|<imageName>
docker rmi nignx
# docker卸載
# <DockerforMacPath> --uninstall,下面的是默認(rèn)路徑
/Applications/Docker.app/Contents/MacOS/Docker --uninstall
4. Docker Engine
docker引擎是一個(gè)client-server應(yīng)用,主要有以下組件:
server,一個(gè)稱為daemon進(jìn)程的長期運(yùn)行的程序。
REST API 提供交互程序,可以與daemon進(jìn)行交互并告訴它做什么。
CLI(command line interface) client。
5. docker作用
5.1 快速,一致的交付你的應(yīng)用
你可以將docker集成到CI/CD流中。
CI:continuous integration
CD:continuous deployment
想象這樣一個(gè)場(chǎng)景,你有三個(gè)docker的容器,一個(gè)用來開發(fā),一個(gè)用來測(cè)試,一個(gè)用來發(fā)布,你可以很容器的在三者之間轉(zhuǎn)換,并且在測(cè)試容器中發(fā)現(xiàn)問題,可以立即到開發(fā)容器中修改,然后重新部署到測(cè)試容器中,沒問題了,再發(fā)布到發(fā)布容器中,三個(gè)容器之間互不影響,而且都在一臺(tái)電腦上就能完成,并且三者之間的部署是非常的easy。
5.2 響應(yīng)式的部署與擴(kuò)展
docker的容器是便攜式,輕量級(jí)的,你可以將它運(yùn)行在本地,物理機(jī)上,虛擬機(jī)上,云上,甚至是這些環(huán)境的混合。docker可以很容易的動(dòng)態(tài)管理工作負(fù)載,進(jìn)行擴(kuò)展,應(yīng)用拆分,根據(jù)業(yè)務(wù)需求進(jìn)行服務(wù),這些操作是接近實(shí)時(shí)的。
5.3 在同樣的硬件上運(yùn)行更多的應(yīng)用
docker是快速輕量級(jí)的。它提供了一個(gè)虛擬機(jī)(基于hypervisor的)的替代品,而且這個(gè)替代品是可行的、劃算的。docker可以讓你使用更多的計(jì)算性能來達(dá)到你的業(yè)務(wù)目標(biāo)。在高密集環(huán)境,使用更少資源來部署應(yīng)用的情況下是非常有用的。
6. docker的架構(gòu)
docker采用client-server架構(gòu)。docker的client與docker的daemon進(jìn)行交互,daemon負(fù)責(zé)container(容器)的building,running,distribution。docker的client和daemon可以在一個(gè)系統(tǒng)中運(yùn)行,或者使用client鏈接遠(yuǎn)程的Docker daemon。client和daemon的交互是通過socket或REST API進(jìn)行的。
The Docker daemon
docker daemon運(yùn)行在主機(jī)上,用戶通過client與daemon進(jìn)行交互。
The Docker client
用戶與docker交互的主要接口,可以接收commands和configuration flags。一個(gè)client可以與多個(gè)無關(guān)的daemon交互。
Inside Docker
要了解docker內(nèi)部的東西,需要了解images, registries, containers。
Docker images
docker的images是指令的只讀模板,是用來創(chuàng)建container的。一個(gè)image可能包含帶有Apache web服務(wù)器和已經(jīng)安裝了web應(yīng)用的Ubuntu操作系統(tǒng)。你可以創(chuàng)建或更新images,可以使用其他人創(chuàng)建的images。一個(gè)image可能是基于其它images的,也可能是其它images的一個(gè)擴(kuò)展。描述image的文本文件稱為Dockerfile,里面有一些簡單的、已經(jīng)定義好的語法。
images是docker的build組件。
Docker containers
docker container是docker image的運(yùn)行實(shí)例。通過Docker API或CLI command你可以運(yùn)行,啟動(dòng)、停止、移動(dòng)和刪除container。運(yùn)行容器時(shí),可以提供配置信息或環(huán)境變量。每個(gè)容器都是一個(gè)安全、隔離的應(yīng)用平臺(tái)。
containers是docker的run組件
Docker registries
docker registry是一個(gè)image庫。registry可以是公有的或私有的,可以與daemon或client放在同一個(gè)服務(wù)器上,也可以在一個(gè)完全分離的服務(wù)器上。
registries是docker的distribution組件。
Docker services
docker service允許一群(swarm)docker結(jié)點(diǎn)一起工作,可以運(yùn)行指定數(shù)目task副本實(shí)例,每個(gè)副本本身是一個(gè)image。你可以指定并發(fā)運(yùn)行的task副本的數(shù)目,swarm管理器負(fù)責(zé)工作結(jié)點(diǎn)的負(fù)載均衡。對(duì)于用戶而言,docker service就是一個(gè)單一應(yīng)用。Docker Engine在Docker 1.12版本或更高版本支持swarm模式。
services是docker的scalability組件。
Docker Component
Component Name | Component Feature |
---|---|
image | build |
container | run |
registry | distribution |
service | scalability |
7. docker組件工作原理
7.1 How does a Docker image work?
Docker images是只讀模板,docker containers根據(jù)images進(jìn)行實(shí)例化。每個(gè)image中包含很多層(layer)。Docker使用union file systems將這些層結(jié)合到一個(gè)image中。union file systems允許獨(dú)立的文件系統(tǒng)中的文件和目錄(稱為分支)進(jìn)行顯式的疊加,形成一個(gè)一致的文件系統(tǒng)。
這些layers是Docker輕量級(jí)的原因之一。當(dāng)更改一個(gè)image時(shí),例如應(yīng)用更新時(shí),將會(huì)創(chuàng)建一個(gè)新層并將要更新的層進(jìn)行替換,其它層保持不變。要發(fā)布更新,你只需要傳遞更新的層。Laying加速了Docker images的分發(fā)。Docker決定運(yùn)行時(shí)更新哪些層。
Docker images在Dockerfile中定義。每個(gè)image都是起始于一個(gè)base image,例如ubuntu
,是從base Ubuntu image來的,fedora
同樣如此。你可以使用你自己的image作為一個(gè)新image的基,例如你可以使用Apache image作為你所有web應(yīng)用image的基。dockefile中使用FROM
來定義base image。
注:Dock Hub是一個(gè)公有的registry,主要用來存儲(chǔ)images。
從base image創(chuàng)建docker image主要通過一系列簡單的描述步驟的集合,稱之為instructions
,它是存儲(chǔ)在一個(gè)Dockfile
中的。每個(gè)instruction創(chuàng)建image中的一個(gè)新layer。下面是一些Dockfile instructions的例子:
- 指定base image的名字 (
FROM
) - 指定maintainer (
MAINTAINER
) - 運(yùn)行命令 (
RUN
) - 添加一個(gè)文件或目錄 (
ADD
) - 創(chuàng)建環(huán)境變量 (
ENV
) - 從image啟動(dòng)一個(gè)container時(shí)運(yùn)行哪一個(gè)進(jìn)程 (
CMD
)
當(dāng)你創(chuàng)建一個(gè)image時(shí),Docker會(huì)讀取Dockerfile
,執(zhí)行其中的instructions
,返回創(chuàng)建的image。
7.2 How does a Docker registry work?
Dock registry是存儲(chǔ)Docker image的。在創(chuàng)建Docker image之后,你可以push(類似于git的push)到一個(gè)公共的registry例如Dock Hub或一個(gè)在防火墻之后運(yùn)行私有的registry中。你也可以搜索現(xiàn)有的images并將它們從registry中pull(類似于git的pull)下來。
Docker Hub是一個(gè)公有的Docker registry,上面有現(xiàn)有的images并且允許你貢獻(xiàn)你自己的image。
Docker商店允許買賣Docker images。對(duì)于image,你可以從軟件供應(yīng)商那購買一個(gè)包含應(yīng)用的Docker image,并用這個(gè)image部署應(yīng)用到你的testing,staging和production環(huán)境中,通過pull新版本的image來進(jìn)行升級(jí)并重新部署到容器中。Docker商店現(xiàn)在在私有的beta中。
7.3 How does a container work?
container使用主機(jī)的Linux內(nèi)核,當(dāng)image創(chuàng)建時(shí)包括使用你添加的額外文件,當(dāng)container運(yùn)行時(shí),使用container創(chuàng)建的相關(guān)元數(shù)據(jù)。image定義了container的內(nèi)容,包括container啟動(dòng)時(shí)運(yùn)行哪一個(gè)進(jìn)程,還有許多其它的配置細(xì)節(jié)。Docker image是只讀的。當(dāng)Docker從一個(gè)image運(yùn)行一個(gè)container時(shí),它會(huì)在應(yīng)用運(yùn)行的image之上添加讀寫層(使用前面的UnionFS)。
7.4 What happens when you run a container?
當(dāng)使用CLI命令docker run
或等價(jià)的API時(shí),Docker Engine client會(huì)通知Docker daemon運(yùn)行一個(gè)container。下面的例子告訴Docker daemon運(yùn)行一個(gè)container,使用ubuntu
Docker image,保持前端的交互模式(-i
),運(yùn)行/bin/bash
命令。
$ docker run -i -t ubuntu /bin/bash
當(dāng)執(zhí)行這個(gè)命令時(shí),Docker Engine執(zhí)行下面的過程:
Pulls the
ubuntu
image: Docker Engine 檢查ubuntu
image是否存在. 如果image本地存在, Docker Engine 使用它創(chuàng)建container。否則, Docker Engine會(huì)從Dock Hub上pull這個(gè)image.Creates a new container: Docker用這個(gè)image創(chuàng)建container.
Allocates a filesystem and mounts a read-write layer: 在文件系統(tǒng)中創(chuàng)建container并在image中添加讀寫layer.
Allocates a network / bridge interface: 創(chuàng)建網(wǎng)絡(luò)接口,運(yùn)行Docker container與本地主機(jī)通信.
Sets up an IP address: 從池中添加可用的IP地址.
Executes a process that you specify: 執(zhí)行
/bin/bash
可執(zhí)行程序.Captures and provides application output: 鏈接并打印標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤信息,你可以看到你的應(yīng)用運(yùn)行情況,因?yàn)槟阏?qǐng)求了交互模式。
8. docker基礎(chǔ)技術(shù)
docker是用Go語言寫的并且利用了Linux內(nèi)核的一些特性來交付它的功能。
8.1 Namespaces
Docker使用namespaces
技術(shù)為container提供獨(dú)立的工作空間。當(dāng)你運(yùn)行一個(gè)container時(shí),Docker為container創(chuàng)建一系列namespaces。
命名空間提供了獨(dú)立的層。container的每個(gè)方面都運(yùn)行在一個(gè)獨(dú)立的命名空間中,并且有權(quán)訪問那個(gè)命名空間。
Docker Engine在Linux中使用下面的命名空間:
pid
namespace: 進(jìn)程分離 (PID: Process ID).
net
namespace: 管理網(wǎng)絡(luò)接口 (NET: Networking).
ipc
namespace: 管理IPC資源的訪問權(quán)限 (IPC: InterProcess Communication).
mnt
namespace: 管理文件掛載點(diǎn) (MNT: Mount).
uts
namespace: 分離內(nèi)核和版本標(biāo)識(shí)符. (UTS: Unix Timesharing System).
8.2 Control groups
Docker Engine在Linux上也依賴另一項(xiàng)技術(shù)叫做control groups (cgroups
)。cgroup
限定應(yīng)用訪問特定的資源集合。Control groups允許Docker Engine的containers共享可獲得的硬件資源。例如,你可以限制特定容器的可用內(nèi)存。
8.3 Union file systems
Union文件系統(tǒng)或UnionFS,是創(chuàng)建層操作的文件系統(tǒng),可以使創(chuàng)建層快速且輕量級(jí)。 Docker Engine使用UnionFS提供containers的創(chuàng)建塊。Docker Engine可以使用多個(gè)UnionFS變種,包括AUFS,btrfs,vfs,和DeviceMapper。
8.4 Container format
Docker Engine將namespaces,control groups和UnionFS組合進(jìn)一個(gè)包裝器叫做container format。默認(rèn)的container format叫libcontainer
。將來,Docker通過技術(shù)融合例如BSD Jails或Solaris Zones可能會(huì)支持其它的container formats。
注:有英語閱讀能力的同學(xué)還上去看官網(wǎng)吧,上面講的特別詳細(xì),適合入門及提高!