Docker學(xué)習(xí)筆記及面試題

深入淺出Docker學(xué)習(xí)筆記

Docker引擎

  • Docker引擎:用來運行和管理容器的核心文件
    • 模塊化(基于開放容器計劃OCI相關(guān)標(biāo)準(zhǔn)要求)
    • 主要組件:Docker ClientDocker daemonDocker守護進程)咪鲜、containerd以及runc
  • runc
    • OCI容器運行時規(guī)范的參考實現(xiàn)
    • 實質(zhì)上是一個輕量級的黄锤、針對Libcontainer進行了包裝的命令行交互工具
      • LibcontainerDocker公司開發(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去做彰亥,containerdDocker鏡像轉(zhuǎn)換成OCI bundle,并讓runc基于此創(chuàng)建一個新的容器
  • daemon
    • 提供功能豐富衰齐、基于版本的REST API
    • 使用CRUD風(fēng)格API任斋,通過gRPCcontainerd進行通信
    • 將所有的用于啟動、管理容器的邏輯和代碼從daemon中移除耻涛,意味著容器運行時Docker daemon是解耦的废酷,有時稱為“無守護進程的容器”
      • 好處:對Docker daemon的維護和升級工作不會影響到運行中的容器
    • 將越來越多的功能從daemon中拆解出來并模塊化之后,daemon還剩什么抹缕?
      • 暫時還包括的主要功能:鏡像管理澈蟆、鏡像構(gòu)建、REST API卓研、身份驗證趴俘、安全、核心網(wǎng)絡(luò)以及編排
  • 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_INSTD_OUT流是開啟狀態(tài)嗽元,從而當(dāng)daemon重啟的時候,容器不會因為管道(pipe)的關(guān)閉而終止
      • 將容器的退出狀態(tài)反饋給daemon

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 MapperBtrfs以及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ā)散列值涂佃,這是一個壓縮版鏡像的散列值。
  • 如果某鏡像中有一個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:確保LinuxAPT包管理器僅安裝核心依賴
    • 不要使用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:指定Dockersource掛載到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)用編排引擎
  • 集群方面
    • Swarm將一個或多個Docker節(jié)點組織起來,可以用集群的方式管理它們
    • 默認內(nèi)置有加密的分布式集群存儲色建、加密網(wǎng)絡(luò)哺呜、公用TLS、安全集群接入令牌以及一套簡化數(shù)字證書管理的PKIpublic key infrastructure
    • 可以自如地添加刪除節(jié)點
  • 編排方面
    • Swarm提供一套豐富的API使得部署和管理復(fù)雜的微服務(wù)應(yīng)用變得易如反掌
    • 通過將應(yīng)用定義在聲明式配置文件中箕戳,就可以使用原生的Docker命令完成部署
    • 可以執(zhí)行滾動升級某残、回滾以及擴縮容操作
  • Swarm集群
    • 唯一前提:所有節(jié)點通過可靠的網(wǎng)絡(luò)相連
    • 節(jié)點屬性
      • 管理節(jié)點(Manager
      • 工作節(jié)點(Worker
    • Swarm的配置和狀態(tài)信息
      • 保存在一套位于所有管理節(jié)點上的分布式etcd數(shù)據(jù)庫
      • Swarm內(nèi)置etcd數(shù)據(jù)庫,無需管理
      • etcd數(shù)據(jù)庫運行于內(nèi)存中陵吸,并保持?jǐn)?shù)據(jù)的最新狀態(tài)
    • Swarm安全性
      • Swarm集成TLS保證集群安全性
      • 使用TLS進行通信加密玻墅、節(jié)點認證和角色授權(quán)
      • 自動密鑰輪換(Automatic Key Rotation)在后臺默默運行
  • Swarm應(yīng)用編排
    • Swarm最小調(diào)度單元是服務(wù)
      • 服務(wù)在API中是一個新的對象元素,它基于容器封裝了一些高級特性走越,是一個更高層次的概念
      • 當(dāng)容器被封裝在一個服務(wù)中時椭豫,我們稱之為一個任務(wù)或一個副本
      • 服務(wù)中增加了諸如擴縮容、滾動升級以及簡單回滾等特性
  • 搭建安全Swarm集群
    • 要求
      • 每個節(jié)點都需要安裝Docker旨指,并且能夠與Swarm的其他節(jié)點通信
      • 網(wǎng)絡(luò)方面赏酥,需要在路由器和防火墻中開放如下端口
        • 2377/tcp:用于客戶端與Swarm進行安全通信(2377端口可配置,但是這是一個約定成俗的端口配置谆构,最好不要改)
        • 7946/tcp7946/udp:用于控制gossip分發(fā)
        • 4789/udp:用于基于VXLAN的覆蓋網(wǎng)絡(luò)
    • 大體流程
      • 初始化第一個管理節(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
      • 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ò)連接
      • 內(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ù)的擴縮容
        • 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:每次更新與上一次之間的延遲時間
    • 故障排除
      • docker service logs:查看log
        • 默認使用json-file日志驅(qū)動
        • 其他還有journald楷掉、syslogsplunk霞势、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ò),就需要多個終端
  • 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ū)動)
      • LinuxBridge闲擦、Overlay慢味、Macvlan
      • WindowsNATOverlay墅冷、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ò)名稱為bridgewindows上為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è)置為混雜模式,這在大部分公有云平臺上是不允許的
  • 服務(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-netdocker 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的容器上分別運行找田,得到容器IDIP地址
      • 安裝ubuntu上的ping工具包:iputils-ping
      • 跟蹤路由:traceroute
  • 工作原理
    • 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)IPC2的地址10.0.0.4(非實際網(wǎng)絡(luò)ip)愉棱。
      • 請求的流量通過連接到Br0虛擬交換機veth接口發(fā)出
        • 虛擬交換機并不知道要將包發(fā)送到哪里,所以Br0將包發(fā)送到其上的全部端口
        • 連接到Br0VETP接口知道如何轉(zhuǎn)發(fā)這個數(shù)據(jù)幀哲戚,所以將自己的MAC地址返回(代理ARP響應(yīng)
        • Br0更新自己的ARP映射表奔滑,將10.0.0.4映射到本地VTEPMAC地址
      • 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ò)IDVNID)朋其,其作用是記錄VLAN(這個VLAN具體是啥?)到VXLAN的映射關(guān)系
        • 將數(shù)據(jù)幀放到UDP包中祈纯,并設(shè)置UDP目的IP字段node2節(jié)點的VTEP的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)建兩個虛擬交換機癞松,默認支持路由

