尚硅谷Docker實戰(zhàn)教程(docker教程天花板)

docker存在的意義

在開發(fā)完成后將src源碼提交給運(yùn)維進(jìn)行部署,而如果開發(fā)環(huán)境和運(yùn)維生產(chǎn)環(huán)境不同則會出現(xiàn)問題:
- 運(yùn)維與開發(fā)之間的mysql版本、redis補(bǔ)丁、java版本不一致,
- 有可能是因為安裝啰嗦,因此運(yùn)維需要讓開發(fā)提供一條list清單,而開發(fā)所提交的list清單環(huán)境有時候會用多臺集群,對于運(yùn)維的痛苦在于如果多臺集群當(dāng)中有一臺部署錯誤都跑不起來。
- 最后一種可能是擴(kuò)容、縮容的問題,例如開發(fā)的redis是六主六從,而運(yùn)維當(dāng)前只有三主三從,這就是一個很費(fèi)時費(fèi)力的問題。
而我們引入了新的技術(shù)docker后,例如說當(dāng)開發(fā)把所有的源代碼和配置環(huán)境還有版本都是ok的情況下,把這些都打包成一個鏡像文件,將這個鏡像文件跑在docker里,此時所模擬出來的環(huán)境就會讓開發(fā)時所愚弄的環(huán)境原封不動地運(yùn)行。

好比說我們搬家時,我們的家居需要搬走并在新家重新部署,難以避免地出現(xiàn)損失(損耗),那么docker的出現(xiàn)好比于將整棟樓搬到了新的地址,原本我們住在哪里現(xiàn)在還住在哪里,只不過是地址不一樣了,內(nèi)部的東西都是一樣的,docker保證了遷移的過程中不走樣。

在裝雙系統(tǒng)時,由于每個人的電腦品牌不同,所安裝的linxu時會出現(xiàn)很多不同的問題,為此我們需要安裝一個軟件——WMware,如果我們每個人都安裝了這個軟件,在同一個軟件上運(yùn)行同一個iso文件,這樣就保證了換證遷移的一致,這就是我們的理念初心。
而docker更加強(qiáng)大,例如在做一個項目時需要安裝很多軟件,redis、mysql、mq等等,盡管是同桌只要互換環(huán)境去跑相同的代碼都容易因為環(huán)境出現(xiàn)不同的問題,因此我們可以通過docker將源碼、運(yùn)行環(huán)境和配置文件還有特殊引導(dǎo)第三方組件等用docker打包成一個gmall鏡像文件,這樣就不會出現(xiàn)很多復(fù)雜的問題。
總結(jié):我們的vmware就是docker,而centos7.iso就是最后所打包的鏡像文件,這就是docker帶給我們的方便和靈活。
docker是基于Go語言實現(xiàn)的云開源項目。
docker主要目標(biāo)是“Build”,也就是通過對應(yīng)組件的封裝、分發(fā)、部署、運(yùn)行等生命周期的管理,使用戶的APP及運(yùn)行環(huán)境能夠做到“一次鏡像,處處運(yùn)行”。
docker的出現(xiàn)解決了運(yùn)行環(huán)境和配置問題的軟件容器,方便做持續(xù)集成并有助于整體發(fā)布的容器虛擬化技術(shù)。
容器和虛擬機(jī)有什么不同?

docker是一個容器虛擬化技術(shù)。
虛擬機(jī)是帶環(huán)境安裝的一種解決方案,而docker是相較之下更簡介的一個安裝方案,就好比我們在win10的系統(tǒng)里運(yùn)行l(wèi)inux系統(tǒng)centos7,通過虛擬機(jī)軟件VMware安裝ISO鏡像文件來模擬虛擬機(jī)管理類系統(tǒng)、創(chuàng)建虛擬機(jī),在虛擬機(jī)上安裝操作系統(tǒng),在操作系統(tǒng)中部署安裝各種應(yīng)用。

缺點:
- 資源占用多
- 冗余步驟多
- 啟動慢
對此Linux想出了一個解決方式,俗稱Linux容器(縮寫為LXC)。Linux容器是系統(tǒng)與系統(tǒng)其他部分分隔離開的一系列進(jìn)程,從另一個鏡像運(yùn)行,并由該鏡像提供支持進(jìn)程所需的全部文件。容器提供的鏡像包含了應(yīng)用的所有依賴項,因而在從開發(fā)到測試再到生產(chǎn)的整個過程中,它都具有可移植性和一致性。

docker容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)虛擬機(jī)則是在硬件層面實現(xiàn)虛擬化。與傳統(tǒng)的虛擬機(jī)相比,docker優(yōu)勢體現(xiàn)為啟動速度快,占用體積小。

docker出來會后對于技術(shù)支撐有著很大的變化,例如說第一種coder就是碼農(nóng),只是一個寫代碼的,可以做一些基礎(chǔ)的軟件工作,那么接下來就是programmer程序員,對于部分模塊有自己的心得,可以寫一些東西了,再進(jìn)階就是software engineer軟件工程師。而隨著docker的出現(xiàn),有了DevOps engineer運(yùn)維開發(fā)混合型工程師,將傳統(tǒng)的開發(fā)與運(yùn)維合并在一起成為了新一代開發(fā)工程師。
Docker的好處:
- 更快速的應(yīng)用交付和部署(傳統(tǒng)的應(yīng)用開發(fā)完成后,需要提供一堆安裝程序和配置說明文檔,安裝部署后需要根據(jù)配置文檔進(jìn)行繁雜的配置才能正常運(yùn)行。Docker化之后只需要交付少量容器鏡像文件,在正式生產(chǎn)環(huán)境加載鏡像并運(yùn)行即可,應(yīng)用安裝配置在鏡像里已經(jīng)內(nèi)置好,大大節(jié)省部署配置和測試驗證時間。)
- 更便捷的升級和擴(kuò)縮容(隨著微服務(wù)架構(gòu)和Docker的發(fā)展,大量的應(yīng)用會通過微服務(wù)方式架構(gòu),應(yīng)用的開發(fā)構(gòu)建將變成搭樂高積木一樣,每個Docker容器將變成一塊“積木”,應(yīng)用的升級將變得非常容易。當(dāng)現(xiàn)有的容器不足以支撐業(yè)務(wù)處理時,可通過鏡像運(yùn)行新的容器快速擴(kuò)容,使應(yīng)用程序的擴(kuò)容從原先的天級變成分鐘級甚至秒級。)
- 更簡單的系統(tǒng)運(yùn)維(應(yīng)用容器化運(yùn)行后,生產(chǎn)環(huán)境運(yùn)行的應(yīng)用與開發(fā)、測試環(huán)境的應(yīng)用高度一致,容器會將應(yīng)用程序相關(guān)的環(huán)境和狀態(tài)完全封裝起來,不會因為底層基礎(chǔ)架構(gòu)和操作系統(tǒng)的不一致性給應(yīng)用帶來影響,產(chǎn)生新的BUG。當(dāng)出現(xiàn)程序異常時,也可以通過測試環(huán)境的相同容器進(jìn)行快速定位和修復(fù)。)
- 更高效的計算資源利用(docker是內(nèi)核級虛擬化,并不像傳統(tǒng)的虛擬化技術(shù)一樣需要額外的Hypervisor支持,所以在一臺物理機(jī)上可以運(yùn)行很多個容器實例,可大大提升物理服務(wù)器的CPU和內(nèi)存的利用率

新浪、美團(tuán)、蘑菇街等企業(yè)都在用.
下載方式:
- docker官網(wǎng):http://www.docker.com
- docker Hub官網(wǎng):https://hub.docker.com/

Docker的組成:
- 鏡像(image:就是一個只讀的模板。鏡像可以用來創(chuàng)建docker容器,一個鏡像可以創(chuàng)建很多容器,它也相當(dāng)于是一個root文件系統(tǒng)。比如官方鏡像centos:7,最小系統(tǒng)的root文件系統(tǒng)。相當(dāng)于容器的“源代碼”,docker鏡像文件類似于java的類模板,而docker容器實例類似于java中new出來的實例對象。)
- 容器(container:從面向?qū)ο蠼嵌葋砜?,docker利用容器獨立運(yùn)行在容器里面,容器就類似于一個虛擬化的運(yùn)行環(huán)境,容器是用鏡像創(chuàng)建的運(yùn)行實例。就像是JAVA中的類和實例對象一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時的實體。容器為鏡像提供了一個標(biāo)準(zhǔn)和隔離運(yùn)行環(huán)境,它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平臺。而從鏡像容器角度來看,可以把容器看做是一個簡易版的linxu環(huán)境和運(yùn)行在其中的應(yīng)用程序 。 )
- 倉庫(repository:是集中存放鏡像文件的場所。類似于maven倉庫,存放各種jar包的地方;github倉庫,存放各種git項目的地方;docker公司提供的官方registry被稱為docker Hub,存放各種鏡像模板的地方。倉庫分為公開倉庫和私有倉庫兩種形式。最大的公開倉庫是Docker Hub,存放了數(shù)量龐大的鏡像供用戶下載。國內(nèi)的公開倉庫包括阿里云、網(wǎng)易云等。)


