Docker入門

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ù)

image.png

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

image.png

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等等。


image.png

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


image.png

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

虛擬機是分鐘級別,容器是秒級!

分層理解

分層的鏡像

image.png

思考:為什么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包,

就會在基礎(chǔ)鏡像層之上創(chuàng)建第二個鏡像層;如果繼續(xù)添加一個安全補丁,就會創(chuàng)健第三個鏡像層該像當(dāng)前已經(jīng)包含3個鏡像層,如下圖所示(這只是一個用于演示的很簡單的例子)。
23B391599E76A994081124D1C180F724.png

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

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


image.png

文種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個新鏡像層添加到鏡像當(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)一的視圖


image.png

特點
Docker 鏡像都是只讀的,當(dāng)容器啟動時,一個新的可寫層加載到鏡像的頂部!

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

image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容