卷與持久化數(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
    • 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
    • versionCompose文件格式的版本號,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
        • 副本數(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.sockDocker提供的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ì)就是命名空間的有組織集合
        • 進程IDPID):為每個容器提供互相獨立的容器進程樹
        • 網(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 IDSwarm認證信息的一個哈希值
          • 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ù)中的容器不能訪問該密鑰

企業(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)中的用戶和組
  • 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)(DockerLXC映像)的大小很小扫俺,因此容器映像很容易分發(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)用期間確保進程只能訪問其自己的命名空間中的資源恩闻。
  • 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)
  • 什么是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中的命令COPYADD命令有什么區(qū)別枯冈?
    • 一般而言毅贮,雖然ADD并且COPY在功能上類似,但是COPY是優(yōu)選的尘奏。
    • 那是因為它比ADD更透明滩褥。COPY僅支持將本地文件基本復(fù)制到容器中,而ADD具有一些功能(如僅限本地的tar提取遠程URL支持)炫加,這些功能并不是很明顯瑰煎。因此,ADD的最佳用途是將本地tar文件自動提取到鏡像中俗孝,如ADD rootfs.tar.xz /中所示酒甸。
  • 解釋一下dockerfileONBUILD指令?
    • 當(dāng)鏡像用作另一個鏡像構(gòu)建的基礎(chǔ)時赋铝,ONBUILD指令向鏡像添加將在稍后執(zhí)行的觸發(fā)指令烘挫。如果要構(gòu)建將用作構(gòu)建其他鏡像的基礎(chǔ)的鏡像(例如,可以使用特定于用戶的配置自定義的應(yīng)用程序構(gòu)建環(huán)境或守護程序)饮六,這將非常有用卤橄。
  • 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 SwarmDocker的本機群集城丧。它將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 statsdocker事件等工具來監(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雌隅,diedetach村缸,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 MacWindows都使用Linux VM來運行容器(window好像默認不是linux了吧)。Docker Toolbox用于在Virtual Box VM中運行容器司忱。但是坦仍,最新的DockerWindows中使用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í)行此檢查

Reference

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子君旦,更是在濱河造成了極大的恐慌金砍,老刑警劉巖琅绅,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異县貌,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門巷帝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堕阔,你說我怎么就攤上這事∈毖剑” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵屎债,是天一觀的道長圆丹。 經(jīng)常有香客問我硝枉,道長妻味,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮栖博,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己蠢正,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著说榆,像睡著了一般串慰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆捺,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天氓拼,我揣著相機與錄音撬即,去河邊找鬼剥槐。 笑死,一個胖子當(dāng)著我的面吹牛蕊苗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哥蔚!你這毒婦竟也來了倒谷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤糙箍,失蹤者是張志新(化名)和其女友劉穎渤愁,沒想到半個月后深夯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塌西,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡捡需,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年站辉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损姜。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡饰剥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摧阅,到底是詐尸還是另有隱情汰蓉,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布棒卷,位于F島的核電站顾孽,受9級特大地震影響许帐,放射性物質(zhì)發(fā)生泄漏罪塔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一迫靖、第九天 我趴在偏房一處隱蔽的房頂上張望蜒什。 院中可真熱鬧测秸,春花似錦、人聲如沸灾常。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钞瀑。三九已至肃晚,卻和暖如春关串,著一層夾襖步出監(jiān)牢的瞬間吧碾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工睁本, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枉疼。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像航闺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子福铅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348