Docker是一個Client-Server結(jié)構(gòu)的系統(tǒng),Docker守護(hù)進(jìn)程運(yùn)行在主機(jī)上,然后通過Socket連接從客戶端訪問,守護(hù)進(jìn)程從客戶端接受命令并管理運(yùn)行在主機(jī)上的容器。容器是一個運(yùn)行時環(huán)境,就是我們前面所說到的集裝箱??梢詫Ρ萴ysql演示對比講解:
我們在裝完mysql后,本地服務(wù)(后臺)上會啟動一個mysql服務(wù),如果想讓mysql干活,就需要第三方工具(小海豚或者是Navicat等)軟件連接上mysql讓其進(jìn)行干活。docker與mysql幾乎雷同,區(qū)別是mysql用的是mysql腳本來生成sql語句,docker是用鏡像文件生成了一個又一個的容器實例。通過這種方式來實現(xiàn)只要版本對應(yīng)的情況下,在不同機(jī)子上都能跑的目的。

docker的三大特色:構(gòu)建、分享以及運(yùn)行。
安裝docker的步驟:
- 確定使用的版本是centos7(虛擬機(jī)上查看)
- 卸載舊版本(如果之前裝過docker:yum remove docker)
- yum安裝gcc相關(guān)(首先保證能連接上外網(wǎng),然后安裝gcc和gcc-c++:yum -y install gcc和yum -y install gcc-c++)
- 安裝需要的軟件包(根據(jù)官網(wǎng)要求執(zhí)行命令:yum install -y yum-utils)
- 設(shè)置stable鏡像倉庫(由于國內(nèi)按照官網(wǎng)設(shè)置速度很慢會報錯,因此我們采取國內(nèi)下載方式:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)
- 更新yum軟件包索引(yum makecache fast)
- 安裝DOCKER CE(yum install docker -ce docker-ce-cli containerd.io)
- 啟動docker(systemctl start docker)
- 測試(docker version來查看docker的版本并嘗試運(yùn)行hello world:docker run hello-world,根據(jù)我們前面學(xué)到的理論,docker如果要run這個鏡像,會報錯說本地炸不到這個鏡像,因為如果本地有就直接轉(zhuǎn)化成容器實例運(yùn)行,如果沒有就從遠(yuǎn)程倉庫里去找拉到本地。這個消息如果能夠在界面上出現(xiàn)代表工作正常。)
卸載docker的步驟:
- systemctl stop docker(停止正在運(yùn)行的docker)
- yum remove docker -ce docker-ce-cli containerd.io(停止docker后臺服務(wù))
- rm -rf /var/lib/docker(刪掉docker的配置文件)
- rm -rf /var/lib/containerd(刪掉docker的第三方庫包)

底層原理:為什么docker會比VM虛擬機(jī)快?
- docker有著比虛擬機(jī)更少的抽象層(由于docker不需要Hypervisor【虛擬機(jī)】實現(xiàn)硬件資源虛擬化,運(yùn)行在docker容器上的程序直接使用的都是實際物理機(jī)的硬件資源。因此利用率上docker將會在效率上有明顯優(yōu)勢)
- docker利用的是宿主機(jī)的內(nèi)核,而不需要加載操作系統(tǒng)OS內(nèi)核(當(dāng)新建一個容器時,docker不需要和虛擬機(jī)一樣重新加載一個操作系統(tǒng)內(nèi)核。進(jìn)而避免引尋、加載操作系統(tǒng)內(nèi)核返回等比較費(fèi)資源的過程,當(dāng)新建一個虛擬機(jī)時,虛擬機(jī)軟件需要加載OS,返回新建過程時分鐘級別的。而docker時直接利用宿主機(jī)的操作系統(tǒng),則省略了返回過程,因此新建一個docker容器只需要幾秒鐘)

Docker常用命令有幫助啟動類命令、鏡像命令和容器命令。
幫助啟動類命令:

鏡像命令:
docker images:列出本地主機(jī)上的鏡像
- -a:列出本地所有的鏡像(含歷史)
- -q:只顯示鏡像ID

docker search [OPTIONS]鏡像名字
- --limit:只列出N個鏡像,默認(rèn)25個
eg:docker search --limit 5 redis

docker pull 鏡像名字[:TAG]:下載鏡像
eg:docker pull redis:6.0.8
沒有TAG的話默認(rèn)是下載最新版本
docker system df :查看鏡像/容器/數(shù)據(jù)卷所占的空間
docker rmi 倉庫名字/imageID

eg:docker rmi -f feb5d9fea6a5(如果不加f的話會可能會報錯)
docker rmi -f $(docker images -qa)【刪除全部倉庫】
容器命令
新建+啟動容器:docker run [OPTIONS] images

