深入淺出Docker學(xué)習(xí)筆記
Docker引擎
-
Docker引擎
:用來運行和管理容器的核心文件- 模塊化(基于開放容器計劃
OCI
相關(guān)標(biāo)準(zhǔn)要求) - 主要組件:
Docker Client
、Docker daemon
(Docker
守護進程)咪鲜、containerd
以及runc
- 模塊化(基于開放容器計劃
-
runc
-
OCI
容器運行時規(guī)范的參考實現(xiàn) - 實質(zhì)上是一個輕量級的黄锤、針對
Libcontainer
進行了包裝的命令行交互工具-
Libcontainer
是Docker公司
開發(fā)用于替代LXC
的工具 -
LXC
提供了對諸如命令空間(Namespace)
和控制組(CGroup)
等基礎(chǔ)工具的操作能力瓤荔,它們是基于Linux內(nèi)核
的容器虛擬化技術(shù) -
LXC
基于Linux
往毡,對跨平臺有阻礙
-
- 作用:創(chuàng)建容器
- 是一個
CLI包裝器
蒂阱,實質(zhì)上就是一個獨立的容器運行時工具 -
runc
所在的層有時也稱為“OCI層
”
- 是一個
-
runc
與操作系統(tǒng)內(nèi)核接口進行通信,基于所有必要的工具(Namespace
庆亡、CGroup
等)來創(chuàng)建容器,容器進程以runc
的子進程啟動捞稿,啟動完畢后又谋,runc
將會退出
-
-
containerd
- 作用:負責(zé)容器的生命周期管理——
start
|stop
|pause
|rm
... - 后來也負責(zé)鏡像管理,額外功能都是模塊化可選的
- 以
daemon
(守護進程)方式運行 - 不負責(zé)創(chuàng)建容器娱局,而是指揮
runc
去做彰亥,containerd
將Docker鏡像
轉(zhuǎn)換成OCI bundle
,并讓runc
基于此創(chuàng)建一個新的容器
- 作用:負責(zé)容器的生命周期管理——
-
daemon
- 提供功能豐富衰齐、基于版本的
REST API
- 使用
CRUD風(fēng)格
的API
任斋,通過gRPC
與containerd
進行通信 - 將所有的用于啟動、管理容器的邏輯和代碼從
daemon
中移除耻涛,意味著容器運行時
與Docker daemon
是解耦的废酷,有時稱為“無守護進程的容器”- 好處:對
Docker daemon
的維護和升級工作不會影響到運行中的容器
- 好處:對
- 將越來越多的功能從
daemon
中拆解出來并模塊化之后,daemon
還剩什么抹缕?- 暫時還包括的主要功能:鏡像管理澈蟆、鏡像構(gòu)建、
REST API
卓研、身份驗證趴俘、安全、核心網(wǎng)絡(luò)以及編排
- 暫時還包括的主要功能:鏡像管理澈蟆、鏡像構(gòu)建、
- 提供功能豐富衰齐、基于版本的
-
shim
- 是實現(xiàn)無
daemon
的容器不可或缺的工具 -
containerd
指揮runc
來創(chuàng)建容器奏赘。實際上寥闪,每次創(chuàng)建容器時,shim
都會fork
一個新的runc
實例磨淌,一旦容器創(chuàng)建完畢疲憋,對應(yīng)的runc
進程就會退出 - 一旦容器進程的父進程
runc
退出,相關(guān)聯(lián)的containerd-shim
進程就會成為容器的父進程伦糯。 - 作為容器的父進程柜某,
shim
的部分職責(zé)如下:- 保持所有的
STD_IN
和STD_OUT
流是開啟狀態(tài)嗽元,從而當(dāng)daemon
重啟的時候,容器不會因為管道(pipe
)的關(guān)閉而終止 - 將容器的退出狀態(tài)反饋給
daemon
- 保持所有的
- 是實現(xiàn)無
Docker鏡像
- 鏡像由多個層組成喂击,每個層疊加后剂癌,從外部看就像一個獨立的對象。
- 鏡像內(nèi)部是一個精簡的操作系統(tǒng)(
OS
)翰绊,同時還包含應(yīng)用運行所必須的文件和依賴包- 通常鏡像中只包含一個
精簡的shell
佩谷,甚至沒有。 - 鏡像中不包含內(nèi)核——容器都是共享所在
Docker主機
的內(nèi)核
- 通常鏡像中只包含一個
- 鏡像可以理解為一種
構(gòu)建時(build-tiem)結(jié)構(gòu)
监嗜,而容器可以理解為一種運行時(run-time)結(jié)構(gòu)
- 一個鏡像可以有多個標(biāo)簽
-
懸虛鏡像
- 沒有標(biāo)簽的鏡像
- 出現(xiàn)原因:構(gòu)建了一個新鏡像谐檀,然后為新鏡像打了一個已經(jīng)存在的標(biāo)簽,接著
Docker
會移除舊鏡像上的標(biāo)簽裁奇,舊鏡像就變成了一個懸虛鏡像
-
Docker
通過存儲引擎(新版本采用快照機制)的方式實現(xiàn)鏡像層堆棧桐猬,并保證多鏡像層對外展示位同一的文件系統(tǒng)。-
Linux
上可用的存儲引擎有AUFS
刽肠、Overlay2
溃肪、Device Mapper
、Btrfs
以及ZFS
-
Windows
上僅支持windowsfilter
-
- 多個鏡像之間可以并且確實會共享鏡像層音五。節(jié)省空間并提升性能
- 鏡像本身就是一個配置對象惫撰,其中包含了鏡像層的列表和一些元數(shù)據(jù)信息
- 鏡像層才是實際數(shù)據(jù)存儲的地方
- 內(nèi)容散列
- 鏡像的唯一標(biāo)識是一個
加密ID
,即配置對象本身的散列值 - 每個鏡像層也由一個
加密ID
區(qū)分躺涝,其值為鏡像層本身內(nèi)容的散列值 - 修改鏡像的內(nèi)容或其中任一的鏡像層厨钻,都會導(dǎo)致散列值的變化。鏡像和鏡像層都是不可變的坚嗜,任何改動都能很輕松地辨別
- 推送和拉取鏡像的時候夯膀,都會對鏡像進行壓縮來節(jié)省網(wǎng)絡(luò)帶寬以及倉庫的二進制存儲空間,但是壓縮會改變鏡像內(nèi)容惶傻,這導(dǎo)致鏡像內(nèi)容的散列值在推送或者拉取之后棍郎,會與鏡像內(nèi)容不相符。為了避免該問題银室,每個鏡像層同時會包含一個分發(fā)散列值涂佃,這是一個壓縮版鏡像的散列值。
- 鏡像的唯一標(biāo)識是一個
- 如果某鏡像中有一個
Bug
蜈敢,拉取下來并修改之后辜荠,重新推送回倉庫。此時使用了問題鏡像相同的標(biāo)簽抓狭,原鏡像被覆蓋伯病,但是生產(chǎn)環(huán)境使用的大量運行中的容器無法區(qū)分正在使用的鏡像版本是修復(fù)前還是修復(fù)之后的-
Docker1.10
中引入了新的內(nèi)容尋址存儲模型。 - 作為模型的一部分茫陆,每一個鏡像現(xiàn)在都有一個基于其內(nèi)容的密碼散列值累驮,鏡像內(nèi)容變更一定會導(dǎo)致散列值變更
-
-
多架構(gòu)鏡像,配置
Menifest列表
- 刪除鏡像時逼泣,必須確保與該鏡像相關(guān)的全部容器停止并被刪除
- 如果鏡像的某個層被多個鏡像共享药磺,那么只有依賴該鏡像層的所有鏡像被刪除后告组,該鏡像層才會刪除
- 常用命令
docker container run
docker service create
-
docker image pull <repository>:<tag>
:拉取鏡像,如果沒有指定tag標(biāo)簽
癌佩,默認latest
木缝;-a
拉取全部鏡像 -
docker image ls
-
--filter dangling=true/false
:僅返回懸虛鏡像(true
) -
--filter before id/name
:返回在id
或者鏡像名之前創(chuàng)建的全部鏡像 -
--filter since id/name
:返回在id
或者鏡像名之后創(chuàng)建的全部鏡像 -
--filter label
::根據(jù)標(biāo)注(label
)的名稱或值,對鏡像進行過濾 -
--format
:通過go模版
對輸出內(nèi)容進行格式化 -
--digests
:查看鏡像摘要(內(nèi)容散列值)
-
-
docker search
-
NAME
:搜索倉庫名為NAME
中包含的所有鏡像 -
label
:返回所有倉庫中包含label
的鏡像 -
--filter is-official=true
:過濾非官方鏡像 -
--filter is-automated=true
:只顯示自動創(chuàng)建的鏡像 -
--limit
:增加返回內(nèi)容的行數(shù)围辙,最大100行我碟,默認25行
-
-
docker image inspect name
:顯示鏡像分層信息 docker image rm id
Docker容器
- 虛擬機與容器的最大區(qū)別:容器更快并且更輕量級——容器會共享其所在主機的操作系統(tǒng)/內(nèi)核
- 容器只有一份
OS
損耗,也只要一份授權(quán)姚建,占用更少的資源矫俺,啟動更快
- 容器只有一份
-
Hypervisor
是硬件虛擬化,容器時操作系統(tǒng)虛擬化 - 常用命令
-
docker container run <image> <app>
:啟動容器-
docker container run -it ubuntu /bin/bash
:-it
參數(shù)表示將當(dāng)前終端(terminal
)以交互方式連接到容器的shell
上桥胞。啟動ubuntu鏡像
的bash程序
-
-d
:后臺模式 -
sleep time
:運行指定time時間
關(guān)閉容器 -
--restart
always
unless-stopped
on-failed
-
-
docker container exec -it id bash
:將終端重新連接到docker docker container stop
docker container start
docker container rm
-
Crtl+PQ
:斷開shell
與容器終端的鏈接恳守,并在退出后保持容器在后臺處于運行(UP
)狀態(tài) -
docker container exec
:允許用戶在運行狀態(tài)的容器中,啟動一個新進程 -
docker container inspect
:顯示容器的配置細節(jié)和運行時信息
-
應(yīng)用的容器化
- 項目源碼
- 編寫
Dockerfile
- 對當(dāng)前應(yīng)用的描述
- 指導(dǎo)
Docker
完成應(yīng)用容器化 -
FROM
:指定基礎(chǔ)鏡像層 -
LABEL
:設(shè)置一個鍵值對 -
RUN
:會在FROM
指定的基礎(chǔ)鏡像層上贩虾,新建一個鏡像層,并執(zhí)行指令沥阱,例如安裝程序 -
COPY
:將應(yīng)用相關(guān)文件從構(gòu)建上下文中復(fù)制到當(dāng)前鏡像中缎罢,并新建一個鏡像層來存儲 -
WORKDIR
:為Dockerfile
中尚未執(zhí)行的指令設(shè)置工作目錄,該目錄與鏡像相關(guān)考杉,并且會作為元數(shù)據(jù)記錄到鏡像的配置中策精,但不會創(chuàng)建新的鏡像層 -
EXPOSE 8080
:暴露指定端口,作為元數(shù)據(jù)保存崇棠,不會產(chǎn)生新的鏡像層 -
ENTERPOINT
:指定鏡像以容器方式啟動后默認運行的程序 -
Docker
指令不區(qū)分大小寫咽袜,通常采取大寫,便于區(qū)分枕稀;部分指令會創(chuàng)建新的鏡像層(通常是添加新的文件或程序)询刹,其他指令只會增加或修改鏡像的元數(shù)據(jù)信息
-
docker image build -t web:latest .
:在當(dāng)前目錄(.
)構(gòu)建一個名為web:latest
的鏡像 - 推送鏡像到倉庫
docker image push
- 先使用
Docker ID
登錄Docker Hub
Docker login
- 推送之前,為鏡像打上標(biāo)簽
-
Registry
(鏡像倉庫服務(wù)萎坷,默認docker.io
) -
Repository
(鏡像倉庫) -
Tag
(鏡像標(biāo)簽凹联,默認latest
) -
docker image tag web:latest you_can_access/web:latest
:為鏡像添加一個額外的標(biāo)簽,并且不需要覆蓋已經(jīng)存在的標(biāo)簽
-
docker image push you_can_access/web:latest
- 先使用
- 運行應(yīng)用程序
docker container run -d --name ...
-
APP
測試 - 查看構(gòu)建歷史:
docker image history web:latest
- 生產(chǎn)環(huán)境的多階段構(gòu)建
- 在一個
Dockerfile
中添加多個FROM
指令哆档,構(gòu)成幾個單獨的構(gòu)建階段(一般前面幾個階段構(gòu)建運行環(huán)境蔽挠,一般鏡像都很大,最后一個階段構(gòu)建應(yīng)用生產(chǎn)環(huán)境瓜浸,用一個比較小的包作為基礎(chǔ)) - 最后一個階段使用
COPY --from
指令從前面幾個階段構(gòu)建的鏡像中僅復(fù)制生產(chǎn)環(huán)境相關(guān)的應(yīng)用代碼澳淑,而不會復(fù)制生產(chǎn)環(huán)境不需要的構(gòu)造 - 完成之后比原,前幾個階段生成的鏡像會變成懸虛鏡像
- 在一個
- 建造者模式構(gòu)建
- 至少需要兩個
Dockerfile
- 一個用于開發(fā)環(huán)境
Dockerfile.dev
,一個用于生產(chǎn)環(huán)境Dockerfile.prod
(基于較小的基礎(chǔ)鏡像開始構(gòu)建) - 生產(chǎn)環(huán)境的
Dockerfile
將開發(fā)環(huán)境中的與應(yīng)用程序相關(guān)的部分復(fù)制過來杠巡,整個過程需要額外的腳本才能串聯(lián)起來
- 至少需要兩個
- 最佳實踐
- 利用構(gòu)建緩存
- 合并鏡像:
docker image build --squash
- 使用
no-install-recommends
:確保Linux
的APT包管理器
僅安裝核心依賴 - 不要使用
MSI包
(Windows
)
使用Docker Compose部署應(yīng)用
- 負責(zé)將多個比較小的服務(wù)互相協(xié)同起來組成一個完整可用的應(yīng)用
- 使用一個聲明式的配置文件描述整個應(yīng)用量窘,從而使用一條命令完成部署,部署成功后忽孽,還可以通過一系列簡單的命令實現(xiàn)對其完整生命周期的管理绑改,甚至,配置文件還可以置于版本控制系統(tǒng)中進行存儲和管理
-
Compose文件
:可以使用JSON
文件兄一,也可以使用JSON
的子集YAML文件
-
version
必須指定厘线,且總是位于文件的第一行。它定義了Compose文件的格式
(主要是API
)的版本出革,version
并非是Docker Compose
的版本號 -
services
用于定義不同的應(yīng)用服務(wù)- 下面的
key
定義服務(wù)名-
build .
:指定Docker
基于當(dāng)前目錄(.
)下的Dockerfile
構(gòu)建鏡像造壮,此鏡像用于啟動該服務(wù)的容器 -
command
:指定Docker
在容器中運行的程序 -
ports
:容器內(nèi)的(-target
)端口映射到主機(published
)的端口 -
networks
:將服務(wù)連接到指定的網(wǎng)絡(luò)上旨枯。這個網(wǎng)絡(luò)應(yīng)該是已經(jīng)存在的,或者在networks
一級key
中定義的網(wǎng)絡(luò) -
volumes
:指定Docker
將source
掛載到target
上劫扒,source
指定的卷應(yīng)該是已存在的,或者在volumes
一級key
中定義
-
- 下面的
-
networks
用于指引Docker
創(chuàng)建新的網(wǎng)絡(luò)假残,默認情況下,會創(chuàng)建bridge
網(wǎng)絡(luò)嗽仪。- 這是一個單主機網(wǎng)絡(luò),只能實現(xiàn)同一主機上容器的連接
- 可以使用
driver
屬性指定不同的網(wǎng)絡(luò)類型
-
-
Docker Compose
部署命令-
docker-compose up
-
&
:將終端窗口返回柒莉,日志輸出到終端 -
-d
:后臺運行 -
docker-compose -f you_configure.yaml up
:指定Compose文件
闻坚,默認使用的是docker-compose.yml
或者docker-compose.yaml
-
Docker Compose
會將項目名稱和Compose文件
中定義的資源名稱連起來,作為新構(gòu)建的鏡像名稱兢孝;每個容器的名稱都以項目名稱(所在目錄名稱)為前綴窿凤,此外,還都以一個數(shù)字為后綴用于標(biāo)識容器的實例序號 - 第一次部署跨蟹,
Docker Compose
會檢查是否有同名的卷存在雳殊,如果不存在,就會創(chuàng)建它 -
Docker主機
對卷中文件的修改窗轩,會立即反應(yīng)到應(yīng)用中
-
-
docker-compose down
:停止和關(guān)閉應(yīng)用夯秃,應(yīng)用被刪除,僅留下鏡像、卷和源碼 -
docker-compose top
:列出各個服務(wù)(容器)內(nèi)運行的進程 -
docker-compose stop
:停止應(yīng)用仓洼,但不會刪除資源 -
docker-compose rm
:對于已停止應(yīng)用介陶,用rm
刪除 -
docker-compose ps
:列出Compose應(yīng)用
中的各個容器 -
docker-compose restart
:重啟已停止的Compose應(yīng)用
-
Docker Swarm
-
Docker Swarm
主要包含兩方面:- 企業(yè)級的
Docker
安全集群 - 微服務(wù)應(yīng)用編排引擎
- 企業(yè)級的
- 集群方面
-
Swarm
將一個或多個Docker
節(jié)點組織起來,可以用集群的方式管理它們 - 默認內(nèi)置有加密的分布式集群存儲色建、加密網(wǎng)絡(luò)哺呜、公用
TLS
、安全集群接入令牌以及一套簡化數(shù)字證書管理的PKI
(public key infrastructure
) - 可以自如地添加刪除節(jié)點
-
- 編排方面
-
Swarm
提供一套豐富的API
使得部署和管理復(fù)雜的微服務(wù)應(yīng)用變得易如反掌 - 通過將應(yīng)用定義在聲明式配置文件中箕戳,就可以使用原生的
Docker命令
完成部署 - 可以執(zhí)行滾動升級某残、回滾以及擴縮容操作
-
-
Swarm
集群- 唯一前提:所有節(jié)點通過可靠的網(wǎng)絡(luò)相連
- 節(jié)點屬性
- 管理節(jié)點(
Manager
) - 工作節(jié)點(
Worker
)
- 管理節(jié)點(
-
Swarm
的配置和狀態(tài)信息- 保存在一套位于所有管理節(jié)點上的分布式
etcd
數(shù)據(jù)庫中 -
Swarm
內(nèi)置etcd
數(shù)據(jù)庫,無需管理 -
etcd
數(shù)據(jù)庫運行于內(nèi)存中陵吸,并保持?jǐn)?shù)據(jù)的最新狀態(tài)
- 保存在一套位于所有管理節(jié)點上的分布式
-
Swarm
安全性-
Swarm
集成TLS
保證集群安全性 - 使用
TLS
進行通信加密玻墅、節(jié)點認證和角色授權(quán) - 自動密鑰輪換(
Automatic Key Rotation
)在后臺默默運行
-
-
Swarm
應(yīng)用編排-
Swarm
最小調(diào)度單元是服務(wù)- 服務(wù)在
API
中是一個新的對象元素,它基于容器封裝了一些高級特性走越,是一個更高層次的概念 - 當(dāng)容器被封裝在一個服務(wù)中時椭豫,我們稱之為一個任務(wù)或一個副本
- 服務(wù)中增加了諸如擴縮容、滾動升級以及簡單回滾等特性
- 服務(wù)在
-
- 搭建安全
Swarm
集群- 要求
- 每個節(jié)點都需要安裝
Docker
旨指,并且能夠與Swarm
的其他節(jié)點通信 - 網(wǎng)絡(luò)方面赏酥,需要在路由器和防火墻中開放如下端口
-
2377/tcp
:用于客戶端與Swarm
進行安全通信(2377端口
可配置,但是這是一個約定成俗的端口配置谆构,最好不要改) -
7946/tcp
與7946/udp
:用于控制gossip分發(fā)
-
4789/udp
:用于基于VXLAN
的覆蓋網(wǎng)絡(luò)
-
- 每個節(jié)點都需要安裝
- 大體流程
- 初始化第一個管理節(jié)點
- 加入額外的管理節(jié)點
- 加入工作節(jié)點
- 完成
- 初始化一個全新的
Swarm
- 不包含在任何
Swarm
中的Docker節(jié)點
裸扶,稱為運行于單引擎(Single-Engine)模式
。- 一旦被加入
Swarm集群
搬素,則切換為Swarm模式
- 單引擎模式下呵晨,運行
docker swarm init
會將其切換到Swarm模式
,并創(chuàng)建一個新的Swarm
熬尺,將自身設(shè)置為Swarm
的第一個管理節(jié)點
- 一旦被加入
-
docker swarm init --advertise-addr 10.0.0.1:2377 --listen-addr 10.0.0.1:2377
-
docker swarm init
:通知Docker
來初始化一個新的Swarm
摸屠,并將自身設(shè)置為第一個管理節(jié)點,開啟Swarm模式
-
--advertise-addr
:指定其他節(jié)點用來連接到當(dāng)前管理節(jié)點的IP
和端口 -
--listen-addr
:指定用于承載Swarm流量
的IP
和端口粱哼。建議總是和--advertise-addr
一起使用
-
-
docker node ls
:列出Swarm
中的所有節(jié)點 - 添加工作節(jié)點與管理節(jié)點
- 在第一個管理節(jié)點上執(zhí)行
-
docker swarm join-token worker
:獲取工作節(jié)點接入命令中的Token
-
docker swarm join-token manager
:獲取管理節(jié)點接入命令中的Token
- 一個節(jié)點是作為工作節(jié)點加入還是管理節(jié)點加入完全依賴于使用的
Token
-
- 登錄到要加入的節(jié)點
docker swarm join --token 工作節(jié)點/管理節(jié)點Token 10.0.0.1:2377 --advertise-addr 10.0.0.4:2377 --listen-addr 10.0.0.4:2377
- 在第一個管理節(jié)點上執(zhí)行
-
docker node ls
:在管理節(jié)點上執(zhí)行季二,列出Swarm節(jié)點
-
MANAGER STATUS
無任何顯示的是工作節(jié)點,顯示Leader
的是主節(jié)點
-
- 不包含在任何
-
Swarm
管理器高可用性(HA
)-
HA支持
:一個或多個節(jié)點發(fā)生故障揭措,剩余管理節(jié)點也會繼續(xù)保證Swarm
的運轉(zhuǎn) -
Swarm
實現(xiàn)了一種主從方式的多管理節(jié)點HA
(有多個管理節(jié)點胯舷,但也總是僅有一個節(jié)點處于活動狀態(tài),通常處于活動狀態(tài)的管理節(jié)點被稱為“主節(jié)點”) - 主節(jié)點是唯一一個會對
Swarm
發(fā)送控制命令的節(jié)點绊含,只有主節(jié)點才會變更配置桑嘶,或發(fā)送任務(wù)到工作節(jié)點- 命令從一個遠程
Docker
客戶端發(fā)送給一個管理節(jié)點 - 如果接收到命令的管理節(jié)點非節(jié)點,則將命令轉(zhuǎn)發(fā)給主節(jié)點
- 主節(jié)點對
Swarm
執(zhí)行命令
- 命令從一個遠程
- 管理節(jié)點或是
Leader
或是Follower
Raft術(shù)語
-
Swarm
使用了Raft共識算法
- 最佳實踐原則
- 部署奇數(shù)個管理節(jié)點
- 有利于減少腦裂(這里解釋有點奇怪)
- 不要部署太多的管理節(jié)點
-
對于共識算法來說躬充,更多的參與節(jié)點就意味著需要花費更多的時間來達成共識逃顶。也就是我要在更多個管理節(jié)點上同步狀態(tài)信息讨便,保證主節(jié)點宕機后,
Follower
能夠接替主節(jié)點的工作 - 管理節(jié)點之間一定要確保高速可靠的網(wǎng)絡(luò)連接
-
對于共識算法來說躬充,更多的參與節(jié)點就意味著需要花費更多的時間來達成共識逃顶。也就是我要在更多個管理節(jié)點上同步狀態(tài)信息讨便,保證主節(jié)點宕機后,
- 部署奇數(shù)個管理節(jié)點
- 內(nèi)置的
Swarm
安全機制- 提供了開箱即用的合理的默認配置
-
CA
設(shè)置口蝠、接入Token
器钟、公用TLS
、加密集群存儲妙蔗、加密網(wǎng)絡(luò)傲霸、加密節(jié)點ID
- 鎖定
Swarm
- 重啟一個舊的管理節(jié)點或進行備份恢復(fù)仍有可能對集群造成影響
- 一個舊的管理節(jié)點重新接入
Swarm
會自動解密Raft數(shù)據(jù)庫中長時間序列的訪問權(quán),這會帶來安全隱患 - 進行備份恢復(fù)可能會抹掉最新的
Swarm
配置 -
Swarm
提供了自動鎖機制來鎖定Swarm
眉反,這會強制要求重啟的管理節(jié)點在提供一個集群解鎖碼之后才有權(quán)重新接入集群 docker swarm init --autolock=true
docker swarm update --autolock=true
- 上面兩條命令可以開啟自動鎖昙啄,并得到解鎖鑰匙,解鎖鑰匙必須妥善保存在安全的地方
-
service docker restart
:重啟一個管理節(jié)點 -
docker swarm unlock
:為重啟的管理節(jié)點解鎖Swarm
寸五,提供解鎖碼
-
-
Swarm
服務(wù)docker service create --name web-fe -p 8080:8080 --replicas 5 yuq/docker-ci
-
docker service create
:聲明一個新服務(wù) -
--name web-fe
:命名為web-fe
-
-p 8080:8080
:將每個節(jié)點的8080端口
映射到服務(wù)副本內(nèi)部的8080端口
-
--replicas 5
:告知Docker
應(yīng)該總是有5個此服務(wù)的副本(容器) -
yuq/docker-ci
:告知Docker
鏡像yuq/docker-ci
用于副本 - 所有的服務(wù)都會被
Swarm
持續(xù)監(jiān)控——Swarm
在后臺進行輪詢檢查- 如果某個副本宕機了梳凛,
Docker
會啟動一個新的副本來是實際狀態(tài)能夠滿足期望
- 如果某個副本宕機了梳凛,
-
docker service ps web-fe
:產(chǎn)看web-fe
服務(wù)副本列表及狀態(tài) -
docker service inspect --pretty web-fe
:查看更詳細的信息,--pretty
限制輸出僅包含最感興趣的內(nèi)容 - 副本服務(wù)vs全局服務(wù)
- 服務(wù)的默認復(fù)制模式是副本模式
- 部署期望數(shù)量的服務(wù)副本梳杏,并盡可能均勻地將各個副本分布在整個集群中
- 全局模式
docker service create --mode global
- 每個節(jié)點上僅運行一個副本
- 服務(wù)的默認復(fù)制模式是副本模式
- 服務(wù)的擴縮容
-
docker service scale web-fe=10
:服務(wù)器副本數(shù)量從5個加到10個 -
Swarm
實現(xiàn)一個調(diào)度算法韧拒,默認將副本盡可能均衡分配給Swarm
中的所有節(jié)點
-
- 刪除服務(wù)
docker service rm web-fe
- 謹(jǐn)慎使用刪除,刪除所有副本時并不會進行確認
docker service ls
- 滾動升級
- 先創(chuàng)建一個覆蓋網(wǎng)絡(luò)給服務(wù)使用:
docker network create -d overlay uber-net
- 覆蓋網(wǎng)絡(luò)是一個二層網(wǎng)絡(luò)十性,容器可以接入該網(wǎng)絡(luò)叛溢,并且所有接入的容器均可互相通信
- 覆蓋網(wǎng)絡(luò)是創(chuàng)建于底層異構(gòu)網(wǎng)絡(luò)之上的一個新的二層容器網(wǎng)絡(luò)
- 創(chuàng)建一個新的服務(wù)接入
uber-net
網(wǎng)絡(luò)docker service create --name uber-svc --network uber-net -p 80:80 --replicas 12 yuq/tu-demo:v1
-
-p 80:80
:會建立Swarm集群范圍的網(wǎng)絡(luò)流量映射,到達Swarm任何節(jié)點80端口的流量劲适,都會映射到任何服務(wù)副本的內(nèi)部80端口 - 默認的模式是在
Swarm
中的所有節(jié)點開放端口——即使節(jié)點上沒有服務(wù)的副本——稱為入站模式 - 主機模式:僅在運行有容器副本的節(jié)點上開放端口
- 打開主機模式:
docker service create --name uber-svc --network uber-net --publish published=80,target=80,mode=host --replicas 12 yuq/tu-demo:v1
- 升級服務(wù)
-
docker service update --image yuq/tu-demo:v2 --update-parallelism 2 --update-delay 20s uber-svc
-
--update-parallelism
:每次使用新鏡像更新幾個副本 -
--update-delay
:每次更新與上一次之間的延遲時間
-
-
- 先創(chuàng)建一個覆蓋網(wǎng)絡(luò)給服務(wù)使用:
- 故障排除
-
docker service logs
:查看log
- 默認使用
json-file
日志驅(qū)動 - 其他還有
journald
楷掉、syslog
、splunk
霞势、gelf
- 默認使用
- 可在
daemon.json
中配置日志驅(qū)動"log-driver":"syslog"
-
docker service create
命令時傳入--logdriver
和--log-opts
參數(shù)可以強制某服務(wù)使用一個不同的日志驅(qū)動烹植,這會覆蓋daemon.json
中的配置
-
- 要求
Docker網(wǎng)絡(luò)
-
CNM
- 容器網(wǎng)絡(luò)模型(Container Network Model)(設(shè)計標(biāo)準(zhǔn),規(guī)定
Docker
網(wǎng)絡(luò)架構(gòu)的基礎(chǔ)組成要素) - 定義3個基本要素:沙盒(
Sandbox
)愕贡、終端(Endpoint
)草雕、網(wǎng)絡(luò)(Network
) - 沙盒(獨立的網(wǎng)絡(luò)棧)被放置在容器內(nèi)部,容器中的接口(終端固以,虛擬網(wǎng)絡(luò)接口)連接到網(wǎng)絡(luò)(
802.1d網(wǎng)橋
)上促绵,同一網(wǎng)絡(luò)上的容器相互之間可以通信 - 同一份容器可以有多個終端,分別可以連接到不同的網(wǎng)絡(luò)(一個終端只能接入某一個網(wǎng)絡(luò))嘴纺,同一個容器中的多個終端需要三層路由器的支持才能通信
- 如果容器需要接入到多個網(wǎng)絡(luò),就需要多個終端
- 容器網(wǎng)絡(luò)模型(Container Network Model)(設(shè)計標(biāo)準(zhǔn),規(guī)定
-
Libnetwork
-
CNM
的具體實現(xiàn)(Go語言
編寫) - 實現(xiàn)了
CNM
定義的三個基本組件浓冒,還實現(xiàn)了本地服務(wù)發(fā)現(xiàn)栽渴、基于Ingress
的容器負載均衡,以及網(wǎng)絡(luò)控制層和管理層功能
-
- 驅(qū)動
- 通過實現(xiàn)特定網(wǎng)絡(luò)拓撲的方式來拓展該模型的能力
- 如果說
Libnetwork
實現(xiàn)了控制層和管理層的功能稳懒,那么驅(qū)動就負責(zé)實現(xiàn)數(shù)據(jù)層 - 網(wǎng)絡(luò)的連通性和隔離性是由驅(qū)動來處理的
-
Docker
封裝的內(nèi)置驅(qū)動(原生驅(qū)動或者本地驅(qū)動)-
Linux
:Bridge
闲擦、Overlay
慢味、Macvlan
-
Windows
:NAT
、Overlay
墅冷、Transport
纯路、L2Bridge
-
-
Docker
也可以使用第三方網(wǎng)絡(luò)驅(qū)動(遠程驅(qū)動) -
Libnetwork
支持同時激活多個網(wǎng)絡(luò)驅(qū)動。Docker
環(huán)境支持一個龐大的異構(gòu)網(wǎng)絡(luò)
- 單機橋接網(wǎng)絡(luò)
- 單機:只能在單個
Docker主機
上運行寞忿,并只能與所在的Docker主機
上的容器進行連接 - 橋接:
802.1d
橋接的一種實現(xiàn)(二層交換機) - 每一個
Docker主機
都有一個默認的單機橋接網(wǎng)絡(luò)驰唬,Linux
上網(wǎng)絡(luò)名稱為bridge
,windows
上為nat
- 可以使用標(biāo)準(zhǔn)
Linux
工具來查看bridge
網(wǎng)絡(luò)ip link show docker0
- 接在相同網(wǎng)絡(luò)中的容器之間可以通過容器名(新容器都注冊了指定的
Docker DNS服務(wù)
)ping
通(默認的Bridge
網(wǎng)絡(luò)不支持腔彰,自定義橋接網(wǎng)絡(luò)可以) - 可以使用端口映射來繞開“橋接網(wǎng)絡(luò)中的容器只能與位于相同網(wǎng)絡(luò)中的容器進行通信”的限制
- 端口數(shù)有限制叫编,所以單機橋接網(wǎng)絡(luò)只適合本地開發(fā)環(huán)境以及非常小的應(yīng)用
- 單機:只能在單個
- 多機覆蓋網(wǎng)絡(luò)
- 允許單個網(wǎng)絡(luò)包含多個主機,不同主機上的容器間就可以在鏈路層實現(xiàn)通信
- 只要在
docker network create
命令中加入-d overlay
參數(shù)
- 接入現(xiàn)有網(wǎng)絡(luò)
- 例如應(yīng)用中已經(jīng)容器化的部分需要與那些運行在物理網(wǎng)絡(luò)和
VLAN
上未容器化部分進行通信 -
Docker
內(nèi)置的Macvlan
驅(qū)動(windows
中為Transparent
) - 通過為容器提供
MAC和IP地址
- 優(yōu)點:
Macvlan
性能優(yōu)異霹抛,因為無需端口映射或者額外橋接搓逾,可以直接通過主機接口(或者子接口)訪問容器接口 - 缺點:需要將主機網(wǎng)卡(
NIC
)設(shè)置為混雜模式,這在大部分公有云平臺上是不允許的
- 例如應(yīng)用中已經(jīng)容器化的部分需要與那些運行在物理網(wǎng)絡(luò)和
- 服務(wù)發(fā)現(xiàn)
- 允許容器和
Swarm服務(wù)
通過名稱相互定位杯拐,唯一的要求是需要位于同一個網(wǎng)絡(luò)中 - 底層實現(xiàn)利用
Docker
內(nèi)置的DNS服務(wù)器
霞篡,為每個容器提供DNS解析
功能 - 可以自定義
DNS配置
(Linux
上,自定義操作會在容器內(nèi)部的/etc/resolve.conf
中增加條目)-
--dns
:指定自定義的DNS列表
-
--dns-search
:指定自定義查詢時所使用的域名
-
- 允許容器和
-
Ingress
網(wǎng)絡(luò)-
Swarm
支持兩種服務(wù)發(fā)布模式端逼,均保證服務(wù)從集群外可以訪問-
Ingress
模式(默認)- 保證集群內(nèi)的任一節(jié)點都能訪問該服務(wù)
- 采用
Service Mesh
或者Swarm Mode Service Mesh
的四層路由網(wǎng)絡(luò)來實現(xiàn)
-
Host
模式- 只能通過運行服務(wù)副本的節(jié)點來訪問
--publish published=5000,target=80,mode=host
-
-
- 基本命令
docker network ls
-
docker network inspect bridge
:查看bridge網(wǎng)絡(luò)
的詳細信息 -
docker port name
:查看端口映射 -
docker network prune
:刪除Docker
主機上全部未使用的網(wǎng)絡(luò) -
docker network rm
:刪除Docker
主機上指定網(wǎng)絡(luò) docker network create
Docker覆蓋網(wǎng)絡(luò)
-
Swarm模式
下構(gòu)建及測試Docker
覆蓋網(wǎng)絡(luò)- 構(gòu)建
Swarm
朗兵,初始化管理節(jié)點,以及加入工作節(jié)點 - 創(chuàng)建一個新的覆蓋網(wǎng)絡(luò)
uber-net
:docker network create -d overlay uber-net
- 能連接
Swarm
所有主機 - 包括了一個
TLS
加密控制層 - 如果相對數(shù)據(jù)層加密裳食,添加
-o encrypted
- 只有當(dāng)運行中的容器連接到覆蓋網(wǎng)絡(luò)的時候矛市,該網(wǎng)絡(luò)才變?yōu)榭捎脿顟B(tài)。這種延遲生效策略通過減少網(wǎng)絡(luò)梳理诲祸,提升了網(wǎng)絡(luò)的擴展性(這句看不太明白~)
- 能連接
- 將服務(wù)連接到覆蓋網(wǎng)絡(luò)
docker service create --name test --network uber-net --replicas 2 ubuntu sleep infinity
- 創(chuàng)建一個名為
test
的服務(wù)浊吏,連接到了uber-net
這個覆蓋網(wǎng)絡(luò),并且指定ubuntu鏡像
創(chuàng)建兩個副本(容器)救氯,采用sleep命令
保持容器運行
- 測試覆蓋網(wǎng)絡(luò)
docker network inspect uber-net
docker container inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' your_container_id
- 查看被分配給覆蓋網(wǎng)絡(luò)的
Subnet
(兩個需要ping
的容器上分別運行找田,得到容器ID
和IP地址
) - 安裝
ubuntu
上的ping
工具包:iputils-ping
- 跟蹤路由:
traceroute
- 構(gòu)建
- 工作原理
-
VXLAN
入門-
VXLAN隧道技術(shù)
:創(chuàng)建虛擬二層覆蓋網(wǎng)絡(luò) - 優(yōu)點:是一種封裝技術(shù),能使現(xiàn)存的路由器和網(wǎng)絡(luò)架構(gòu)看起來就像普通的
IP/UDP
包一樣 - 為了創(chuàng)建二層網(wǎng)絡(luò)着憨,
VXLAN
基于現(xiàn)有的三層IP
網(wǎng)絡(luò)創(chuàng)建了隧道墩衙。基礎(chǔ)網(wǎng)絡(luò):三層之下的基礎(chǔ)部分 -
VXLAN隧道
兩端都是VXLAN
隧道終端(VXLAN Tunnel Endpoint
甲抖,VTEP
)漆改。VTEP
完成了封裝和解壓的步驟
-
- 兩個容器示例
- 每臺主機上都有一個
Sandbox
(網(wǎng)絡(luò)命名空間):當(dāng)前主機上獨立的網(wǎng)絡(luò)棧-
Sandbox
內(nèi)部創(chuàng)建了一個名為Br0
的虛擬交換機(虛擬網(wǎng)橋),同時還創(chuàng)建了一個VTEP
准谚,VTEP
的一端接入到Br0
挫剑,另一端接入主機網(wǎng)絡(luò)棧
-
- 在主機網(wǎng)絡(luò)棧中的
VTEP
(終端)從主機所連的基礎(chǔ)網(wǎng)絡(luò)中獲取到IP地址,并以UDP Socket的方式綁定到4789端口 - 不同主機上的兩個
VTEP
通過VXLAN隧道
創(chuàng)建了一個覆蓋網(wǎng)絡(luò) - 每個容器都有自己的虛擬以太網(wǎng)(
veth
)適配器柱衔,并接入本地Br0
虛擬交換機
- 每臺主機上都有一個
- 通信示例——
node1
上的C1
到連接node2
上的C2
-
C1
發(fā)起ping請求
樊破,目標(biāo)IP
為C2
的地址10.0.0.4
(非實際網(wǎng)絡(luò)ip
)愉棱。 - 請求的流量通過連接到
Br0虛擬交換機
的veth接口
發(fā)出- 虛擬交換機并不知道要將包發(fā)送到哪里,所以
Br0
將包發(fā)送到其上的全部端口 - 連接到
Br0
的VETP接口
知道如何轉(zhuǎn)發(fā)這個數(shù)據(jù)幀哲戚,所以將自己的MAC地址
返回(代理ARP響應(yīng)
) -
Br0
更新自己的ARP映射表
奔滑,將10.0.0.4
映射到本地VTEP
的MAC地址
上
- 虛擬交換機并不知道要將包發(fā)送到哪里,所以
-
Br0
將目標(biāo)為C2
的流量轉(zhuǎn)發(fā)到VTEP接口
-
VTEP
知道C2
,因為所有新啟動的容器都會將自己的網(wǎng)絡(luò)詳情采用網(wǎng)絡(luò)內(nèi)置的Gossip協(xié)議
發(fā)送給相同Swarm集群
內(nèi)的其他節(jié)點
-
-
VTEP
完成數(shù)據(jù)幀的封裝顺少,也就是把VXLAN Header
信息添加到以太網(wǎng)幀當(dāng)中-
VXLAN Header
信息包含VXLAN
網(wǎng)絡(luò)ID
(VNID
)朋其,其作用是記錄VLAN
(這個VLAN
具體是啥?)到VXLAN
的映射關(guān)系 - 將數(shù)據(jù)幀放到
UDP包
中祈纯,并設(shè)置UDP
的目的IP字段
為node2
節(jié)點的VTE
P的IP地址
令宿,同時設(shè)置UDP Socket
端口為4789
-
- 當(dāng)包到達
node2
,內(nèi)核將包發(fā)給合適的VTEP
腕窥,有VTEP
讀取VNID
粒没,解壓包信息 - 根據(jù)
VNID
將包發(fā)送到本地名為Br0
并且連接到VLAN
的交換機 - 在交換機上,包被發(fā)送給
C2
-
-
Docker
支持使用同樣的覆蓋網(wǎng)絡(luò)實現(xiàn)三層路由- 可以創(chuàng)建包含兩個子網(wǎng)的覆蓋網(wǎng)絡(luò)簇爆,
Docker
會負責(zé)子網(wǎng)間的路由 docker network create --subnet=10.1.1.0/24 --subnet=11.1.1.0/24 -d overlay prod-net
- 該命令會在
sandbox
中創(chuàng)建兩個虛擬交換機癞松,默認支持路由
- 可以創(chuàng)建包含兩個子網(wǎng)的覆蓋網(wǎng)絡(luò)簇爆,
-
卷與持久化數(shù)據(jù)
- 非持久化數(shù)據(jù)
- 自動創(chuàng)建,從屬于容器入蛆,生命周期與容器相同响蓉。——容器擅長無狀態(tài)和非持久化事務(wù)
- 刪除容器也會刪除全部非持久化數(shù)據(jù)
- 持久化數(shù)據(jù)
- 將數(shù)據(jù)存儲在卷上哨毁,刪除一個關(guān)聯(lián)卷的容器枫甲,卷并不會刪除
- 卷與容器是解耦的,從而可以獨立的創(chuàng)建和管理卷扼褪,并且卷并未與任意容器生命周期綁定
- 容器與持久化數(shù)據(jù)
- 用戶創(chuàng)建卷想幻,然后創(chuàng)建容器,接著將卷掛載到容器上话浇。卷會掛載載容器的某個目錄之下脏毯,任何寫到該目錄下的內(nèi)容都會寫到卷中。即使容器被刪除幔崖,卷與其上面的數(shù)據(jù)仍然存在
-
docker volumn create myvol
:創(chuàng)建名為myvol
的卷- 默認情況下食店,新卷采用內(nèi)置的
local驅(qū)動
,本地卷只能被所在節(jié)點的容器使用 - 第三方驅(qū)動可以通過插件的方式赏寇,為
Docker
集成外部存儲系統(tǒng)- 塊存儲:相對性能更高吉嫩,適用于對小塊數(shù)據(jù)的隨機訪問負載
- 文件存儲:包括NFS和SMB協(xié)議的系統(tǒng),在高性能場景下表現(xiàn)優(yōu)異
- 對象存儲:適用于較大且長期存儲的嗅定、很少變更的二進制數(shù)據(jù)存儲率挣。通常對象存儲是根據(jù)內(nèi)容尋址,并且性能較低
- 也可以使用
Dockfile
部署卷露戒,VOLUMN
- 默認情況下食店,新卷采用內(nèi)置的
-
docker container run -dit --name voltainer --mount source=bizvol,target=/vol alpine
- 掛載了一個名為
bizvol
的卷椒功,如果系統(tǒng)中沒有這個卷,則Docker
會自動創(chuàng)建一個卷 docker service create --name hellcat --mount source=bizvol,target=/vol alpine sleep 1d
- 掛載了一個名為
- 在集群節(jié)點間共享存儲
-
Docker
能夠集成外部存儲系統(tǒng)智什,使得集群間節(jié)點共享外部存儲數(shù)據(jù)變得簡單 - 獨立存儲
LUN
或者NFS
共享可以應(yīng)用到多個Docker
主機动漾,無論容器或者服務(wù)副本運行在那個節(jié)點上,都可以共享該存儲 - 共享存儲需要注意數(shù)據(jù)損壞(Data Corruption)
- 也就是多個容器同時寫入荠锭,或者某個容器寫入到緩存中旱眯,還沒更新到共享存儲,另一個容器在這期間更新的文件证九,那么當(dāng)將緩存中的內(nèi)容更新到文件中時删豺,另一個容器對此一無所知
-
- 常用命令
docker volumn ls
docker volumn inspect myvol(卷名)
-
docker volumn prune
:會刪除未裝入到某個容器或者服務(wù)的所有卷 -
docker volumn rm
:刪除指定卷(不能刪除正在被容器或服務(wù)使用的卷)
使用Docker Stack部署應(yīng)用
-
Stack
能夠在單個聲明文件中定義復(fù)雜的多服務(wù)應(yīng)用 - 提供簡單的方式來部署應(yīng)用并管理其完整的生命周期
- 初始化部署、健康檢查愧怜、擴容呀页、更新、回滾
- 在
Compose文件
中定義應(yīng)用拥坛,然后通過docker stack deploy
命令完成部署和管理 -
Stack
基于Docker Swarm
之上來完成應(yīng)用的部署 -
Docker
適用于開發(fā)和測試蓬蝶,Docker Stack
適用于大規(guī)模場景和生產(chǎn) -
Stack
部署文件(例如docker-stack.yml
)-
version
:Compose
文件格式的版本號,Stack
需要3.0或者更高版本
-
services
:定義組成當(dāng)前應(yīng)用的服務(wù)-
image
:指定用于構(gòu)建服務(wù)的鏡像猜惋,與Docker Compose
的一個區(qū)別是丸氛,Stack不支持構(gòu)建,在部署之前著摔,所有鏡像必須提前構(gòu)建完成 -
ports
:定義端口映射- 默認采用
Ingress
模式缓窜,Swarm集群
中的每個節(jié)點對應(yīng)的端口都會映射并且是可訪問的 - 也可以手動設(shè)置為
Host模式
- 默認采用
-
secret
:定義服務(wù)需要用到的密鑰,密鑰必須被頂級關(guān)鍵字secrets
定義谍咆,并且必須在系統(tǒng)上已經(jīng)存在- 密鑰以普通文件的形式掛載到服務(wù)副本中
-
networks
:確保服務(wù)所有副本連接到指定網(wǎng)絡(luò)上(如果網(wǎng)絡(luò)不存在禾锤,自動創(chuàng)建) -
environment
:允許在服務(wù)副本中注入環(huán)境變量 -
deploy
:部署-
placemnet:contraints
: 約束- 節(jié)點
ID
,如node.id==o2p4kw2uuw2a(id)
- 節(jié)點名稱卧波,如
node.hostname==wrk-12
- 節(jié)點角色时肿,如
node.role!=manager
- 節(jié)點引擎標(biāo)簽,如
engine.labels.operatingsystem==ubuntu16.04
- 節(jié)點自定義標(biāo)簽港粱,如
node.labels.zone==prod1
- 節(jié)點
- 副本數(shù)量:
replicas=2
-
update_config
:定義Docker
滾動升級的時候具體如何操作-
parallelisem:2
:每次更新兩個副本
-
-
failure_action
:升級失敗后的策略-
pause
:(默認)阻止其他副本升級 -
continue
:繼續(xù) -
rollback
:自動回滾
-
-
restart-policy
:定義Swarm
針對容器異常退出的重啟策略-
condition:onfailure
:某副本以非零返回值退出螃成,立即重啟該副本 -
max_attempts
:最多重試次數(shù) -
window
:每次檢測是否啟動成功最長等待時間 -
delay
:每次重啟間隔時間
-
-
-
stop_grace_period
:設(shè)置優(yōu)雅停止(發(fā)送停止信號后,有一段時間處理后事)時間 -
volumns
:掛在提前創(chuàng)建的卷或者主機目錄到某個服務(wù)副本當(dāng)中-
/var/run/docker.sock
是Docker
提供的IPC套接字
查坪,Docker daemon
通過該套接字對其他進程暴露其API
終端寸宏,可以通過該文件管理Docker daemon
-
-
-
networks
:列出必須的網(wǎng)絡(luò)- 部署時前痘,首先檢查并創(chuàng)建networks:關(guān)鍵字對應(yīng)的網(wǎng)絡(luò)
- 默認網(wǎng)絡(luò)采用
overlay驅(qū)動
奕坟,控制層加密 - 如果需要加密數(shù)字層(需要額外的開銷)
-
docker network create
命令中指定-o encrypted
參數(shù) - 在
Stack
文件中的driver_opts
之下指定encrypted:'yes'
-
-
secrets
:定義用到的密鑰- 如果密鑰被定義為
external
悯恍,則在Stack
部署之前有咨,這些密鑰必須存在
- 如果密鑰被定義為
- 所有變更都應(yīng)該通過Stack文件進行聲明锨天,然后通過
docker stack deploy
進行部署 - 常用命令
docker stack deploy
docker stack ls
docker stack ps
docker stack rm
-
Docker安全
-
Linux
安全技術(shù)-
Namespace
- 該技術(shù)將操作系統(tǒng)進行拆分,是一個操作系統(tǒng)看起來像多個互相獨立的操作系統(tǒng)一樣
- 用于隔離不同容器
-
Docker
容器是由各種命名空間組成的杜耙,Docker容器本質(zhì)就是命名空間的有組織集合- 進程
ID
(PID
):為每個容器提供互相獨立的容器進程樹 - 網(wǎng)絡(luò)(
NET
):提供互相隔離的網(wǎng)絡(luò)棧 - 文件系統(tǒng)/掛載(
MNT
):每個容器都有互相隔離的根目錄/
- 進程內(nèi)通信(
IPC
):在容器內(nèi)提供共享內(nèi)存序臂,共享內(nèi)存載不同容器間也是互相獨立的 - 用戶(
USER
):將容器內(nèi)用戶映射到Linux
主機的不同用戶上(Docker
新生事物,非必選項) -
UTS
:為每個容器提供自己的主機名稱
- 進程
-
Control Group
- 控制組用于限額
-
CGroup
允許用戶設(shè)置限制稿壁,防止單個容器占用全部主機資源
-
Capability
- 選擇容器運行所需的
root用戶
權(quán)限(只取容器需要的權(quán)限幽钢,限制不需要的權(quán)限) -
Linux root
用戶常見能力-
CAP_CHOWN
:允許用戶修改文件所有權(quán) -
CAP_NET_BIND_SERVICE
:允許用戶將socket
綁定到系統(tǒng)的端口號 -
CAP_SETUID
:允許用戶提升進程優(yōu)先級 -
CAP_SYS_BOOT
:允許用戶重啟系統(tǒng)
-
-
capability
機制用來實現(xiàn)用戶以root身份
運行容器的同時,還能移除非必須的root
能力
- 選擇容器運行所需的
- 強制訪問控制(
MAC
) - 安全計算(
Seccomp
)- 使用過濾模式下的
Secomp
來限制容器對宿主機內(nèi)核發(fā)起的系統(tǒng)調(diào)用
- 使用過濾模式下的
-
-
Docker
平臺安全技術(shù)-
Swarm模式
- 加密
節(jié)點ID
- 基于
TLS
的認證機制- 每個加入
Swarm
的節(jié)點都需要發(fā)布自己的客戶端證書傅是,證書用于雙向認證 - 證書定義節(jié)點相關(guān)信息匪燕,包括從屬的
Swarm集群
以及該節(jié)點載集群中的身份、證書更新周期 - 內(nèi)容保存在
docker
內(nèi)部的swarm-node.crt
文件中 - 使用
docker system info
查看信息
- 每個加入
- 安全準(zhǔn)入令牌:向
Swarm
中加入管理者和工作者所需的唯一憑證(join-token
)- 管理者所需準(zhǔn)入令牌
- 工作者所需準(zhǔn)入令牌
- 令牌格式:
PREFIX - VERSION - SWARM ID - TOKEN
-
PREFIX
永遠是“SWMTKN”
喧笔,所以允許通過正則表達式匹配該令牌 -
VERSION
展示了Swarm
的版本信息 -
SWARM ID
是Swarm
認證信息的一個哈希值 -
TOKEN
內(nèi)容決定該令牌是管理者還是工作者的準(zhǔn)入令牌
-
- 重設(shè)準(zhǔn)入令牌:
docker swarm join-token --rotate manager
- 支持周期性證書自動更新的
CA配置
- 被配置為
Swarm集群
的第一個管理節(jié)點帽驯,也是根CA節(jié)點
-
docker swarm update --cert-expiry 720h
:更改證書更新周期 -
docker swarm ca
:可以用于管理CA配置
,--help
查看幫助
- 被配置為
- 加密集群存儲(配置
DB
)-
Swarm
大腦书闸,保存了集群配置和狀態(tài)數(shù)據(jù)尼变,默認加密 - 目前基于
etcd
的某種實現(xiàn),并且會在Swarm
內(nèi)所有管理者之間自動復(fù)制
-
- 加密網(wǎng)絡(luò)
- 加密
-
Docker
安全掃描-
Docker
安全掃描對Docker鏡像
進行二進制代碼級別的掃描梗劫,對其中的軟件根據(jù)已知缺陷數(shù)據(jù)庫(CVE數(shù)據(jù)庫
)進行檢查
-
-
Docker
內(nèi)容信任機制-
Docker Content Trust
享甸,DCT
允許開發(fā)者對發(fā)布到Docker Hub
或者Docker可信服務(wù)
的鏡像進行簽名 - 當(dāng)鏡像被拉取時,會自動確認簽名狀態(tài)
-
DCT
一旦開啟梳侨,將無法獲取并使用未經(jīng)簽名的鏡像
-
-
Docker
密鑰-
docker secret
命令管理密鑰 - 密鑰使用總體流程
- 創(chuàng)建密鑰蛉威,并發(fā)送到
Swarm
- 將密鑰存放在集群存儲當(dāng)中,并且加密(管理節(jié)點可以訪問集群存儲)
-
B服務(wù)
創(chuàng)建走哺,并且使用該密鑰 - 密鑰加密傳輸?shù)紹服務(wù)任務(wù)節(jié)點(容器)
-
B服務(wù)
的容器將密鑰解密并掛在到路徑/run/secrets
下蚯嫌,這是一個臨時內(nèi)存文件系統(tǒng) - 一旦容器(服務(wù)任務(wù))完成,內(nèi)存文件系統(tǒng)關(guān)閉丙躏,密鑰也隨之刪除
-
A服務(wù)
中的容器不能訪問該密鑰
- 創(chuàng)建密鑰蛉威,并發(fā)送到
-
-
企業(yè)版工具及特性
-
Docker EE
企業(yè)版能夠?qū)崿F(xiàn)私有化部署 -
Docker EE
引擎 -
Docker
通用控制平面(UCP
)- 基于角色的權(quán)限控制(
RBAC
):UCP
通過一中稱為授權(quán)(Grant
)的東西實現(xiàn)- 主體(
Subject
):一個或多個用戶择示,或一個團隊 - 角色(
Role
):一系列權(quán)限的組合 - 集合(
Collection
):權(quán)限作用的資源 - 授權(quán):配置誰,對那些資源晒旅,擁有什么樣的權(quán)限
- 主體(
- 集成活動目錄
-
UCP
能夠與活動目錄及其他LDAP
目錄服務(wù)進行集成栅盲,從而利用組織中現(xiàn)有的單點登錄系統(tǒng)中的用戶和組
-
- 基于角色的權(quán)限控制(
-
Docker
可信鏡像倉庫服務(wù)(DTR
)- 可配置為使用自簽名證書或來自可信第三方
CA證書
- 可設(shè)置
DTR
來執(zhí)行二進制級別的鏡像掃描,檢查鏡像中的缺陷 - 基于構(gòu)建流水線來配置自動化的鏡像提升策略
- 可配置為使用自簽名證書或來自可信第三方
-
HTTP路由網(wǎng)格
(HRM
)
Docker面試題
- 什么是虛擬化废恋?
- 虛擬化允許您在相同的硬件上運行兩個完全不同的操作系統(tǒng)谈秫。每個客戶操作系統(tǒng)都經(jīng)歷了引導(dǎo),加載內(nèi)核等所有過程鱼鼓。
- 可以基于虛擬化方法如何模仿客戶操作系統(tǒng)的硬件并模擬客戶操作環(huán)境來對虛擬化方法進行分類拟烫。主要有三種類型的虛擬化:
- 仿真
- 半虛擬化
- 基于容器的虛擬化
- 什么是
Docker
?-
Docker
是一個容器化平臺迄本,它以容器的形式將您的應(yīng)用程序及其所有依賴項打包在一起硕淑,以確保您的應(yīng)用程序在開發(fā),測試或生產(chǎn)的任何環(huán)境中無縫運行。 -
Docker容器
置媳,將一個軟件包裝在一個完整的文件系統(tǒng)中于樟,該文件系統(tǒng)包含運行所需的一切:代碼,運行時拇囊,系統(tǒng)工具隔披,系統(tǒng)庫等可以安裝在服務(wù)器上的任何東西。 - 這可以保證軟件始終運行相同寂拆,無論其環(huán)境如何。
-
- 什么是
-
Docker
與虛擬機有何不同抓韩?-
Docker
不是虛擬化方法纠永。它依賴于實際實現(xiàn)基于容器的虛擬化或操作系統(tǒng)級虛擬化的其他工具。為此谒拴,Docker
最初使用LXC驅(qū)動程序
尝江,然后移動到libcontainer
現(xiàn)在重命名為runc
。 -
Docker
主要專注于在應(yīng)用程序容器內(nèi)自動部署應(yīng)用程序英上。應(yīng)用程序容器旨在打包和運行單個服務(wù)炭序,而系統(tǒng)容器則設(shè)計為運行多個進程,如虛擬機苍日。因此惭聂,Docker
被視為容器化系統(tǒng)上的容器管理或應(yīng)用程序部署工具。 - 與虛擬機不同相恃,容器不需要引導(dǎo)操作系統(tǒng)內(nèi)核辜纲,因此可以在不到一秒的時間內(nèi)創(chuàng)建容器。
- 由于基于容器的虛擬化為主機增加了很少或沒有開銷拦耐,因此基于容器的虛擬化具有接近本機的性能
- 主機上的所有容器共享主機的調(diào)度程序耕腾,從而節(jié)省了額外資源的需求。
- 與虛擬機映像相比杀糯,容器狀態(tài)(
Docker
或LXC映像
)的大小很小扫俺,因此容器映像很容易分發(fā)。 - 容器中的資源管理是通過
cgroup
實現(xiàn)的固翰。CGroups
不允許容器消耗比分配給它們更多的資源狼纬。雖然主機的所有資源都在虛擬機中可見,但無法使用倦挂。
-
- 容器內(nèi)部機制畸颅?
- 大約在2006年,包括Google的一些員工在內(nèi)的人們實現(xiàn)了名為
命名空間
的新的Linux
內(nèi)核級功能(不過這個想法早在FreeBSD
中就已存在)方援。操作系統(tǒng)的一個功能是允許將全局資源(如網(wǎng)絡(luò)和磁盤)共享到進程没炒。如果將這些全局資源包裝在命名空間中,以使它們僅對在同一命名空間中運行的那些進程可見,該怎么辦送火?比如說拳话,你可以獲得一大塊磁盤并將其放在命名空間X
中,然后在命名空間Y
中運行的進程無法查看或訪問它种吸。類似地弃衍,名稱空間X
中的進程無法訪問分配給名稱空間Y
的內(nèi)存中的任何內(nèi)容。當(dāng)然坚俗,X
中的進程無法查看或與名稱空間Y
中的進程通信镜盯。這為全局資源提供了一種虛擬化和隔離。 - 這就是
Docker
的工作原理:每個容器都在自己的命名空間中運行猖败,但使用與所有其他容器完全相同的內(nèi)核速缆。發(fā)生隔離是因為內(nèi)核知道分配給進程的命名空間,并且在API
調(diào)用期間確保進程只能訪問其自己的命名空間中的資源恩闻。
- 大約在2006年,包括Google的一些員工在內(nèi)的人們實現(xiàn)了名為
-
CI
(持續(xù)集成)服務(wù)器的功能是什么艺糜?-
CI
服務(wù)器功能是不斷地集成所有正在進行的更改并由不同的開發(fā)人員提交到存儲庫,并檢查編譯錯誤幢尚。它需要每天多次構(gòu)建代碼破停,最好是在每次提交之后,以便它可以檢測在問題發(fā)生時是哪個提交Bug
了尉剩。
-
- 如何使用
Docker
構(gòu)建與環(huán)境無關(guān)的系統(tǒng)真慢?- 有三個主要功能有助于實現(xiàn)這一目標(biāo):
Volumes
- 環(huán)境變量注入
- 只讀文件系統(tǒng)
- 有三個主要功能有助于實現(xiàn)這一目標(biāo):
- 什么是
Docker鏡像
?-
Docker鏡像
用于創(chuàng)建容器边涕。使用build
命令創(chuàng)建映像晤碘,并且在使用run
啟動時它們將生成容器。 - 鏡像存儲在
Docker注冊表``http://registry.hub.docker.com
中功蜓,因為它們可能變得非常大园爷,鏡像被設(shè)計為由其他鏡像層組成,允許在通過網(wǎng)絡(luò)傳輸鏡像時發(fā)送最少量的數(shù)據(jù)式撼。
-
- 什么是
Docker容器
童社?-
Docker容器
包括應(yīng)用程序及其所有依賴項,但與其他容器共享內(nèi)核著隆,作為主機操作系統(tǒng)上用戶空間中的獨立進程運行扰楼。Docker容器
不依賴于任何特定的基礎(chǔ)架構(gòu):它們可以在任何計算機,任何基礎(chǔ)架構(gòu)和任何云中運行美浦。
-
- 什么是
Docker Hub
弦赖?-
Docker hub
是一個基于云的注冊表服務(wù),允許您鏈接到代碼存儲庫浦辨,構(gòu)建鏡像并測試它們蹬竖,存儲手動推送的鏡像以及指向Docker
云的鏈接,以便您可以將鏡像部署到主機。它為整個開發(fā)流程中的容器鏡像發(fā)現(xiàn)币厕,分發(fā)和變更管理列另,用戶和團隊協(xié)作以及工作流自動化提供了集中資源。
-
-
Docker容器
有幾種狀態(tài)旦装?-
Docker容器
可以有四種狀態(tài):- 運行
- 已暫停
- 重新啟動
- 已退出
- 我們可以通過運行命令來識別
Docker容器
的狀態(tài):docker ps –a
- 這將依次列出所有可用的
docker容器
及其在主機上的相應(yīng)狀態(tài)页衙。從那里我們可以很容易地識別感興趣的容器,以相應(yīng)地檢查其狀態(tài)阴绢。
- 這將依次列出所有可用的
-
-
Docker
適合什么類型的應(yīng)用程序 - 無狀態(tài)或有狀態(tài)更適合Docker容器
店乐????????- 最好為
Docker Container
創(chuàng)建無狀態(tài)應(yīng)用程序。我們可以從應(yīng)用程序中創(chuàng)建一個容器呻袭,并從應(yīng)用程序中取出可配置的狀態(tài)參數(shù)∠斐玻現(xiàn)在我們可以在生產(chǎn)和具有不同參數(shù)的QA環(huán)境中運行相同的容器。這有助于在不同場景中重用相同的image棒妨。使用Docker Containers
比使用有狀態(tài)應(yīng)用程序更容易擴展無狀態(tài)應(yīng)用程序。
- 最好為
- 解釋基本的
Docker
使用流程- 一切都從
Dockerfile
開始含长。Dockerfile
是鏡像的源代碼(這解釋合理嗎券腔?我覺得更像是Makefile或者CMake腳本)。 - 創(chuàng)建
Dockerfile
后拘泞,您可以構(gòu)建它以創(chuàng)建容器的鏡像纷纫。鏡像只是“源代碼”的“編譯版本”,即Dockerfile
陪腌。 - 獲得容器的鏡像后辱魁,應(yīng)使用注冊表重新分發(fā)容器。注冊表就像一個
git
存儲庫 - 你可以推送和拉取鏡像诗鸭。 - 接下來染簇,您可以使用該鏡像來運行容器。在許多方面强岸,正在運行的容器與虛擬機(但沒有管理程序)非常相似锻弓。
- 一切都從
-
Dockerfile
中最常見的指令是什么????????-
Dockerfile
中的一些常用指令如下:-
FROM
:我們使用FROM
為后續(xù)指令設(shè)置基本鏡像青灼。在每個有效的Dockerfile
中,FROM
是第一條指令。 -
LABEL
:我們使用LABEL
按照項目贷币,模塊击胜,許可等組織我們的鏡像。我們也可以使用LABEL
來幫助實現(xiàn)自動化役纹。在LABEL
中偶摔,我們指定一個鍵值對,以后可用于以編程方式處理Dockerfile
促脉。 -
RUN
:我們使用RUN
命令在當(dāng)前鏡像之上的新圖層中執(zhí)行任何指令辰斋。使用每個RUN
命令,我們在鏡像頂部添加一些內(nèi)容瘸味,并在Dockerfile
的后續(xù)步驟中使用它宫仗。 -
CMD
:我們使用CMD
命令提供執(zhí)行容器的默認值。在Dockerfile
中旁仿,如果我們包含多個CMD
命令藕夫,則只使用最后一條指令。
-
-
-
Dockerfile
中的命令COPY
和ADD
命令有什么區(qū)別枯冈?- 一般而言毅贮,雖然
ADD
并且COPY
在功能上類似,但是COPY
是優(yōu)選的尘奏。 - 那是因為它比
ADD
更透明滩褥。COPY
僅支持將本地文件基本復(fù)制到容器中,而ADD
具有一些功能(如僅限本地的tar提取
和遠程URL
支持)炫加,這些功能并不是很明顯瑰煎。因此,ADD
的最佳用途是將本地tar
文件自動提取到鏡像中俗孝,如ADD rootfs.tar.xz /
中所示酒甸。
- 一般而言毅贮,雖然
- 解釋一下
dockerfile
的ONBUILD
指令?- 當(dāng)鏡像用作另一個鏡像構(gòu)建的基礎(chǔ)時赋铝,
ONBUILD指令
向鏡像添加將在稍后執(zhí)行的觸發(fā)指令烘挫。如果要構(gòu)建將用作構(gòu)建其他鏡像的基礎(chǔ)的鏡像(例如,可以使用特定于用戶的配置自定義的應(yīng)用程序構(gòu)建環(huán)境或守護程序)饮六,這將非常有用卤橄。
- 當(dāng)鏡像用作另一個鏡像構(gòu)建的基礎(chǔ)時赋铝,
-
Docker鏡像
和層有什么區(qū)別?我覺得應(yīng)該是:鏡像是一個配置信息窟扑,內(nèi)部是一個使用的層的列表以及一些元信息,而層存儲實際的內(nèi)容
-
鏡像:
Docker鏡像
是由一系列只讀層構(gòu)建的- 層:每個層代表鏡像
Dockerfile
中的一條指令(不對吧嚎货,有些指令不會創(chuàng)建層橘霎,只會加入元信息)姐叁。
- 層:每個層代表鏡像
-
下面的Dockerfile包含四個命令外潜,每個命令都創(chuàng)建一個層处窥。
FROM ubuntu:15.04 COPY . /app RUN make /app CMD python /app/app.py
重要的是滔驾,每個層只是與之前一層的一組差異層(相同的就不再放到新層中)嵌灰。
- 什么是
Docker Swarm
迁匠?-
Docker Swarm
是Docker
的本機群集城丧。它將Docker
主機池轉(zhuǎn)變?yōu)閱蝹€虛擬Docker
主機亡哄。Docker Swarm
提供標(biāo)準(zhǔn)的Docker API
蚊惯,任何已經(jīng)與Docker
守護進程通信的工具都可以使用Swarm
透明地擴展到多個主機截型。
-
- 如何在生產(chǎn)中監(jiān)控
Docker
发钝?-
Docker
提供docker stats
和docker事件
等工具來監(jiān)控生產(chǎn)中的Docker
酝豪。我們可以使用這些命令獲取重要統(tǒng)計數(shù)據(jù)的報告孵淘。 -
Docker
統(tǒng)計數(shù)據(jù):當(dāng)我們使用容器ID
調(diào)用docker stats
時晌涕,我們獲得容器的CPU
余黎,內(nèi)存使用情況等惧财。它類似于Linux
中的top
命令垮衷。 -
Docker事件
:Docker事件
是一個命令,用于查看Docker
守護程序中正在進行的活動流仰迁。- 一些常見的
Docker事件
是:attach
徐许,commit
雌隅,die
,detach
村缸,rename
梯皿,destroy
等东羹。我們還可以使用各種選項來限制或過濾我們感興趣的事件权逗。
- 一些常見的
-
-
Docker
如何在非Linux系統(tǒng)
中運行容器斟薇?- 通過添加到
Linux內(nèi)核版本2.6.24
的名稱空間功能堪滨,可以實現(xiàn)容器的概念。容器將其ID添加到每個進程发笔,并向每個系統(tǒng)調(diào)用添加新的訪問控制檢查了讨。它由clone()
系統(tǒng)調(diào)用訪問,該調(diào)用允許創(chuàng)建先前全局命名空間的單獨實例。 - 如果由于
Linux內(nèi)核
中可用的功能而可以使用容器缩滨,那么顯而易見的問題是非Linux系統(tǒng)
如何運行容器脉漏。Docker for Mac
和Windows
都使用Linux VM
來運行容器(window好像默認不是linux了吧)。Docker Toolbox
用于在Virtual Box VM
中運行容器司忱。但是坦仍,最新的Docker
在Windows
中使用Hyper-V
幔荒,在Mac
中使用Hypervisor.framework
爹梁。
- 通過添加到
- 如何在多個環(huán)境中使用
Docker
?- 可以進行以下更改:
- 刪除應(yīng)用程序代碼的任何卷綁定莉炉,以便代碼保留在容器內(nèi)絮宁,不能從外部更改
- 綁定到主機上的不同端口
- 以不同方式設(shè)置環(huán)境變量(例如,減少日志記錄的詳細程度跳纳,或啟用電子郵件發(fā)送)
- 指定重啟策略(例如斗塘,重啟:始終)以避免停??機
- 添加額外服務(wù)(例如,日志聚合器)
- 因此八毯,您可能希望定義一個額外的
Compose
文件宪彩,例如production.yml
俊柔,它指定適合生產(chǎn)的配置雏婶。此配置文件只需要包含您要從原始Compose
文件中進行的更改。
- 為什么
Docker Compose
不會等待容器準(zhǔn)備就緒错维,然后繼續(xù)以依賴順序啟動下一個服務(wù)?-
Compose
按照依賴順服啟動和停止容器隆判,決定依賴關(guān)系語句有depends_on
,links
,volumes_from
, 和network_mode: "service:..."
. - 但是,對于啟動咬腕,
Compose
不會等到容器“準(zhǔn)備好它運行“。這里有一個很好的理由:- 等待數(shù)據(jù)庫(例如)準(zhǔn)備就緒的問題實際上只是分布式系統(tǒng)更大問題的一個子集煞赢。在生產(chǎn)中,您的數(shù)據(jù)庫可能隨時變得不可用或移動主機凝危。您的應(yīng)用程序需要能夠適應(yīng)這些類型的故障蛾默。
- 要處理此問題,請將應(yīng)用程序設(shè)計為在發(fā)生故障后嘗試重新建立與數(shù)據(jù)庫的連接牧挣。如果應(yīng)用程序重試連接,它最終可以連接到數(shù)據(jù)庫寺晌。
- 最佳解決方案是在啟動時以及出于任何原因丟失連接時,在應(yīng)用程序代碼中執(zhí)行此檢查
-