Docker理論與實(shí)踐(一)

文章作者: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。

image

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)行的。

image
image

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í)行下面的過程:

  1. Pulls the ubuntu image: Docker Engine 檢查ubuntu image是否存在. 如果image本地存在, Docker Engine 使用它創(chuàng)建container。否則, Docker Engine會(huì)從Dock Hub上pull這個(gè)image.

  2. Creates a new container: Docker用這個(gè)image創(chuàng)建container.

  3. Allocates a filesystem and mounts a read-write layer: 在文件系統(tǒng)中創(chuàng)建container并在image中添加讀寫layer.

  4. Allocates a network / bridge interface: 創(chuàng)建網(wǎng)絡(luò)接口,運(yùn)行Docker container與本地主機(jī)通信.

  5. Sets up an IP address: 從池中添加可用的IP地址.

  6. Executes a process that you specify: 執(zhí)行/bin/bash可執(zhí)行程序.

  7. 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ì),適合入門及提高!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,951評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,566評(píng)論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,683評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,899評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,135評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評(píng)論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,528評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,844評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容