如果沒有設(shè)立--name那么系統(tǒng)就會隨機(jī)分配一個給我們
如果我們想更深一步地學(xué)習(xí)或了解run,可以使用docker run --help來查看更多的命令參數(shù)。我們現(xiàn)在已經(jīng)得知,--name是指定名稱,-it是啟動交互容器,
列出所有正在運(yùn)行的容器實例:docker ps [OPTIONS]
- -a:羅列出所有正在運(yùn)行的容器+歷史上運(yùn)行過的
- -l:顯示最近創(chuàng)建的容器
- -n:顯示最近n個創(chuàng)建的容器
- -q:靜默模式,只顯示容器編號
退出容器
- exit:run進(jìn)去容器,exit退出,容器停止
- ctrl+p+q:run進(jìn)去容器,ctrl+p+q退出,容器不停止
重啟容器:docker restart容器ID或者容器名
停止容器:docker stop容器ID或者容器名
強(qiáng)制停止容器:docker kill容器ID或容器名
刪除已停止的容器:docker rm 容器ID
一次性刪除多個容器實例:
- docker rm -f $(docker ps -a -q)【docker -ps -a -q列出所有正在運(yùn)行的和已停止的容器用$包起來執(zhí)行rm -f強(qiáng)制刪除命令】
- docker ps -a -q | xargs docker rm
【在Docker中,docker ps命令用于列出當(dāng)前正在運(yùn)行的容器。-a選項允許列出所有的容器,而不僅僅是正在運(yùn)行的容器,并且使用-q選項將輸出限制為容器的ID。這意味著運(yùn)行docker ps -a -q會返回所有容器的ID,無論它們目前是否正在運(yùn)行。
管道符|將命令的輸出從前一個命令傳遞到下一個命令。在這種情況下,它將docker ps -a -q的輸出傳遞給xargs命令。
xargs命令用于將輸入從標(biāo)準(zhǔn)輸入轉(zhuǎn)換為參數(shù)。在這里,它將docker ps -a -q的輸出作為輸入,并以容器ID的形式將它們傳遞給docker rm命令。因此,整個命令docker ps -a -q | xargs docker rm的含義是,刪除所有容器,包括正在運(yùn)行的和已停止的,但不包括運(yùn)行中的容器?!?/p>
啟動守護(hù)式容器(后臺服務(wù)器)
在大部分場景下,我們希望docker的服務(wù)是在后臺運(yùn)行的,我們可以通過-d指定容器的后臺運(yùn)行模式。
docker run -d 容器名

查看容器日志:docker logs 容器ID或名稱
查看容器內(nèi)運(yùn)行的進(jìn)程:docker top 容器ID或名稱
查看容器內(nèi)部細(xì)節(jié):docker inspect 容器ID
docker exec -it 容器ID bashShell
如果在使用Docker創(chuàng)建一個容器,并且希望進(jìn)入該容器的命令行界面交互,你可以使用"docker exec -it container_name /bin/bash"命令來實現(xiàn)。這將啟動一個新的shell會話,讓你可以在容器中執(zhí)行命令。
一旦你完成了容器中的操作并想要退出容器,你可以在容器中運(yùn)行"exit"命令來退出容器的shell環(huán)境。這個命令不需要任何數(shù)字參數(shù),它將在容器中退出命令行界面,并返回到宿主機(jī)的shell環(huán)境。你可以在宿主機(jī)上繼續(xù)執(zhí)行其他命令或操作。
需要注意的是,如果你是在容器啟動時使用"docker run -it container_name"命令來啟動容器并進(jìn)入交互模式,則可以使用"exit"命令來退出該容器,并關(guān)閉容器。在這種情況下,"exit"命令不需要任何數(shù)字參數(shù)。
docker exec和docker run命令都可以用于進(jìn)入Docker容器,但二者的區(qū)別主要有:
功能不同:docker run命令是用于啟動一個新的Docker容器并在其中運(yùn)行指定的命令,也可以進(jìn)行進(jìn)入容器的操作。而docker exec命令則是在已經(jīng)運(yùn)行的Docker容器中需要啟動一個新的命令或進(jìn)程。因此,在容器還未啟動的情況下只能使用docker run命令進(jìn)入容器。
進(jìn)入容器的方式不同:docker run命令進(jìn)入容器默認(rèn)是交互式Shell會話,需要輸入exit或按Ctrl+D退出容器。而docker exec命令默認(rèn)是在已經(jīng)運(yùn)行的容器內(nèi)執(zhí)行指定的命令,進(jìn)入容器后并不會自動啟動交互式Shell會話,如果需要可以使用-it選項來進(jìn)入交互式Shell會話。
容器的生命周期不同:docker run命令啟動的容器一旦退出,就會被刪除,所有在容器內(nèi)所保存的數(shù)據(jù)也會隨之丟失。而docker exec命令在已經(jīng)運(yùn)行的容器中啟動新的命令或進(jìn)程,與容器的生命周期無關(guān)。
總的來說,docker run命令主要用于啟動新的容器,docker exec命令主要用于操作或調(diào)試已經(jīng)在運(yùn)行的容器。
重新進(jìn)入docker attch 容器ID
二者的區(qū)別:
- attach直接進(jìn)入容器啟動命令的終端,不會啟動新的進(jìn)程,用exit退出會導(dǎo)致容器的停止
- exec是在容器中打開新的終端,并且可以啟動新的進(jìn)程用exit退出,不會導(dǎo)致容器的停止

我們用docker run 進(jìn)入ubuntu,然后ctrl+p+q退出之后,再次用run進(jìn)入后用exit退出之后發(fā)現(xiàn)還是up狀態(tài)存活,意思就是說,我們用exec所打開的心終端用exit退出不會停止容器,方便別人使用。而attach進(jìn)入后用exit退出會發(fā)現(xiàn)up狀態(tài)取消了,所以工作室建議用exec命令,退出容器終端不會導(dǎo)致容器停止。
從容器內(nèi)拷貝文件到主機(jī)上(容器—>主機(jī))

