天天看點

Docker-初見

目錄

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-初見

Docker的思想就來源于集裝箱 container ,現在的是隔離的思想,将所有的東西打包裝箱,每個container都是互相隔離的,為了讓完全不同的東西能放在同一個環境中運作,通過鏡像或稱為容器,Docker通過隔離機制,能将伺服器利用到極緻。

Docker基于Go語言開發的!開源項目!

Docker官網:https://www.docker.com/

文檔:https://docs.docker.com/ Docker的文檔是超級詳細的!

倉庫:https://hub.docker.com/

以前的虛拟技術

1、 資源占用十分多

2、 備援步驟多

3、 啟動很慢!

Docker-初見

容器化技術

容器化技術不是模拟一個完整的作業系統 ,比較Docker和虛拟機技術的不同:

傳統虛拟機,虛拟出一條硬體,運作一個完整的作業系統,然後在這個系統上安裝和運作軟體。

容器内的應用直接運作在主控端的内容,容器是沒有自己的核心的,也沒有虛拟我們的硬體,是以就輕便了。

每個容器間是互相隔離,每個容器内都有一個屬于自己的檔案系統,互不影響。

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容器技術,也是一種虛拟化技術!

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是怎麼工作的?

Docker是一個Client-Server結構的系統,Docker的守護程序運作在主機上。通過Socket從用戶端通路!

Docker-Server接收到Docker-Client的指令,就會執行這個指令!

Docker-初見

為什麼Docker比Vm快?

Docker有着比虛拟機更少的抽象層。由于Docker不需要Hypervisor實作硬體資源虛拟化,運作在Docker容器上的程式直接使用的都是實際實體機的硬體資源。是以在CPU、記憶體使用率上Docker将會在效率上有明顯優勢。

Docker利用的是主控端的核心,而不需要Guest OS( VM(虛拟機)裡的的系統(OS) )。

Docker-初見

啟動和停止容器的操作

docker start 容器id #啟動容器

docker restart 容器id #重新開機容器

docker stop 容器id #停止目前正在運作的容器

docker kill 容器id #強制停止目前容器

主控端端口 和 容器内部端口 以及端口暴露:

Docker-初見

指令大全

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-初見

分層了解

我們可以去下載下傳一個鏡像,注意觀察下載下傳的日志輸出,可以看到是一層層的在下載下傳

思考:為什麼Docker鏡像要采用這種分層的結構呢?

最大的好處,我覺得莫過于資源共享了!比如有多個鏡像都從相同的Base鏡像建構而來,那麼主控端隻需在磁盤上保留一份Base鏡像,同時記憶體中也隻需要加載一份Base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。

檢視鏡像分層的方式可以通過docker image inspect 指令

了解

所有的 Docker鏡像都起始于一個基礎鏡像層,當進行修改或培加新的内容時,就會在目前鏡像層之上,建立新的鏡像層。

舉一個簡單的例子,假如基于 Ubuntu Linux16.04建立一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包,就會在基礎鏡像層之上建立第二個鏡像層;如果繼續添加一個安全更新檔,就會創健第三個鏡像層該像目前已經包含3個鏡像層,如下圖所示(這隻是一個用于示範的很簡單的例子)。

Docker-初見

在添加額外的鏡像層的同時,鏡像始終保持是目前所有鏡像的組合,了解這一點。

Docker-初見

上圖中的鏡像層跟之前圖中的略有區別,主要目的是便于展示檔案。

下圖中展示了一個稍微複雜的三層鏡像,在外部看來整個鏡像隻有6個檔案,這是因為最上層中的檔案7是檔案5的一個更新版。

Docker-初見

這種情況下,上層鏡像層中的檔案覆寫了底層鏡像層中的檔案。這樣就使得檔案的更新版本作為一個新鏡像層添加到鏡像當中。

Docker通過存儲引擎(新版本采用快照機制)的方式來實作鏡像層堆棧,并保證多鏡像層對外展示為統一的檔案系統。

