Docker概述
Docker為什么出現(xiàn)?
一款產(chǎn)品: 開發(fā)–上線 兩套環(huán)境!應(yīng)用環(huán)境,應(yīng)用配置!
開發(fā) — 運維。 問題:我在我的電腦上可以允許!版本更新,導(dǎo)致服務(wù)不可用!對于運維來說考驗十分大?
環(huán)境配置是十分的麻煩,每一個及其都要部署環(huán)境(集群Redis、ES、Hadoop…) !費事費力。
發(fā)布一個項目( jar + (Redis MySQL JDK ES) ),項目能不能帶上環(huán)境安裝打包!
之前在服務(wù)器配置一個應(yīng)用的環(huán)境 Redis MySQL JDK ES Hadoop 配置超麻煩了,不能夠跨平臺。
開發(fā)環(huán)境Windows,最后發(fā)布到Linux!
傳統(tǒng):開發(fā)jar,運維來做!
現(xiàn)在:開發(fā)打包部署上線,一套流程做完!
安卓流程:java — apk —發(fā)布(應(yīng)用商店)一 張三使用apk一安裝即可用!
docker流程: java-jar(環(huán)境) — 打包項目帯上環(huán)境(鏡像) — ( Docker倉庫:商店)-----
Docker給以上的問題,提出了解決方案!
比較Docker和虛擬機技術(shù)的不同:
傳統(tǒng)虛擬機,虛擬出一條硬件,運行一個完整的操作系統(tǒng),然后在這個系統(tǒng)上安裝和運行軟件
容器內(nèi)的應(yīng)用直接運行在宿主機的內(nèi)容,容器是沒有自己的內(nèi)核的,也沒有虛擬我們的硬件,所以就輕便了
每個容器間是互相隔離,每個容器內(nèi)都有一個屬于自己的文件系統(tǒng),互不影響
————————————————--------------------------------------------------------------
1.卸載舊版本
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
2.需要的安裝包
yum install -y yum-utils
3.設(shè)置鏡像的倉庫
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
默認(rèn)是從國外的,不推薦
推薦使用國內(nèi)的
yum-config-manager
--add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum軟件包索引
yum makecache fast
4.安裝docker相關(guān)的 docker-ce 社區(qū)版 而ee是企業(yè)版
yum install docker-ce docker-ce-cli containerd.io
5.啟動Docker
systemctl start docker
6. 使用docker version查看是否按照成功
docker version
Client: Docker Engine - Community
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:46:54 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:45:28 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
7. 測試
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
8.查看鏡像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 6 months ago 13.3kB
1. 卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
2. 刪除資源
rm -rf /var/lib/docker
/var/lib/docker 是docker的默認(rèn)工作路徑!
9.容器鏡像服務(wù)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9forgyc2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
為什么Docker比Vm快
1、docker有著比虛擬機更少的抽象層。由于docker不需要Hypervisor實現(xiàn)硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU、內(nèi)存利用率上docker將會在效率上有明顯優(yōu)勢。
2、docker利用的是宿主機的內(nèi)核,而不需要Guest OS。
GuestOS: VM(虛擬機)里的的系統(tǒng)(OS);
HostOS:物理機里的系統(tǒng)(OS);
image.png
因此,當(dāng)新建一個 容器時,docker不需要和虛擬機一樣重新加載一個操作系統(tǒng)內(nèi)核。仍而避免引導(dǎo)、加載操作系統(tǒng)內(nèi)核返個比較費時費資源的過程,當(dāng)新建一個虛擬機時,虛擬機軟件需要加載GuestOS,返個新建過程是分鐘級別的。而docker由于直接利用宿主機的操作系統(tǒng),則省略了這個復(fù)雜的過程,因此新建一個docker容器只需要幾秒鐘。
什么是portainer?
Docker圖形化界面管理工具!提供一個后臺面板供我們操作!
docker run -d -p 8088:9000
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Docker鏡像講解
鏡像是什么
鏡像是一種輕量級、可執(zhí)行的獨立軟件保,用來打包軟件運行環(huán)境和基于運行環(huán)境開發(fā)的軟件,他包含運行某個軟件所需的所有內(nèi)容,包括代碼、運行時庫、環(huán)境變量和配置文件。
所有的應(yīng)用,直接打包docker鏡像,就可以直接跑起來!
如何得到鏡像:
1.從倉庫
2.自己制作鏡像DockerFile
Docker鏡像加載原理
UnionFs (聯(lián)合文件系統(tǒng))
UnionFs(聯(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)行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像
特性:一次同時加載多個文件系統(tǒng),但從外面看起來,只能看到一個文件系統(tǒng),聯(lián)合加載會把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會包含所有底層的文件和目錄
Docker鏡像加載原理
docker的鏡像實際上由一層一層的文件系統(tǒng)組成,這種層級的文件系統(tǒng)UnionFS。
boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引導(dǎo)加 kernel, Linux剛啟動時會加bootfs文件系統(tǒng),在 Docker鏡像的最底層是 boots。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當(dāng)boot加載完成之后整個內(nèi)核就都在內(nèi)存中了,此時內(nèi)存的使用權(quán)已由 bootfs轉(zhuǎn)交給內(nèi)核,此時系統(tǒng)也會卸載bootfs。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件。 rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如 Ubuntu, Centos等等。

平時我們安裝進(jìn)虛擬機的CentOS都是好幾個G,為什么Docker這里才200M?

對于個精簡的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs就可以了。由此可見對于不同的Linux發(fā)行版, boots基本是一致的, rootfs會有差別,因此不同的發(fā)行版可以公用bootfs.
虛擬機是分鐘級別,容器是秒級!
分層理解
分層的鏡像

思考:為什么Docker鏡像要采用這種分層的結(jié)構(gòu)呢?
最大的好處,我覺得莫過于資源共享了!比如有多個鏡像都從相同的Base鏡像構(gòu)建而來,那么宿主機只需在磁盤上保留一份base鏡像,同時內(nèi)存中也只需要加載一份base鏡像,這樣就可以為所有的容器服務(wù)了,而且鏡像的每一層都可以被共享。
查看鏡像分層的方式可以通過docker image inspect 命令
理解:
所有的 Docker鏡像都起始于一個基礎(chǔ)鏡像層,當(dāng)進(jìn)行修改或培加新的內(nèi)容時,就會在當(dāng)前鏡像層之上,創(chuàng)建新的鏡像層。
舉一個簡單的例子,假如基于 Ubuntu Linux16.04創(chuàng)建一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包,

在添加額外的鏡像層的同時,鏡像始終保持是當(dāng)前所有鏡像的組合,理解這一點非常重要。下圖中舉了一個簡單的例子,每個鏡像層包含3個文件,而鏡像包含了來自兩個鏡像層的6個文件。

上圖中的鏡像層跟之前圖中的略有區(qū)別,主要目的是便于展示文件
下圖中展示了一個稍微復(fù)雜的三層鏡像,在外部看來整個鏡像只有6個文件,這是因為最上層中的文件7是文件5的一個更新版

文種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個新鏡像層添加到鏡像當(dāng)中
Docker通過存儲引擎(新版本采用快照機制)的方式來實現(xiàn)鏡像層堆棧,并保證多鏡像層對外展示為統(tǒng)一的文件系統(tǒng)
Linux上可用的存儲引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基于 Linux中對應(yīng)的
件系統(tǒng)或者塊設(shè)備技術(shù),井且每種存儲引擎都有其獨有的性能特點。
Docker在 Windows上僅支持 windowsfilter 一種存儲引擎,該引擎基于NTFS文件系統(tǒng)之上實現(xiàn)了分層和CoW [1]。
下圖展示了與系統(tǒng)顯示相同的三層鏡像。所有鏡像層堆并合井,對外提供統(tǒng)一的視圖

這一層就是我們通常說的容器層,容器之下的都叫鏡像層!特點
Docker 鏡像都是只讀的,當(dāng)容器啟動時,一個新的可寫層加載到鏡像的頂部!