導(dǎo)入和導(dǎo)出容器
export導(dǎo)出容器的內(nèi)容流作為一個tar歸檔文件[對應(yīng)import命令]
import從tar包中的內(nèi)容創(chuàng)建一個新的文件系統(tǒng)再導(dǎo)入為鏡像[對應(yīng)export]
鏡像:是一種輕量級、可執(zhí)行的獨立軟件包。它包含運(yùn)行某個軟件所需的所有內(nèi)容,我們把應(yīng)用程序和配置依賴打包好形成一個可交付的運(yùn)行環(huán)境(包括代碼、運(yùn)行時需要的庫、環(huán)境變量和配置文件等),這個打包好的運(yùn)行環(huán)境就是image鏡像文件。
只有通過這個鏡像文件才能生成Docker的容器實例(類似于Java中new出來一個對象)。
Unions(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union文件系統(tǒng)是Docker鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像。鏡像分層最大的一個好處就是共享資源,方便復(fù)制遷移,就是為了復(fù)用。

對于一個精簡的OS,rootfs可以很小,只需要包括最基本的命令,工具和程序就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs就行了。由此可見對于不同的linux發(fā)行版,bootfs基本是一致的,rootfs會有差別,因此不同的發(fā)行版可以公用bootfs。
Docker鏡像層都是只讀的,容器層是可寫的。
當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱為“容器層”,“容器層”之下的都叫“鏡像層”。

docker之所以能夠做到體積如此之小,就是因為它只包含了linux內(nèi)核(最核心的部分),所以我們docker run -it Ubuntu /bin/bash運(yùn)行一個鏡像想要使用vim命令是用不了的(command not found),這個容器實例上沒有vim這個命令。因此我們就需要使用commit命令。
docker commit提交容器副本使之成為一個新的鏡像。
docker commit -m="提交的描述信息" -a="作者" 容器ID 要創(chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]。

更新完之后安裝一下vim命令就可以用了(外網(wǎng)聯(lián)通的情況下)

后續(xù)ps會發(fā)現(xiàn)有原生的Ubuntu,還多出了一個新的container ID是我們剛才加了vim的ID,可以看到原生的Ubuntu只有73mb,加了vim后又一百多mv,以前的base是原生的鏡像,而增加了其它的功能,就是在原生鏡像的基礎(chǔ)上增加的,類似于一個花卷一樣一層一層地堆疊增加。
在 Docker 中,Commit 和 Export 都可以創(chuàng)建一個 Docker 鏡像的備份,但是它們有著不同的作用和區(qū)別。
Commit:Commit 命令能夠?qū)⒁粋€正在運(yùn)行的容器轉(zhuǎn)換為一個新的鏡像。當(dāng)你在容器中新增一個文件或修改了某些配置的時候,如果這些修改比較重要,需要創(chuàng)建一個新的鏡像,可以使用 commit 命令來進(jìn)行。它會將當(dāng)前容器的狀態(tài)保存在一個鏡像中,可以用于其他容器的啟動。
使用 commit 命令的優(yōu)勢是可以快速創(chuàng)建鏡像,在調(diào)試期間非常有用,例如你在容器中進(jìn)行了多次修改,可以在每次修改后執(zhí)行一次 commit 命令,實現(xiàn)版本控制,以便在后續(xù)需要時回滾到某個狀態(tài)。
Export:Export 將 Docker 容器作為一個 .tar 文件導(dǎo)出到本地磁盤中。與 commit 不同,export 導(dǎo)出的是容器的文件系統(tǒng)和元數(shù)據(jù),不包括容器的狀態(tài)。你可以使用導(dǎo)出的文件在其他 Docker 環(huán)境中,或者通過 Dockerfile 構(gòu)建一個新的鏡像。
對于需要遷移 Docker 容器或備份 Docker 容器的場景,export 命令非常有用。它可以將容器的文件系統(tǒng)和數(shù)據(jù)導(dǎo)出到一個備份文件中,從而可以在其他 Docker 環(huán)境中重新構(gòu)建容器。
總的來說,Commit 是為了版本控制和快速創(chuàng)建新鏡像時使用的,Export 則是為了備份和遷移容器使用的。需要根據(jù)具體場景選擇不同的命令。

本地鏡像發(fā)布到阿里云
我們之前在docker原生(eg:docker1.0)的base上通過commit進(jìn)行了升級,升級之后的功能更加強(qiáng)大,我們希望將升級后的形成一個新的docker標(biāo)簽(eg:docker1.1)發(fā)布到阿里云上實現(xiàn)共享,使用push推送到阿里云上去,然后再pull拉回到本地,就可以復(fù)用我們的勞動成果,阿里云畢竟是公網(wǎng),為了保險起見,我們也可以建立私有庫,但總而言之,任何一個容器實例,我們加強(qiáng)后構(gòu)建成一個新的鏡像后可以推送到公網(wǎng)或私網(wǎng)再回到本地進(jìn)行使用,詳情如下圖所示:

注意事項:
- 輸入密碼時雖然光標(biāo)不變但實際會輸入密碼。
- 輸入的密碼為阿里云容器倉庫訪問憑證的密碼。
- 別用crt等工具,一定要用阿里云原生的鏈接工具執(zhí)行命令。

- 官方Docker Hub地址:https://hub.docker.com/,中國大陸訪問太慢了且準(zhǔn)備被阿里云取代的趨勢,不太主流。
- 我們推到阿里云上后是個人版,如果想要公用的話就需要企業(yè)版(充錢)。
- Dockerhub、阿里云這樣的公共鏡像倉庫可能不太方便,涉及機(jī)密的公司不可能提供鏡像給公網(wǎng),所以需要創(chuàng)建一個本地私人倉庫供給團(tuán)隊使用,基于公司內(nèi)部項目構(gòu)建鏡像。Docker Registry是官方提供的工具,用于構(gòu)建私有的個人經(jīng)先不管倉庫。
- 下載registry方式:docker pull registry。運(yùn)行方式如下圖所示:


在新的鏡像創(chuàng)建完成后,輸入docker run -it 62e7fed04e2c /bin/bash進(jìn)入我們的新升級后的鏡像再輸入ifconfig測試是否升級完成,接下來我們就可以將它放進(jìn)私服。
首先先curl驗證私服上有什么鏡像

由于我們沒有推送任何鏡像到私服庫,所以當(dāng)前為空。然后將新鏡像zzyyUbuntu:1.2修改符合私服規(guī)范的Tag。

然后我們要改一下docker下的daemon.json文件內(nèi)容(因為docker默認(rèn)不允許http方式推送鏡像,通過配置選項來取消這個限制):輸入vim /etc/docker/deamon.json進(jìn)入編輯內(nèi)容界面,在registry-mirror的下面加上一行“insecure-registries”:["192.168.111.162:5000"]
(修改后如果不生效就重新啟動一下docker,注意紅字部分前面要加一個逗號)
重啟(systemctl restart docker)之后將docker的registry私服庫再次運(yùn)行一遍(這一次run可能會報錯,可以嘗試使用start試試)。
接下來使用push將鏡像推送到私服庫:docker push ip+端口+名稱

第一次驗證時發(fā)現(xiàn)是空的,第二次我們驗證看一下結(jié)果,會發(fā)現(xiàn)從空變成了我們的名稱。
“privileged=true”是指在Docker中的容器中運(yùn)行一個特權(quán)進(jìn)程,以便獲得與主機(jī)操作系統(tǒng)相同的特權(quán)級別。在Docker中,默認(rèn)情況下,容器中的進(jìn)程是以非特權(quán)模式運(yùn)行的,因此它們不能訪問一些主機(jī)系統(tǒng)的特權(quán)操作、設(shè)備文件等。
將“privileged=true”標(biāo)志設(shè)置為容器表示啟用了容器中的進(jìn)程的特權(quán)模式,這樣它們可以像主機(jī)系統(tǒng)一樣執(zhí)行某些任務(wù),并且可以執(zhí)行特殊的內(nèi)核級別操作,例如打開主機(jī)設(shè)備草稿并編譯設(shè)備驅(qū)動程序等。
但是,需要注意的是,使用特權(quán)模式可能會帶來一些潛在的安全風(fēng)險,因為容器中的任何攻擊者都具有與主機(jī)相同的訪問級別。因此,在使用特權(quán)模式時,需要非常小心,并且只應(yīng)該在必要的情況下使用。
所以,老師提到的坑是指必須小心地使用“privileged=true”來確保不會引入安全風(fēng)險,而不是隨意地使用特權(quán)模式來訪問主機(jī)上的特權(quán)操作。

