Docker系統(tǒng)
Docker系統(tǒng)有兩個(gè)程序:docker服務(wù)端和docker客戶端
docker服務(wù)端:是一個(gè)服務(wù)進(jìn)程两残,管理著所有的容器型诚。也叫docker engine
docker客戶端:扮演著docker服務(wù)端的遠(yuǎn)程控制器蠕啄,可以用來控制docker的服務(wù)端進(jìn)程。
大部分情況下剖淀,docker服務(wù)端和客戶端運(yùn)行在一臺(tái)機(jī)器上
Docker三大核心組件:
Docker 鏡像 - Docker images
Docker 倉庫 - Docker registeries
Docker 容器 - Docker containers
容器的三大組成要素:
名稱空間 namespace 容器隔離(pid,net,mnt,user,)
資源限制 cgroups 資源(內(nèi)存纯蛾,cpu)
文件系統(tǒng) overlay2(UnionFS)
docker 倉庫:
用來保存鏡像,可以理解為代碼控制中的代碼倉庫纵隔。同樣的翻诉,Docker 倉庫也有公有和私有的概念。
公有的 Docker 倉庫名字是 Docker Hub捌刮。Docker Hub 提供了龐大的鏡像集合供使用碰煌。這些鏡像可以是自己創(chuàng)建,或者在別人的鏡像基礎(chǔ)上創(chuàng)建绅作。
倉庫(registry) -->Repository-->鏡像(按版本區(qū)分)
docker.io/centos:7
registry/repository:tag
repository:存儲(chǔ)庫
docker 國(guó)內(nèi)倉庫
ali
網(wǎng)易蜂巢
daocloud
=========================
docker公有倉庫
docker.io -------docker官方庫也叫docker-hub
類似于github一樣芦圾,面向全球的一個(gè)docker鏡像的公共倉庫。如果在國(guó)內(nèi)使用速度太慢俄认。
===============================
docker私有倉庫
個(gè)人或者公司部署的非公開庫
Docker 鏡像
? Docker 鏡像是 Docker 容器運(yùn)行時(shí)的只讀模板个少,每一個(gè)鏡像由一系列的層 (layers) 組成洪乍。Docker 使用 UnionFS 來將這些層聯(lián)合到單獨(dú)的鏡像中。正因?yàn)橛辛诉@些層的存在夜焦,Docker 是如此的輕量壳澳。當(dāng)你改變了一個(gè) Docker 鏡像,比如升級(jí)到某個(gè)程序到新的版本茫经,一個(gè)新的層會(huì)被創(chuàng)建巷波。因此,不用替換整個(gè)原先的鏡像或者重新建立(在使用虛擬機(jī)的時(shí)候你可能會(huì)這么做)卸伞,只是一個(gè)新的層被添加或升級(jí)了抹镊。
在 Docker 的術(shù)語里,一個(gè)只讀層被稱為鏡像荤傲,一個(gè)鏡像是永久不會(huì)變的垮耳。由于 Docker 使用一個(gè)統(tǒng)一文件系統(tǒng),由于鏡像不可寫遂黍,所以鏡像是無狀態(tài)的氨菇。
鏡像由三部分組成:
鏡像名稱:倉庫名稱+鏡像分類+tag名稱(鏡像版本)
1.存儲(chǔ)對(duì)象:images
2.格式:庫名/分類:tag
3.tag:表示鏡像版本
鏡像的大體分類方式:這不是規(guī)定
1.以操作系統(tǒng)名字
centos的docker鏡像:
centos5
centos6
centos7
-----------------
2.以應(yīng)用的名字
nginx的docker鏡像
tomcat的docker鏡像
mysql的docker鏡像
鏡像名字:
完整鏡像名稱示例:
docker.io/library/nginx:v1
docker.io/library/nginx:latest
daocloud.io/library/nginx
鏡像ID:
所有鏡像都是通過一個(gè) 64 位十六進(jìn)制字符串來標(biāo)識(shí)的。 為簡(jiǎn)化使用妓湘,前 12 個(gè)字符可以組成一個(gè)短ID,可以在命令行中使用乌询。短ID還是有一定的碰撞機(jī)率榜贴,所以服務(wù)器總是返回長(zhǎng)ID。
鏡像ID:64位的id號(hào)妹田,一般我們看到的是12位的我們稱之為短ID唬党,只要我們每個(gè)ID號(hào)不沖突就可以了
鏡像本身:是由一層一層的鏡像合在一起的,最底層的鏡像我們稱為基礎(chǔ)鏡像鬼佣,在這個(gè)基礎(chǔ)鏡像的基礎(chǔ)上還可以在做鏡像驶拱,在做的鏡像稱為子鏡像,對(duì)于子鏡像來講在誰的基礎(chǔ)之上做的就是父鏡像晶衷。
基礎(chǔ)鏡像:一個(gè)沒有任何父鏡像的鏡像蓝纲,謂之基礎(chǔ)鏡像。
centos7 鏡像
centos7+nginx 鏡像
Docker 容器
? Docker 容器和文件夾很類似晌纫,一個(gè)Docker容器包含了所有的某個(gè)應(yīng)用運(yùn)行所需要的環(huán)境税迷。每一個(gè) Docker 容器都是從 Docker 鏡像創(chuàng)建的。Docker 容器可以運(yùn)行锹漱、開始箭养、停止、移動(dòng)和刪除哥牍。每一個(gè) Docker 容器都是獨(dú)立和安全的應(yīng)用平臺(tái)毕泌,Docker 容器是 Docker 的運(yùn)行部分喝检。
docker鏡像命名解析
Docker鏡像命名解析
鏡像是Docker最核心的技術(shù)之一,也是應(yīng)用發(fā)布的標(biāo)準(zhǔn)格式撼泛。無論你是用docker pull image挠说,或者是在
Dockerfile里面寫FROM image,從Docker官方Registry下載鏡像應(yīng)該是Docker操作里面最頻繁的動(dòng)作之一
了坎弯。那么docker鏡像是如何命名的纺涤,這也是Docker里面比較容易令人混淆的一塊概念:Registry,Repository, Tag and Image抠忘。
那么Registry又是什么呢撩炊?Registry存儲(chǔ)鏡像數(shù)據(jù),并且提供拉取和上傳鏡像的功能崎脉。Registry中鏡像是通過
Repository來組織的拧咳,而每個(gè)Repository又包含了若干個(gè)Image。
下面是在本地機(jī)器運(yùn)行docker images的輸出結(jié)果:
常說的"ubuntu"鏡像其實(shí)不是一個(gè)鏡像名稱囚灼,而是代表了一個(gè)名為ubuntu的Repository骆膝,同時(shí)在這個(gè)Repository下面有一系列打了tag的Image,Image的標(biāo)記是一個(gè)GUID灶体,為了方便也可以通過Repository:tag來引用阅签。
Image[:tag]
當(dāng)一個(gè)鏡像的名稱不足以分辨這個(gè)鏡像所代表的含義時(shí),你可以通過tag將版本信息添加到run命令中蝎抽,以執(zhí)行特
定版本的鏡像政钟。
例如:docker run ubuntu:14.04
docker鏡像和容器的區(qū)別
一、Docker鏡像
要理解Docker鏡像和docker容器之間的區(qū)別樟结,確實(shí)不容易养交。。
一個(gè)Docker鏡像可以構(gòu)建于另一個(gè)Docker鏡像之上瓢宦,這種層疊關(guān)系可以是多層的碎连。第1層的鏡像層我們稱之為基礎(chǔ)鏡像(Base Image),其他層的鏡像(除了最頂層)我們稱之為父層鏡像(Parent Image)驮履。這些鏡像繼承了他們的父層鏡像的所有屬性和設(shè)置鱼辙。
Docker鏡像通過鏡像ID進(jìn)行識(shí)別。鏡像ID是一個(gè)64字符的十六進(jìn)制的字符串疲吸。但是當(dāng)我們運(yùn)行鏡像時(shí)座每,通常我們不會(huì)使用鏡像ID來引用鏡像,而是使用鏡像名來引用摘悴。
要列出本地所有有效的鏡像峭梳,可以使用命令
# docker images
鏡像可以發(fā)布為不同的版本,這種機(jī)制我們稱之為標(biāo)簽(Tag)。
可以使用pull命令加上指定的標(biāo)簽:
# docker pull ubuntu:14.04
# docker pull ubuntu:12.04
二葱椭、Docker容器
Docker容器可以使用命令創(chuàng)建:
# docker run -it imagename /bin/bash
它會(huì)在所有的鏡像層之上增加一個(gè)可寫層捂寿。這個(gè)可寫層有運(yùn)行在CPU上的進(jìn)程,而且有兩個(gè)不同的狀態(tài):運(yùn)行態(tài)
(Running)和退出態(tài) (Exited)孵运。這就是Docker容器秦陋。當(dāng)我們使用docker run啟動(dòng)容器,Docker容器就進(jìn)
入運(yùn)行態(tài)治笨,當(dāng)我們停止Docker容器時(shí)驳概,它就進(jìn)入退出態(tài)。
當(dāng)我們有一個(gè)正在運(yùn)行的Docker容器時(shí)旷赖,從運(yùn)行態(tài)到停止態(tài)顺又,我們對(duì)它所做的一切變更都會(huì)永久地寫到容器的文
件系統(tǒng)中。要切記等孵,對(duì)容器的變更是寫入到容器的文件系統(tǒng)的稚照,而不是寫入到Docker鏡像中的。
我們可以用同一個(gè)鏡像啟動(dòng)多個(gè)Docker容器俯萌,這些容器啟動(dòng)后都是活動(dòng)的果录,彼此還是相互隔離的。我們對(duì)其中一
個(gè)容器所做的變更只會(huì)局限于那個(gè)容器本身咐熙。如果對(duì)容器的底層鏡像進(jìn)行修改弱恒,那么當(dāng)前正在運(yùn)行的容器是不受影響的,不會(huì)發(fā)生自動(dòng)更新現(xiàn)象棋恼。
名字空間--namespace
namespace 空間隔離
cgroup 資源限制
名字空間是 Linux 內(nèi)核一個(gè)強(qiáng)大的特性斤彼。每個(gè)容器都有自己?jiǎn)为?dú)的名字空間,運(yùn)行在其中的應(yīng)用都像是在獨(dú)立的操作系統(tǒng)中運(yùn)行一樣蘸泻。名字空間保證了容器之間彼此互不影響。
- pid 名字空間
不同用戶的進(jìn)程就是通過 pid 名字空間隔離開的嘲玫,且不同名字空間中可以有相同 pid悦施。所有的 LXC 進(jìn)程在 Docker中的父進(jìn)程為Docker進(jìn)程,每個(gè) LXC 進(jìn)程具有不同的名字空間去团。同時(shí)由于允許嵌套抡诞,因此可以很方便的實(shí)現(xiàn)嵌套的 Docker 容器。
-
net 名字空間 ----做網(wǎng)絡(luò)接口隔離的
有 了 pid 名字空間, 每個(gè)名字空間中的 pid 能夠相互隔離土陪,但是網(wǎng)絡(luò)端口還是共享 host 的端口昼汗。網(wǎng)絡(luò)隔離是通過 net 名字空間實(shí)現(xiàn)的, 每個(gè) net 名字空間有獨(dú)立的 網(wǎng)絡(luò)設(shè)備, IP 地址, 路由表, /proc/net 目錄鬼雀。這樣每個(gè)容器的網(wǎng)絡(luò)就能隔離開來顷窒。
ipc 名字空間
容器中進(jìn)程交互還是采用了 Linux 常見的進(jìn)程間交互方法(interprocess communication - IPC), 包括信號(hào)量、消息隊(duì)列和共享內(nèi)存、socket鞋吉、管道等鸦做。
面試題:linux系統(tǒng)里面ipc通信有幾種方式
socket:網(wǎng)絡(luò)進(jìn)程間的通信
管道:本地進(jìn)程間的通信:echo hello | grep e
信號(hào): kill -9 PID 這種我們叫信號(hào)量級(jí),也是本地進(jìn)程間的通信
共享內(nèi)存:每個(gè)操作系統(tǒng)里面共享內(nèi)存多大谓着,是物理內(nèi)存的一半
- mnt名字空間
mnt 名字空間允許不同名字空間的進(jìn)程看到的文件結(jié)構(gòu)不同泼诱,這樣每個(gè)名字空間 中的進(jìn)程所看到的文件目錄就被隔離開了。
- uts 名字空間
UTS("UNIX Time-sharing System") 名字空間允許每個(gè)容器擁有獨(dú)立的 hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個(gè)獨(dú)立的節(jié)點(diǎn)而非主機(jī)上的一個(gè)進(jìn)程赊锚。
- user 名字空間
每個(gè)容器可以有不同的用戶和組 id, 也就是說可以在容器內(nèi)用容器內(nèi)部的用戶執(zhí)行程序而非主機(jī)上的用戶治筒。