
鏡像(image):
容器(container):
倉庫(repository):
環境準備
需要linux基礎
Centos7
使用軟體進行遠端連接配接
環境檢視
安裝
幫助文檔
登入阿裡雲找到容器服務
找到鏡像加速的位址
配置應用
docker是怎麼工作的?
Docker 是一個client-server 結構的系統,Docker的守護程序運作在主機上,通告Socker從用戶端通路
Dokcer server 接收到Docker-client 的指令,就會執行這個指令
Docker為什麼比虛拟機快
Docker有着比虛拟機更少的抽象層
Docker 利用的是主控端的核心,VM需要Guest OS
是以,建立一個容器的時候,Docker不需要虛拟機一樣重新加載一個作業系統的核心,避免引導。虛拟機是加載Guest OS,分鐘級别的,而docker是利用主控端的作業系統,省略了這個複雜的過程,秒級
說明:我們有了鏡像才可以建立容器,Linux,下載下傳一個centos 鏡像來測試學習
使用kibana連接配接es,思考網絡如何才能連接配接過去
portainer(先用這個)
Rancher(CI/CD再用)
什麼是portainer?
Docker圖形化界面管理工具,提供一個背景面闆供我們操作
通路測試:http://ip:8080
鏡像是一種輕量級、可執行的獨立軟體保,用來打包軟體運作環境和基于運作環境開發的軟體,他包含運作某個軟
件所需的所有内容,包括代碼、運作時庫、環境變量和配置檔案
所有的應用,直接打包docker鏡像,就可以直接跑起來
遠端倉庫下載下傳
其他人拷貝給你
自己制作一個鏡像dockerfile
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等等。
對于個精簡的OS,rootfs可以很小,隻需要包合最基本的指令,工具和程式庫就可以了,因為底層直接用Host的kernel,自己隻需要提供rootfs就可以了。
由此可見對于不同的Linux發行版, boots基本是一緻的, rootfs會有差別,是以不同的發行版可以公用bootfs.
虛拟機是分鐘級别,容器是秒級!
最大的好處,我覺得莫過于資源共享了!比如有多個鏡像都從相同的Base鏡像建構而來,那麼主控端隻需在磁盤上保留一份base鏡像,同時記憶體中也隻需要加載一份base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。
所有的 Docker鏡像都起始于一個基礎鏡像層,當進行修改或培加新的内容時,就會在目前鏡像層之上,建立新的鏡像層。
實戰測試
如果想要儲存目前容器的狀态,我們可以通過commit來送出,獲得一個鏡像,類似于虛拟機的快照
docker的理念回顧
将應用和環境打包成一個鏡像
如果資料都在容器中,那麼删除容器,資料就會丢失! 需求:資料可以持久化
MySQL,容器删了,删庫跑路!需求:MySQL資料可以存儲在本地
容器之間可以有一個資料共享的技術!Docker容器中産生的資料,同步到本地!
這就是卷技術!!目錄的挂載,将我們容器内的目錄,挂載到Linux上面
好處:
我們以後修改隻需要在本地修改即可,容器内自動同步!
發現,我們挂載到本地的資料卷依舊沒有丢失,這就實作了容器資料持久化功能
我們通過具名挂載可以友善的找到我們的一個卷,大多數情況在使用的是具名挂載
Dockerfile就是用來建構docker鏡像的建構檔案、指令腳本
通過這個腳本可以生成鏡像,鏡像是一層一層的,腳本一個個的指令,每個指令都是一層
這個卷和外部有一個同步的目錄
檢視一下挂載的路徑
測試一下剛才的檔案是否同步
這種方式之後使用的很多,因為 通常我們會建構自己的鏡像
假設建構鏡像的時候沒有挂載卷,要手動鏡像挂載 -v 卷名:容器内路徑
多個mysql同步資料
多個mysql實作資料共享
容器之間配置資訊的傳遞,資料卷容器的生命周期一直持續到沒有容器使用為止
但是一旦持久化到了本地,這個時候本地的資料是不會删除的
dockerfile是用來建構docker鏡像的檔案,指令參數腳本
編寫一個dockerfile檔案
docker build建構成為一個鏡像
docker run 運作鏡像
docker push 釋出鏡像(docker hub,阿裡雲鏡像倉庫)
很多官方鏡像都是基礎包,很多功能都沒有,我們通常自己搭建自己的鏡像
每個保留關鍵字(指令)都必須是大寫字母
從上到下順序執行
表示注釋(#)
每個指令都會建立送出一個新的鏡像,并送出
Dockerfile是面向開發的,以後釋出項目,做鏡像,就需要編寫dockerfile檔案
Docker鏡像逐漸成為企業傳遞的标準
Dockerfile:建構檔案,定義了一切的步驟,源代碼
Dockerimages:通告Dockerfile建構生成的鏡像,最終釋出運作的産品
Docker容器:容器就是鏡像運作起來提供服務
Docker Hub中99%鏡像都是從這個基礎鏡像過來的 FROM scratch,然後配置需要的軟體和配置來進行建構
我們可以通過 docker history+鏡像id 列出本地鏡像的變更曆史
我們平時拿到一個鏡像,可以研究一下他是怎麼做到的
釋出項目
送出的時候也是按照鏡像的層級來進行送出的
https://hub.docker.com 注冊自己的賬号
确定這個賬号可以登入
在我們伺服器上送出自己的鏡像
登入完畢之後就可以送出鏡像了,docker push
登入阿裡雲
找到容器鏡像服務
建立命名空間
建立容器鏡像
浏覽阿裡雲
阿裡雲容器鏡像的就參考官方位址
三個網絡
我們每啟動一個docker容器,docker就會給docker容器配置設定一個ip ,我們隻要安裝了docker,就會有一個網卡docker0 橋接模式,使用的技術是 evth-pair技術
再次測試ip addr
再啟動一個容器測試,發現又多了一對網卡
我們測試 tomcat01 和 tomcat02 可以ping通
結論: tomcat01 和 tomcat02 是共用的一個 docker0
所有的容器不指定網絡的情況下,都是通過docker0通信的,docker會給我們的容器配置設定一個預設的可用IP
Docker使用的是Linux的橋接,主控端中是一個Dokcer容器的網橋 docker0
Dcoker中的所有的網絡接口都是虛拟的,虛拟的轉發效率高
隻要容器删除,對應網橋一對就都沒了
場景:編寫了一個微服務,項目不重新開機,資料庫 IP 換掉了,如何用名字來進行通路容器
探究:inspect
--link 就是在我們hosts配置中增加了一個 172.18.0.3 tomcat02 312857784cd4
現在已經不建議使用 --link 了
docker0的問題:不支援容器名連接配接網絡
檢視所有的docker 網絡
網絡模式:
bridge:橋接(預設)
測試:
自定義一個網絡
自定義的網絡 docker都已經幫我們維護好了對應的關系,推薦我們平時這樣使用網絡
redis:不同的叢集使用不同 的網絡,保證叢集是安全和健康的
mysql:不同的叢集使用不同的網絡,保證叢集是安全和健康的
結論:假設要跨網絡操作别人,就需要使用docker network connect 連通