我們在筆記本電腦上存儲重要數(shù)據(jù)的時候會外置活動硬盤或?qū)?shù)據(jù)上環(huán)到阿里云盤等操作來保護(hù)數(shù)據(jù),到了docker容器上我們以數(shù)據(jù)卷的方式,完成數(shù)據(jù)的持久化,將數(shù)據(jù)映射目錄以后,完成重要數(shù)據(jù)的備份和持久化到本地主機(jī)目錄上。
卷就是目錄或文件,存在于一個或多個容器中,由docker掛載到容器,但不屬于聯(lián)合文件系統(tǒng)(不屬于容器內(nèi)的),因此能夠繞過Union File System提供一些用于持續(xù)存儲或共享數(shù)據(jù)的特征:卷的設(shè)計目的就是數(shù)據(jù)的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數(shù)據(jù)卷。(有點類似于我們Redis里的rab和aof文件),能夠解決將docker容器內(nèi)的數(shù)據(jù)保存進(jìn)宿主機(jī)的此版當(dāng)中的問題。
運(yùn)行一個帶有容器卷存儲功能的容器實例:docker run -it --privilege=true -v /宿主機(jī)絕對路徑目錄:/容器內(nèi)目錄 鏡像名

相比于我們之前學(xué)習(xí)的cp或export復(fù)制與導(dǎo)出,容器卷能夠?qū)崟r跟進(jìn)我們的進(jìn)程,要更加方便強(qiáng)大。
docker inspect 容器ID可以查詢到容器與哪個掛載(Mounts),這個v可以掛載多個。


安裝Tomcat
- 在docker hub上查看tomcat鏡像:docker search tomcat(我這里使用鏈接進(jìn)行的下載:使用以下鏈接中的其中一個代替您的下載鏈接:wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.53/bin/apache-tomcat-9.0.53.tar.gz)我們可以通過docker search tomcat來檢查是否安裝成功。
- 從docker hub上拉取tomcat鏡像到本地:docker pull tomcat
- 查看是否拉取到了tomcat:docker images tomcat
使用tomcat鏡像創(chuàng)建容器實例:docker run -it -p 8080:8080 tomcat(-p小寫:指定端口。-P大寫:隨機(jī)端口。-i:交互。-t:終端。-d:后臺)【使用-it
選項可能會導(dǎo)致容器啟動時圖形用戶界面無法加載。因此,建議使用-itd
選項,該選項表示以交互式、終端和守護(hù)進(jìn)程模式運(yùn)行容器。這樣做后,容器將在后臺運(yùn)行,并且可以使用docker attach <container-name>
命令重新進(jìn)入容器】
連接數(shù)據(jù)卷容器
容器連接
- 連接數(shù)據(jù)卷容器是使用docker run時加入?yún)?shù)-volumes-form CONTAINER,即可將數(shù)據(jù)卷容器中的數(shù)據(jù)卷掛載到新的容器中。
- 可以多次使用-volumes-form參數(shù)來瓜子啊多個數(shù)據(jù)卷容器。
容器連接
- 數(shù)據(jù)卷容器中的數(shù)據(jù)卷時集成的,例如容器B通過-volumes-from掛在了容器A中的/data數(shù)據(jù)卷,容器C通過-volumes-from掛載了容器A中的/data數(shù)據(jù)卷,容器C通過-volumes-from掛載了容器B,則容器C中也掛載了/data數(shù)據(jù)卷。
- 數(shù)據(jù)卷容器本身不需要啟動,掛載它的容器中也能掛載到所需的數(shù)據(jù)卷。
Docker常規(guī)安裝簡介
- 搜索鏡像
- 拉取鏡像
- 查看鏡像
- 啟動鏡像——-p服務(wù)端口映射
- 停止容器
- 移除容器
Dockerfile簡介
官網(wǎng):https://docs.docker.com/engine/reference/builder

dockerfile是用來構(gòu)建Docker鏡像的文本文件,是由一條條構(gòu)建鏡像所需的指令和參數(shù)構(gòu)成的腳本,讓鏡像一次成型。

我們的電腦上裝了docker實例,而dockerfile是獨立在外面的,假設(shè)我們run了一個Ubuntu實例,我們用commit來不斷地升級這個images,而dockerfile可以自己編寫寫好這個文件,構(gòu)建成一個新的鏡像,最終形成一個新的images。
構(gòu)建三步驟:
- 編寫dockerfile文件
- docker build命令構(gòu)建鏡像
- docker run依鏡像運(yùn)行容器實例
dockerfile內(nèi)容基礎(chǔ)知識:
- 每條保留字指令都必須大寫字母且后面要跟隨至少一個參數(shù)
- 指令按照從上到下按順序執(zhí)行。
- #表示注釋
- 每條指令都會創(chuàng)建一個新的鏡像層并對鏡像進(jìn)行提交
docker執(zhí)行dockerfile的大致流程:
- docker從基礎(chǔ)鏡像運(yùn)行一個容器(我們鏡像的源代碼就是我們的模板)
- 執(zhí)行一條指令并對容器作出修改(在dockerfile里進(jìn)行編排,就是將以前一個命令所做出的操作匯總成了一個文件,多個命令都匯聚到這個容器當(dāng)中)
- 執(zhí)行類似docker commit的操作提交一個新的鏡像層
- docker再基于剛提交的鏡像運(yùn)行一個新容器(層層疊層層)
- 執(zhí)行dockerfile中的嚇一條指令直到所有指令都執(zhí)行完成