Linux上可用的存儲引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基于 Linux中對應的檔案系統或者塊裝置技術,井且每種存儲引擎都有其獨有的性能特點。

Docker在 Windows上僅支援 windowsfilter 一種存儲引擎,該引擎基于NTFS檔案系統之上實作了分層和CoW 。

下圖展示了與系統顯示相同的三層鏡像。所有鏡像層堆并合井,對外提供統一的視圖。

Docker-初見

特點

Docker 鏡像都是隻讀的,當容器啟動時,一個新的可寫層加載到鏡像的頂部!

這一層就是我們通常說的容器層,容器之下的都叫鏡像層!

Docker-初見

什麼是容器資料卷?

将應用和環境打包成一個鏡像!資料?如果資料都在容器中,那麼我們容器删除,資料就會丢失!需求:資料可以持久化。MySQL,容器删除了,删庫跑路!需求:MySQL資料可以存儲在本地!容器之間可以有一個資料共享的技術!Docker容器中産生的資料,同步到本地!這就是卷技術!目錄的挂載,将我們容器内的目錄,挂載到Linux上面!

總結一句話:容器的持久化和同步操作!容器間也是可以資料共享的!

使用資料卷

方式一 :直接使用指令挂載 -v

具名和匿名挂載

資料卷容器

多個MySQL同步資料,命名的容器挂載資料卷。

Docker-初見

多個mysql實作資料共享

結論

容器之間的配置資訊的傳遞,資料卷容器的生命周期一直持續到沒有容器使用為止。

但是一旦你持久化到了本地,這個時候,本地的資料是不會删除的!

Dockerfile 就是用來建構Docker鏡像的建構檔案!

通過這個腳本可以生成鏡像,鏡像是一層一層的,腳本是一個個的指令,每個指令都是一層!

Dockerfile是用來建構Docker鏡像的檔案,指令參數腳本。

建構步驟:

1、 編寫一個Dockerfile檔案

2、 docker build 建構稱為一個鏡像

3、 docker run運作鏡像

4、 docker push釋出鏡像(DockerHub 、阿裡雲倉庫)

DockerFile建構過程

基礎知識:

1、每個保留關鍵字(指令)都是必須是大寫字母

2、執行從上到下順序

3、表示注釋

4、每一個指令都會建立送出一個新的鏡像曾,并送出!

Docker-初見

Dockerfile是面向開發的,我們以後要釋出項目,做鏡像,就需要編寫Dockerfile檔案,這個檔案十分簡單!

Docker鏡像逐漸成企業傳遞的标準,必須要掌握!

DockerFile:建構檔案,定義了一切的步驟,源代碼

DockerImages:通過DockerFile建構生成的鏡像,最終釋出和運作産品。

Docker容器:容器就是鏡像運作起來提供服務。

DockerFile的指令

原理:

我們每啟動一個Docker容器,docker就會給docker容器配置設定一 個ip,我們隻要安裝了Docker,就會有一一個網卡docker0

橋接模式,使用的技術是evth-pair(就是一對虛拟的裝置接口,都是成對出現,一個連着協定,一個彼此連接配接)技術。

就是說Docker使用的是Linux裡面的橋接技術。

Docker-初見

自定義網絡,不适用docker0,docker0問題:不支援容器名連接配接通路。

網絡模式

bridge :橋接 docker(預設,自己建立也是用bridge模式)

none :不配置網絡,一般不用

host :和所主機共享網絡

container :容器網絡連通(用得少!局限很大)

我們自定義的網絡Docker當我們維護好了對應的關系,推薦我們平時這樣使用網絡, 不同的叢集使用不同的網絡,保證叢集是安全和健康的。

假設要跨網絡操作别人,就需要使用docker network connect 連通。

Docker-初見

建構SpringBoot項目

打包運作

編寫dockerfile

建構鏡像

以後我們使用了Docker之後,給别人傳遞就是一個鏡像即可。

Docker-初見
上一篇: Java-NIO