目錄
Docker概述
Docker曆史
Docker
Docker的基本組成
Docker安裝
使用流程
底層原理
Docker的常用指令
Portainer 可視化面闆安裝
鏡像原理之聯合檔案系統
容器資料卷
Dockerfile
Docker網絡
了解Docker 0
自定義網絡
網絡連通
實戰
部署Redis叢集
SpringBoot微服務打包Docker鏡像
小結
Docker的學習流程
概述
安裝
指令
鏡像
容器
操作
…………
Docker鏡像
DockerFile
Docker網絡原理
IDEA整合Docker
Docker Compose
Docker Swarm
CI \ CD Jenkins
問題
環境不同,版本更新,導緻服務不可用,對于運維來說,考驗十分大,環境配置麻煩,每個機器都要部署環境, 部署叢集,費時費力,釋出jar包或war包,需要redis、mysql、jdk、ES等環境,釋出項目等時候能包含環境一起發過去,項目能帶上環境打包,環境配置麻煩,并且軟體可能不能跨平台。
解決

Docker的思想就來源于集裝箱 container ,現在的是隔離的思想,将所有的東西打包裝箱,每個container都是互相隔離的,為了讓完全不同的東西能放在同一個環境中運作,通過鏡像或稱為容器,Docker通過隔離機制,能将伺服器利用到極緻。
Docker基于Go語言開發的!開源項目!
Docker官網:https://www.docker.com/
文檔:https://docs.docker.com/ Docker的文檔是超級詳細的!
倉庫:https://hub.docker.com/
以前的虛拟技術
1、 資源占用十分多
2、 備援步驟多
3、 啟動很慢!
容器化技術
容器化技術不是模拟一個完整的作業系統 ,比較Docker和虛拟機技術的不同:
傳統虛拟機,虛拟出一條硬體,運作一個完整的作業系統,然後在這個系統上安裝和運作軟體。
容器内的應用直接運作在主控端的内容,容器是沒有自己的核心的,也沒有虛拟我們的硬體,是以就輕便了。
每個容器間是互相隔離,每個容器内都有一個屬于自己的檔案系統,互不影響。
DevOps(開發、運維)
CI/CD-企業級DevOps
用更快速的傳遞和部署
傳統:一對幫助文檔,安裝程式。
Docker:打包鏡像釋出測試一鍵運作。
更便捷的更新和擴縮容
使用了 Docker之後,我們部署應用就和搭積木一樣,項目打包為一個鏡像,擴充伺服器A!伺服器B
更簡單的系統運維
在容器化之後,我們的開發,測試環境都是高度一緻的。
更高效的計算資源利用
Docker是核心級别的虛拟化,可以在一個實體機上可以運作很多的容器執行個體!伺服器的性能可以被壓榨到極緻。
2010年,幾個的年輕人,就在美國成立了一家公司 DotCloud,做一些pass的雲計算服務!LXC(Linux Container容器)有關的容器技術!Linux Container容器是一種核心虛拟化技術,可以提供輕量級的虛拟化,以便隔離程序和資源。他們将自己的技術(容器化技術)命名就是 Docker,Docker剛剛延生的時候,沒有引起行業的注意!DotCloud,就活不下去!
開源
2013年,Docker開源!越來越多的人發現Docker的優點!火了。Docker每個月都會更新一個版本!
2014年4月9日,Docker1.0釋出!Docker為什麼這麼火?十分的輕巧!在容器技術出來之前,我們都是使用虛拟機技術!
虛拟機:在window中裝一個VMware,通過這個軟體我們可以虛拟出來一台或者多台電腦!笨重!
虛拟機也屬于虛拟化技術,Docker容器技術,也是一種虛拟化技術!
鏡像(image)
Docker鏡像就好比是一個目标,可以通過這個目标來建立容器服務,Tomcat鏡像=>run=>容器(提供伺服器),通過這個鏡像可以建立多個容器(最終服務運作或者項目運作就是在容器中的)。
容器(container)
Docker利用容器技術,獨立運作一個或者一,通過鏡像來建立的。啟動,停止,删除,基本指令
目前就可以把這個容器了解為就是一個簡易的 Linux系統。
倉庫(repository)
倉庫就是存放鏡像的地方,倉庫分為公有倉庫和私有倉庫。(很類似git)Docker Hub是國外的。阿裡雲…都有容器伺服器(配置鏡像加速!)
環境準備
Linux要求核心3.0以上
CentOS 7
幫助文檔:https://docs.docker.com/engine/install/
如果有要先解除安裝就得版本: yum remove docker
需要的安裝包, yum install -y yum-utils
設定鏡像的倉庫
安裝Docker相關的 Docker-ce 社群版 而ee是企業版, yum install docker-ce docker-ce-cli containerd.io ,這裡我們使用社群版即可
啟動Docker, systemctl start docker
使用Docker version檢視是否按照成功,docker version
test, docker run hello-world
檢視已經下載下傳的鏡像(從這裡可以檢視已有鏡像的id), docker images
解除安裝Docker
解除安裝依賴,yum remove docker-ce docker-ce-cli containerd.io
删除資源,rm -rf /var/lib/docker,/var/lib/docker 是docker的預設工作路徑!
docker run流程
Docker是怎麼工作的?
Docker是一個Client-Server結構的系統,Docker的守護程序運作在主機上。通過Socket從用戶端通路!
Docker-Server接收到Docker-Client的指令,就會執行這個指令!
為什麼Docker比Vm快?
Docker有着比虛拟機更少的抽象層。由于Docker不需要Hypervisor實作硬體資源虛拟化,運作在Docker容器上的程式直接使用的都是實際實體機的硬體資源。是以在CPU、記憶體使用率上Docker将會在效率上有明顯優勢。
Docker利用的是主控端的核心,而不需要Guest OS( VM(虛拟機)裡的的系統(OS) )。
啟動和停止容器的操作
docker start 容器id #啟動容器
docker restart 容器id #重新開機容器
docker stop 容器id #停止目前正在運作的容器
docker kill 容器id #強制停止目前容器
主控端端口 和 容器内部端口 以及端口暴露:
指令大全
portainer 是 Docker圖形化界面管理工具!提供一個背景面闆供我們操作!
鏡像是什麼
鏡像是一種輕量級、可執行的獨立軟體包,用來打包軟體運作環境和基于運作環境開發的軟體,他包含運作某個軟體所需的所有内容,包括代碼、運作時庫、環境變量和配置檔案。所有應用,直接打包Docker鏡像,就可以直接跑起來!
如何得到鏡像
從遠端倉庫下載下傳
别人拷貝給你
自己制作一個鏡像 DockerFile
Docker鏡像加載原理
UnionFs (聯合檔案系統)
UnionFs(聯合檔案系統):Union檔案系統(UnionFs)是一種分層、輕量級并且高性能的檔案系統,他支援對檔案系統的修改作為一次送出來一層層的疊加,同時可以将不同目錄挂載到同一個虛拟檔案系統下( unite several directories into a single virtual filesystem)。Union檔案系統是 Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:一次同時加載多個檔案系統,但從外面看起來,隻能看到一個檔案系統,聯合加載會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄。
==Docker的鏡像實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS。
boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引導加 kernel, Linux剛啟動時會加bootfs檔案系統,在 Docker鏡像的最底層是 boots。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和核心。當boot加載完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由 bootfs轉交給核心,此時系統也會解除安裝bootfs。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系統中的/dev,/proc,/bin,/etc等标準目錄和檔案。 rootfs就是各種不同的作業系統發行版,比如 Ubuntu, Centos等等。
分層了解
我們可以去下載下傳一個鏡像,注意觀察下載下傳的日志輸出,可以看到是一層層的在下載下傳
思考:為什麼Docker鏡像要采用這種分層的結構呢?
最大的好處,我覺得莫過于資源共享了!比如有多個鏡像都從相同的Base鏡像建構而來,那麼主控端隻需在磁盤上保留一份Base鏡像,同時記憶體中也隻需要加載一份Base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。
檢視鏡像分層的方式可以通過docker image inspect 指令
了解
所有的 Docker鏡像都起始于一個基礎鏡像層,當進行修改或培加新的内容時,就會在目前鏡像層之上,建立新的鏡像層。
舉一個簡單的例子,假如基于 Ubuntu Linux16.04建立一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包,就會在基礎鏡像層之上建立第二個鏡像層;如果繼續添加一個安全更新檔,就會創健第三個鏡像層該像目前已經包含3個鏡像層,如下圖所示(這隻是一個用于示範的很簡單的例子)。
在添加額外的鏡像層的同時,鏡像始終保持是目前所有鏡像的組合,了解這一點。
上圖中的鏡像層跟之前圖中的略有區別,主要目的是便于展示檔案。
下圖中展示了一個稍微複雜的三層鏡像,在外部看來整個鏡像隻有6個檔案,這是因為最上層中的檔案7是檔案5的一個更新版。
這種情況下,上層鏡像層中的檔案覆寫了底層鏡像層中的檔案。這樣就使得檔案的更新版本作為一個新鏡像層添加到鏡像當中。
Docker通過存儲引擎(新版本采用快照機制)的方式來實作鏡像層堆棧,并保證多鏡像層對外展示為統一的檔案系統。
Linux上可用的存儲引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基于 Linux中對應的檔案系統或者塊裝置技術,井且每種存儲引擎都有其獨有的性能特點。
Docker在 Windows上僅支援 windowsfilter 一種存儲引擎,該引擎基于NTFS檔案系統之上實作了分層和CoW 。
下圖展示了與系統顯示相同的三層鏡像。所有鏡像層堆并合井,對外提供統一的視圖。
特點
Docker 鏡像都是隻讀的,當容器啟動時,一個新的可寫層加載到鏡像的頂部!
這一層就是我們通常說的容器層,容器之下的都叫鏡像層!
什麼是容器資料卷?
将應用和環境打包成一個鏡像!資料?如果資料都在容器中,那麼我們容器删除,資料就會丢失!需求:資料可以持久化。MySQL,容器删除了,删庫跑路!需求:MySQL資料可以存儲在本地!容器之間可以有一個資料共享的技術!Docker容器中産生的資料,同步到本地!這就是卷技術!目錄的挂載,将我們容器内的目錄,挂載到Linux上面!
總結一句話:容器的持久化和同步操作!容器間也是可以資料共享的!
使用資料卷
方式一 :直接使用指令挂載 -v
具名和匿名挂載
資料卷容器
多個MySQL同步資料,命名的容器挂載資料卷。
多個mysql實作資料共享
結論
容器之間的配置資訊的傳遞,資料卷容器的生命周期一直持續到沒有容器使用為止。
但是一旦你持久化到了本地,這個時候,本地的資料是不會删除的!
Dockerfile 就是用來建構Docker鏡像的建構檔案!
通過這個腳本可以生成鏡像,鏡像是一層一層的,腳本是一個個的指令,每個指令都是一層!
Dockerfile是用來建構Docker鏡像的檔案,指令參數腳本。
建構步驟:
1、 編寫一個Dockerfile檔案
2、 docker build 建構稱為一個鏡像
3、 docker run運作鏡像
4、 docker push釋出鏡像(DockerHub 、阿裡雲倉庫)
DockerFile建構過程
基礎知識:
1、每個保留關鍵字(指令)都是必須是大寫字母
2、執行從上到下順序
3、表示注釋
4、每一個指令都會建立送出一個新的鏡像曾,并送出!
Dockerfile是面向開發的,我們以後要釋出項目,做鏡像,就需要編寫Dockerfile檔案,這個檔案十分簡單!
Docker鏡像逐漸成企業傳遞的标準,必須要掌握!
DockerFile:建構檔案,定義了一切的步驟,源代碼
DockerImages:通過DockerFile建構生成的鏡像,最終釋出和運作産品。
Docker容器:容器就是鏡像運作起來提供服務。
DockerFile的指令
原理:
我們每啟動一個Docker容器,docker就會給docker容器配置設定一 個ip,我們隻要安裝了Docker,就會有一一個網卡docker0
橋接模式,使用的技術是evth-pair(就是一對虛拟的裝置接口,都是成對出現,一個連着協定,一個彼此連接配接)技術。
就是說Docker使用的是Linux裡面的橋接技術。
自定義網絡,不适用docker0,docker0問題:不支援容器名連接配接通路。
網絡模式
bridge :橋接 docker(預設,自己建立也是用bridge模式)
none :不配置網絡,一般不用
host :和所主機共享網絡
container :容器網絡連通(用得少!局限很大)
我們自定義的網絡Docker當我們維護好了對應的關系,推薦我們平時這樣使用網絡, 不同的叢集使用不同的網絡,保證叢集是安全和健康的。
假設要跨網絡操作别人,就需要使用docker network connect 連通。
建構SpringBoot項目
打包運作
編寫dockerfile
建構鏡像
以後我們使用了Docker之後,給别人傳遞就是一個鏡像即可。