- Dockerfile,需要定義一個Dockerfle,Dockerfile定義了進(jìn)程需要的一切東西。Dockerfile涉及的內(nèi)容包括執(zhí)行代碼或者是文件、環(huán)境變量、依賴包、運(yùn)行時環(huán)境、動態(tài)鏈接庫、操作系統(tǒng)的發(fā)行版、服務(wù)進(jìn)程和內(nèi)核進(jìn)程(當(dāng)應(yīng)用進(jìn)程需要和系統(tǒng)服務(wù)和內(nèi)核進(jìn)程打交道,這時需要考慮如何設(shè)計namespace的權(quán)限控制)等等。
- Dockerfile鏡像,再用Dockerfile定義了一個文件之后,docker bulid時會產(chǎn)生一個Docker鏡像,當(dāng)運(yùn)行Docker鏡像時會真正開始提供服務(wù)。
- Docker容器,容器是直接提供服務(wù)的。
環(huán)境變量
- 環(huán)境變量的作用:
- 環(huán)境變量是在操作系統(tǒng)中一個具有特定名字的對象,它包含了一個或者多個應(yīng)用程序所將使用到的信息。
- RUN,CMD,ENTRYPOINT等命令都可以使用環(huán)境變量。
- ENV命令用于定義環(huán)境變量的值,該值也可以引用已定義的環(huán)境變量。
- 操作系統(tǒng)內(nèi)部已經(jīng)定義好的環(huán)境變量可以在Dockerfile中直接使用
- 更靈活的環(huán)境變量設(shè)置
- 更靈活的環(huán)境變量配置:
- 如果一些環(huán)境變量的值容易發(fā)生改變,我們可能不希望總是修改Dockerfile,那么可以將這些環(huán)境變量的值的語句放在.bashrc和.profile等文件里,使用以下語句,在構(gòu)建時更新環(huán)境變量
- 如在.bashrc里加入export SERVER_IP=10.10.0.1;
- Dockerfile里寫入:
- COPY .bashrc ~/.bashrc
- RUN source ~/.bashrc && curl -sL http://$SERVER_IP/readme.txt
- 根據(jù)命令結(jié)果設(shè)置環(huán)境變量并永久保存:有一種需求是這樣的,在構(gòu)建鏡像時下載軟件,需要將軟件的版本號設(shè)置為環(huán)境變量,容器啟動時的程序需要調(diào)用到這個環(huán)境變量。因為構(gòu)建鏡像時軟件版本可能更新,此版本號不是固定值,需要使用命令解析。假如說命令curl -v --silent a.com/repos/files 2>& 1 | cut –c 15-能夠獲得版本號,則在Dockerfile如下寫法可以實現(xiàn)需求:RUN bash -l -c 'echo export VERSION="$(curl -v --silent a.com/repos/files 2>& 1 |????cut –c 15-)" >> /etc/.profile';
虛懸鏡像
虛懸鏡像是指沒有明確標(biāo)記或沒有被任何容器使用的Docker鏡像。這些鏡像占用著系統(tǒng)的存儲空間,同時也可能會引起鏡像命名沖突和漏洞等問題。本文將介紹如何了解并管理虛懸鏡像的過程。
查看虛懸鏡像
要查看系統(tǒng)中是否存在虛懸鏡像,可以使用以下命令:
docker images -f dangling=true
這個命令會羅列出所有沒有使用任何標(biāo)簽或者沒有被任何容器所引用的鏡像,即虛懸鏡像。
刪除虛懸鏡像
為了釋放系統(tǒng)的存儲空間和提高整個系統(tǒng)的安全性,需及時刪除虛懸鏡像??捎靡韵旅顒h除所有虛懸鏡像:
docker rmi $(docker images -f "dangling=true" -q)
此命令自動刪除所有未被引用的鏡像,釋放存儲空間。
防止產(chǎn)生虛懸鏡像
及時清理不再需要的鏡像,避免占用空間和引起別名沖突。
鏡像優(yōu)化
鏡像優(yōu)化原則:
- 如不加以注意并且優(yōu)化,鏡像的體積會越來越大
- 鏡像的優(yōu)化有以下原則:
- 尺寸盡量小
- 構(gòu)建速度盡量快
- 網(wǎng)絡(luò)訪問盡量快
精簡鏡像尺寸:
- 選擇體積最小的基礎(chǔ)鏡像可有效降低鏡像體積
- 構(gòu)建鏡像的過程中,當(dāng)dockerfile的指令執(zhí)行完成后,刪除鏡像不需要用的的文件。
- 在使用dockerfile構(gòu)建鏡像時,dockerfile中的每一條指令都會生成一個層,因此可以盡量合并dockerfile中可合并的指令,減少最終生成鏡像的層數(shù)。
精簡鏡像尺寸之多階段構(gòu)建:
在一個Dockerfile里使用多次FROM命令可以達(dá)成多階段構(gòu)建的效果
多階段構(gòu)建的使用場景是將編譯環(huán)境和運(yùn)行環(huán)境分離,比如,之前我們需要構(gòu)建一個Go語言程序,那么就需要用到go命令等編譯環(huán)境,但運(yùn)行時并不需要這些編譯環(huán)境,只需要運(yùn)行環(huán)境,則可以分兩個階段構(gòu)建,第一階段編譯,第二階段構(gòu)建運(yùn)行鏡像,最后生成的鏡像將不包含編譯環(huán)境:
# 編譯階段 命名為 builder?
FROM golang:1.10.3 as builder # ... 省略編譯步驟?
# 運(yùn)行階段?
FROM scratch?
# 從編譯階段的中拷貝編譯結(jié)果到當(dāng)前鏡像中?
COPY --from=builder /build/server /
提高網(wǎng)絡(luò)訪問速度:
- 使用國內(nèi)的源下載軟件包。
- 所有可下載的網(wǎng)站上,找訪問速度最快的。
- 如必須訪問國內(nèi)的網(wǎng)站,尋找速度最快的代理服務(wù)器。
其他優(yōu)化事項:
- 精簡鏡像用途,避免構(gòu)造大而復(fù)雜、多功能的鏡像;
- 在Dockerfile中提供注釋和維護(hù)者信息;
- 正確使用版本號,鏡像中使用到的軟件應(yīng)給出明確的版本號;
- Dockerfile中下載軟件時應(yīng)指明持久的下載地址,并帶有明確的版本號。?
Dockerfile保留字簡介:
Dockerfile是一種定義Docker鏡像的文本格式,并包含了一組Docker容器運(yùn)行的指令。Dockerfile保留字是在Dockerfile中定義的關(guān)鍵字或指令。在Dockerfile中使用這些指令,可以配置和構(gòu)建Docker鏡像。
以下是Dockerfile中的一些常見保留字:
- FROM:該指令從指定的基礎(chǔ)鏡像中創(chuàng)建一個新的鏡像。
- RUN:該指令在Docker容器內(nèi)部執(zhí)行指定的命令,并且記錄下鏡像的更改歷史。RUN指令可以包含shell腳本、shell命令、python代碼等。
- RUN命令可用于在鏡像中執(zhí)行任意合法shell命令并提交結(jié)果。
- RUN命令是創(chuàng)建Docker鏡像的步驟,RUN命令對Docker容器造成的改變是會被反映到創(chuàng)建的Docker鏡像上的。
- 一個Dockerfile中可以有許多個RUN命令,每一個RUN命令將生成一個新的鏡像。
- 根據(jù)命令結(jié)果設(shè)置環(huán)境變量并永久保存
- COPY:該指令將主機(jī)上的文件或目錄復(fù)制到容器內(nèi)部的指定目錄。
- WORKDIR:該指令設(shè)置容器的工作目錄,所有后續(xù)的指令都在該目錄下執(zhí)行。
- WORKDIR <path>
- WORKDIR指令為Dockerfile中的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD指令設(shè)置工作目錄。
- 如果WORKDIR不存在,即使在后續(xù)的Dockerfile指令中不使用它,也會創(chuàng)建它。
- WORKDIR指令可以在Dockerfile中多次使用。
- 如WORKDIR指定的是一個相對路徑,它將相對于前面的WORKDIR指令的路徑。
- EXPOSE:該指令聲明容器將在運(yùn)行時使用的端口。
- EXPOSE <端口1> [<端口2>...]。
- EXPOSE 指令的作用是聲明運(yùn)行時容器提供服務(wù)端口。這只是一個聲明,在運(yùn)行時并不會因為這個聲明應(yīng)用就會開啟這個端口的服務(wù)。
- 運(yùn)行容器時使用命令docker run -P時,會自動將容器上EXPOSE 聲明的端口映射到宿主機(jī)上隨機(jī)的端口。
- 若需指定將容器的端口映射到宿主機(jī)指定端口,請在運(yùn)行容器時使用命令docker run –p <宿主機(jī)端口>:<容器端口>
- ENV:該指令在容器內(nèi)設(shè)置環(huán)境變量。
- ENV <環(huán)境變量名>=<變量值>
- ENV指令用于定義鏡像的環(huán)境變量,被定義的環(huán)境變量在后續(xù)層次的鏡像中和啟動的容器中能夠被以“$環(huán)境變量名”的方式使用
- 變量值中可以引用已經(jīng)定義的環(huán)境變量。以下環(huán)境變量可以直接引用:
- HOME,用戶主目錄
- HOSTNAME,默認(rèn)容器的主機(jī)名
- PATH,可執(zhí)行文件查找路徑列表
- TERM,默認(rèn)xterm
- ARG:該指令用于在構(gòu)建(build)鏡像時設(shè)置變量。
- ARG <name>[=<default value>]
- ARG指令用來定義構(gòu)建時需要的參數(shù),這些參數(shù)在docker build命令中以--build-arg <name>=<value>形式賦值
- 如下參數(shù)可以直接使用:
- HTTP_PROXY 和 http_proxy
- HTTPS_PROXY 和 https_proxy
- FTP_PROXY 和 ftp_proxy
- NO_PROXY 和 no_proxy
- VOLUME:該指令聲明容器卷,并為容器卷分配位置。
- USER:該指令在容器中設(shè)置運(yùn)行容器進(jìn)程的用戶名或UID。
- USER <user>[:<group>]
- USER <UID>[:<GID>]
- USER指令設(shè)置用戶名(或UID)以及可選的用戶組(或GID),以便在運(yùn)行映像時以及Dockerfile中跟隨它的任何RUN,CMD和ENTRYPOINT指令時使用。
- 在docker run 中可以通過 -u 選項來覆蓋USER指令的設(shè)置。
- 不指定USER時,默認(rèn)用戶為root;USER不指定group時,默認(rèn)組為root。
- 使用root以外用戶或組時,請先用RUN命令創(chuàng)建。
- CMD:該指令提供了容器的默認(rèn)命令。它可以在Dockerfile中指定或者在啟動容器時通過docker run命令進(jìn)行覆蓋。

這些保留字并不是Dockerfile中的全部指令,但它們是使用最為廣泛的指令之一,每個Dockerfile都應(yīng)該包含其中的一些。使用這些Dockerfile保留字,Docker用戶可根據(jù)自己的需要和應(yīng)用程序的特點,定義和配置自己的Docker鏡像。
原生網(wǎng)絡(luò)
docker安裝時會自動在host上創(chuàng)建三種網(wǎng)絡(luò)(bridge、host、none),可以用docker network ls命令查看,除此之外還有container網(wǎng)絡(luò)模式,及自定義網(wǎng)絡(luò)。

- none網(wǎng)絡(luò):none網(wǎng)絡(luò)就是什么都沒有的網(wǎng)絡(luò)。掛在這個網(wǎng)絡(luò)下的容器除了lo,沒有其他任何網(wǎng)卡,創(chuàng)建容器時,可以通過--network=none指定使用none網(wǎng)絡(luò)。
- none網(wǎng)絡(luò)的應(yīng)用:
- 一些安全性要求高并且不需要聯(lián)網(wǎng)的應(yīng)用可以使用none網(wǎng)絡(luò)。
- 比如某個容器的唯一用途是生成隨機(jī)密碼,就可以放到none網(wǎng)絡(luò)中避免密碼被竊取。
- 使用none網(wǎng)絡(luò)的容器只能夠通過數(shù)據(jù)卷和外界交互。
- host網(wǎng)絡(luò):連接host網(wǎng)絡(luò)的容器共享主機(jī)的網(wǎng)卡,容器的網(wǎng)絡(luò)配置與宿主機(jī)完全一樣。可以通過--network=host指定host網(wǎng)絡(luò)。
- host網(wǎng)絡(luò)的應(yīng)用:
- host網(wǎng)絡(luò)最大的好處就是性能,如果容器對網(wǎng)絡(luò)傳輸有較高要求,則可以選擇host網(wǎng)絡(luò)。當(dāng)然不便之處就是犧牲一些靈活性,比如要考慮端口沖突,宿主機(jī)上已經(jīng)使用的端口不能再用了。
- host網(wǎng)絡(luò)的另一個用途是讓容器可以直接配置host網(wǎng)絡(luò)。比如某些跨主機(jī)的網(wǎng)絡(luò)解決方案,各主機(jī)上的應(yīng)用以容器方式運(yùn)行的時候。
- bridge網(wǎng)絡(luò):bridge網(wǎng)絡(luò)又名橋接網(wǎng)絡(luò),在該網(wǎng)絡(luò)模式中,宿主機(jī)上提供一個網(wǎng)關(guān),其他同一網(wǎng)絡(luò)的容器連接到網(wǎng)關(guān),共同組織一個局域網(wǎng)。docker安裝時會創(chuàng)建一個命名為docker0的缺省網(wǎng)關(guān)。啟動容器時不指定network的容器將會以docker0為網(wǎng)關(guān)。安裝bridge-utils后使用brctl show命令可查看所有網(wǎng)關(guān)。
- bridge網(wǎng)絡(luò)可以讓容器之間互相組建局域網(wǎng),擁有自己的虛擬網(wǎng)卡,但只是有一個虛擬網(wǎng)關(guān)因此適合比較小型的容器網(wǎng)絡(luò)。
- 自定義網(wǎng)絡(luò)(實例)
- docker提供三種用戶自定義網(wǎng)絡(luò)驅(qū)動:bridge、overlay和macvian。
- bridge網(wǎng)絡(luò)與自帶的bridge網(wǎng)絡(luò)類似,只是用戶可以自己創(chuàng)建網(wǎng)關(guān)。
- overlay和mavaian用于創(chuàng)建跨主機(jī)的網(wǎng)絡(luò)。
- 具體實例如下:我們可以通過bridge驅(qū)動創(chuàng)建類似前面默認(rèn)的bridge網(wǎng)絡(luò):

這是創(chuàng)建 Docker 網(wǎng)絡(luò)的命令,其中 sudo 表示以超級管理員身份運(yùn)行命令,docker 是 Docker 的 CLI 工具,network create 是創(chuàng)建網(wǎng)絡(luò)的命令,--driver bridge 指定了網(wǎng)絡(luò)驅(qū)動類型為 bridge(Docker 默認(rèn)使用的網(wǎng)絡(luò)驅(qū)動),mini 是網(wǎng)絡(luò)名,可以根據(jù)需要自行指定。
使用這個命令創(chuàng)建網(wǎng)絡(luò)后,可以讓在同一網(wǎng)絡(luò)下的 Docker 容器互相通信,實現(xiàn)更靈活高效的應(yīng)用程序部署和管理。例如,可以在同一網(wǎng)絡(luò)下運(yùn)行不同的容器,它們可以通過指定容器名稱來相互訪問和通信,實現(xiàn)協(xié)同工作和數(shù)據(jù)共享等功能。
可以用brctl show查看新創(chuàng)建的網(wǎng)關(guān)

這是在 Docker 中運(yùn)行 BusyBox 容器的命令,并將容器連接到名為 mini2 的網(wǎng)絡(luò)中。其中 sudo 表示以超級管理員身份運(yùn)行命令,docker 是 Docker 的 CLI 工具,run 指啟動一個新的容器, -it 則啟用交互式 shell, --network=mini2 指定了網(wǎng)絡(luò),便讓新容器加入到這個網(wǎng)絡(luò)下。
啟動容器后,會進(jìn)入 BusyBox 的 shell 環(huán)境,可以在這個環(huán)境下運(yùn)行各種命令,例如 ls、ping 等,進(jìn)行測試或調(diào)試操作。同時,通過網(wǎng)絡(luò)連接,這個容器也可以與其他網(wǎng)絡(luò)中的容器和主機(jī)進(jìn)行通信,實現(xiàn)更復(fù)雜的應(yīng)用程序部署和管理。

如需要配置容器的靜態(tài)IP,如果創(chuàng)建網(wǎng)關(guān)時指定了--subent參數(shù),即可通過在啟動容器時指定參數(shù)--ip來設(shè)定靜態(tài)IP。

container網(wǎng)絡(luò):新建的容器和已存在的一個容器共享一個網(wǎng)絡(luò)ip配置而不是和宿主機(jī)共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。同樣,兩個容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。(倆嘴共用一個習(xí)慣喝同一杯奶茶:容器A借用容器B的網(wǎng)絡(luò)實現(xiàn)功能)

Alpine Linux 是一款獨立的、非商業(yè)的通用 Linux 發(fā)行版,專為追求安全性、簡單性和資源效率的用戶而設(shè)計。 可能很多人沒聽說過這Linux 發(fā)行版本,但是經(jīng)常用 Docker 的朋友可能都用過,因為他小,簡單,安全而著稱,所以作為基礎(chǔ)鏡像是非常好的一個選擇,麻雀雖小五臟俱全,鏡像非常小巧,不到6M的大小,所以特別適合容器打包。

自定義網(wǎng)絡(luò)(docker容器內(nèi)部的ip是可以發(fā)生改變的):

曾經(jīng)用的是docker link,但這個功能在不久將會被移除,因此就不被用了。那么兩個問題:
- 沒用前是怎樣的效果:?網(wǎng)段按照服務(wù)名是ping不通的75_docker network之自定義網(wǎng)絡(luò)上集 P75 - 02:26?
- 用了后是怎樣的效果:
- 自定義橋接網(wǎng)絡(luò)(默認(rèn)使用的橋接網(wǎng)絡(luò)是bridge)
- 新建自定義網(wǎng)絡(luò)(docker network network_name)
- 新建容器加入上一步新建的自定義網(wǎng)絡(luò):?77_docker network之自定義網(wǎng)絡(luò)下集 P77 - 01:27?
- 互相ping測試:自定義網(wǎng)絡(luò)就維護(hù)好了主機(jī)名和ip的對應(yīng)關(guān)系(ip和域名都能通)
Docker輕量級可視化工具——portainer
portainer是一款輕量級的應(yīng)用,它提供了圖形化界面,用于方便地管理Docker環(huán)境,包括單擊環(huán)境和集群(更建議用k8s)環(huán)境。
安裝方式:
- 官網(wǎng)
- https://www.portainer.io/
- https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux
- 步驟

docker run除了可以掛多個v容器數(shù)據(jù)卷,也可以搞多個p端口映射。--restart=always代表如果整個docker重啟了,這個容器也可以重啟,保證實時在線,實時監(jiān)控。如下圖所示:我們加了--restart=always之后的容器實例沒有像u1一樣因為重啟而掛掉。

- docker命令安裝
- 的第一次登錄需創(chuàng)建admin,訪問地址:xxx.xxx.xxx.xxx:9000(xxx是主機(jī)ip地址,用戶名就用默認(rèn)的admin即可)
- 設(shè)置admin用戶和密碼后首次登錄
- 選擇local選項卡后本地docker詳細(xì)信息展示,

Dashboard(儀表盤)盤點我們的家底,有多少鏡像、容器等。圖像化顯示了有多少個容器(containers)、多少個鏡像(images)、多少個容器卷(volumes)、多少個網(wǎng)絡(luò)(network),而第一個Stack意思是有幾組編排的容器。左邊的events是事件的意思,日志操作。host是主機(jī)的基本情況。
以上的圖形化命令我們可以通過命令:docker system df查看。
CIG(容器重量級監(jiān)控系統(tǒng))是一款由百度開發(fā)的開源容器監(jiān)控和分析工具。它可以幫助用戶監(jiān)控Docker容器的性能、資源使用情況和應(yīng)用程序的運(yùn)行情況。CIG提供了圖形化的儀表盤和報告,使得用戶可以隨時了解應(yīng)用程序和容器的狀態(tài),并對其進(jìn)行分析和優(yōu)化。
CIG的主要組件包括cAdvisor、Prometheus、Grafana和Alertmanager。其中,cAdvisor是由Google開發(fā)的輕量級容器監(jiān)控工具,用于收集Docker容器的性能指標(biāo)和資源使用情況;Prometheus是一種開源的引擎,用于處理和存儲時間序列數(shù)據(jù),也是CIG的核心組件之一;Grafana是一種開源的靈活的儀表盤和監(jiān)控平臺,使用戶可以創(chuàng)建和共享實時數(shù)據(jù)可視化,并且提供了多種插件和數(shù)據(jù)源擴(kuò)展;Alertmanager是一種開源的警報管理工具,負(fù)責(zé)接收警報并將其轉(zhuǎn)發(fā)到用戶定義的接收端。
CIG是一種非常流行的Docker容器監(jiān)控系統(tǒng),它可以幫助用戶監(jiān)控容器的性能和資源使用情況,同時也提供了其他有用的特性。在使用Docker Compose搭建CIG監(jiān)控平臺的過程中,需要注意對Prometheus和Alertmanager進(jìn)行適當(dāng)?shù)呐渲靡员阕屗鼈兡軌蛘9ぷ?。Grafana是CIG的核心。
CIG配置監(jiān)控業(yè)務(wù)規(guī)則
在學(xué)習(xí)CIG配置監(jiān)控業(yè)務(wù)規(guī)則的過程中,需要注意以下幾個關(guān)鍵環(huán)節(jié):
定義需求:在設(shè)置業(yè)務(wù)規(guī)則之前,需要明確業(yè)務(wù)規(guī)則的目的和需要檢查的內(nèi)容。例如,需要檢查某個服務(wù)是否正常運(yùn)行或特定設(shè)備的狀態(tài)是否正常等。
確定規(guī)則類型:CIG支持多種類型的業(yè)務(wù)規(guī)則,包括簡單規(guī)則、復(fù)合規(guī)則、計算規(guī)則和自定義規(guī)則等。根據(jù)需求選擇適合的規(guī)則類型。
編寫規(guī)則腳本:根據(jù)需求和規(guī)則類型編寫規(guī)則腳本。規(guī)則腳本中應(yīng)包括規(guī)則名稱、檢查條件、動作以及其他必要的元素。腳本應(yīng)該經(jīng)過驗證和測試,確保其能夠正確地檢查和報警。
設(shè)置規(guī)則匹配條件:定義規(guī)則的匹配條件,以確保規(guī)則只適用于特定的服務(wù)器或設(shè)備,避免出現(xiàn)誤報和漏報等情況。
測試規(guī)則:在應(yīng)用規(guī)則之前,需要對規(guī)則進(jìn)行測試和驗證,確保規(guī)則的準(zhǔn)確性和有效性??梢酝ㄟ^模擬特定的故障或問題進(jìn)行測試并檢查CIG是否能夠正確地檢測到和報告這些問題。
應(yīng)用規(guī)則:當(dāng)規(guī)則已經(jīng)通過測試和驗證后,將規(guī)則應(yīng)用于監(jiān)控系統(tǒng)。在應(yīng)用規(guī)則之后,需要進(jìn)行定期維護(hù)和更新,以確保規(guī)則的持續(xù)有效性。