網(wǎng)站創(chuàng)作情感營(yíng)銷(xiāo)
Docker基礎(chǔ)入門(mén):常規(guī)軟件安裝與鏡像加載原理
- 一、Docker常規(guī)軟件安裝
- 1.1、部署nginx
- 1.2、部署tomcat
- 1.3、部署elasticsearch
- 1.4、如何部署kibana-->連接elasticsearch
- 1.5、部署可視化工具
- 二、 鏡像加載原理
- 2.1、鏡像是什么
- 2.2、Docker鏡像加速原理
- 2.3、分層理解
💖The Begin💖點(diǎn)點(diǎn)關(guān)注,收藏不迷路💖 |
一、Docker常規(guī)軟件安裝
1.1、部署nginx
1、拉取nginx鏡像
[root@zyl-server ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@zyl-server ~]# 2、查看鏡像
[root@zyl-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.234.10:5000/centos 1.2 d0a52e21dd65 20 hours ago 231MB
centos 1.2 d0a52e21dd65 20 hours ago 231MB
nginx latest 605c77e624dd 19 months ago 141MB
registry.cn-hangzhou.aliyuncs.com/zhaohaibao/centos 7.9 5d0da3dc9764 23 months ago 231MB
[root@zyl-server ~]# 3、運(yùn)行nginx,8011為容器外部端口,80端口為容器內(nèi)部nginx的端口
[root@zyl-server ~]# docker run -d --name=mynginx -p 8011:80 nginx
926fd257ed887f86894e1fb3b99c2f5edda141e9fdd92c04de3255fd2b1b4973
[root@zyl-server ~]# [root@zyl-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
926fd257ed88 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8011->80/tcp, :::8011->80/tcp mynginx
[root@zyl-server ~]# 4、進(jìn)入nginx容器
[root@zyl-server ~]# docker exec -it mynginx /bin/bash
root@926fd257ed88:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@926fd257ed88:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@926fd257ed88:/# cd /etc/nginx/
root@926fd257ed88:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@926fd257ed88:/etc/nginx#
root@926fd257ed88:/etc/nginx#
本地訪(fǎng)問(wèn)8011測(cè)試:
[root@zyl-server ~]# curl localhost:8011
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@zyl-server ~]#
? 思考:每次修改nginx配置文件,都需要進(jìn)入容器內(nèi)部十分麻煩,------》引入數(shù)據(jù)卷,通過(guò)路徑映射,在容器外部即可修改。
1.2、部署tomcat
1、下載tomcat
### --rm 用完即刪(一般用來(lái)測(cè)試)
docker run -it --rm tomcat:9.0###(這里使用這個(gè))
docker pull tomcat:9.02、運(yùn)行tomcat參數(shù)說(shuō)明:
-p 小寫(xiě) 主機(jī)端口:容器端口
-P 大寫(xiě) 隨機(jī)分配端口
i 交互
t 終端
d 后臺(tái)docker run -d -p 8012:8080 --name=mytomcat tomcat
原因tomcat默認(rèn)是最小的鏡像,有的文件被刪除了。保證最小運(yùn)行環(huán)境。
解決:
1、進(jìn)入容器
[root@zyl-server ~]# docker exec -it mytomcat /bin/bash
root@f8e5b8f57b2b:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@f8e5b8f57b2b:/usr/local/tomcat# cd webapps
root@f8e5b8f57b2b:/usr/local/tomcat/webapps# ls
root@f8e5b8f57b2b:/usr/local/tomcat/webapps# 2、拷貝webapps.dist下的文件到webapps
root@f8e5b8f57b2b:/usr/local/tomcat# cp -r webapps.dist/* webapps/
root@f8e5b8f57b2b:/usr/local/tomcat#
測(cè)試訪(fǎng)問(wèn):
? 思考:部署項(xiàng)目,每次進(jìn)入容器內(nèi)部,是不是很麻煩?------》引入數(shù)據(jù)卷,通過(guò)路徑映射,在容器外部即可修改。
1.3、部署elasticsearch
? 思考:
es暴露端口多
es內(nèi)存占用大
es的數(shù)據(jù)一般要放置到安全目錄(掛載)
——————怎么解決?
1、下載、啟動(dòng)elasticsearch
[root@zyl-server ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
Unable to find image 'elasticsearch:7.6.2' locally
7.6.2: Pulling from library/elasticsearch
ab5ef0e58194: Pull complete
c4d1ca5c8a25: Pull complete
941a3cc8e7b8: Pull complete
43ec483d9618: Pull complete
c486fd200684: Pull complete
1b960df074b2: Pull complete
1719d48d6823: Pull complete
Digest: sha256:1b09dbd93085a1e7bca34830e77d2981521a7210e11f11eda997add1c12711fa
Status: Downloaded newer image for elasticsearch:7.6.2
89b955d50f2fd130d2e19e4048d30a8c38c6beb1023552be2af0c49b6fbf59512、查看當(dāng)前運(yùn)行的鏡像
[root@zyl-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89b955d50f2f elasticsearch:7.6.2 "/usr/local/bin/dock…" 7 seconds ago Up 6 seconds 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch
f8e5b8f57b2b tomcat "catalina.sh run" 20 minutes ago Up 20 minutes 0.0.0.0:8012->8080/tcp, :::8012->8080/tcp mytomcat
926fd257ed88 nginx "/docker-entrypoint.…" 57 minutes ago Up 57 minutes 0.0.0.0:8011->80/tcp, :::8011->80/tcp mynginx
[root@zyl-server ~]# 3、查看當(dāng)前cpu使用情況(50%)
docker status
4、測(cè)試訪(fǎng)問(wèn)elasticsearch
[root@zyl-server ~]# curl localhost:9200
{"name" : "89b955d50f2f","cluster_name" : "docker-cluster","cluster_uuid" : "pJGBGgBpTOSEqmbG0uMUdg","version" : {"number" : "7.6.2","build_flavor" : "default","build_type" : "docker","build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f","build_date" : "2020-03-26T06:34:37.794943Z","build_snapshot" : false,"lucene_version" : "8.4.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}
[root@zyl-server ~]# 5、停止elasticsearch、增加內(nèi)存限制(-e ES_JAVA_OPTS="-Xms64m -Xmx512m"),最低占用64m內(nèi)存,最高占用512m內(nèi)存。[root@zyl-server ~]# docker stop 89b955d50f2f
89b955d50f2f
[root@zyl-server ~]# 6、再次運(yùn)行
[root@zyl-server ~]# docker run -d --name myelasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.27、再次查看內(nèi)存
[root@zyl-server ~]# docker stats
1.4、如何部署kibana–>連接elasticsearch
1.5、部署可視化工具
1、portainer(使用這個(gè))
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer2、Rancher(CI/CD、持續(xù)部署、集成時(shí)再用這個(gè))
什么是portainer ?
portainer 是 Docker的圖形化界面管理工具!提供一個(gè)后臺(tái)面板供我們操作!
1、啟動(dòng)運(yùn)行[root@zyl-server ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete
49d59ee0881a: Pull complete
a2300fd28637: Pull complete
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
99974acec5857c8559b5230e5c76063a82346a0e986780582ea6a40a7f62628c
[root@zyl-server ~]# 2、訪(fǎng)問(wèn)測(cè)試:http://192.168.234.10:8088
二、 鏡像加載原理
2.1、鏡像是什么
鏡像是一種輕量級(jí)、可執(zhí)行的獨(dú)立軟件包,用來(lái)打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開(kāi)發(fā)的軟件,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,包括代碼、運(yùn)行時(shí)、庫(kù)、環(huán)境變量和配置文件。
所有的應(yīng)用,直接打包docker鏡像,就可以直接跑起來(lái)!
如何得到鏡像:
從遠(yuǎn)程倉(cāng)庫(kù)下載
朋友拷貝給你
自己制作一個(gè)鏡像DockerFile
2.2、Docker鏡像加速原理
UnionFS(聯(lián)合文件系統(tǒng))
我們下載的時(shí)候看到的一層層就是這個(gè)!
UnionFS(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFS)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union 文件系統(tǒng)是Docker 鏡像的基礎(chǔ)。鏡像可以通過(guò)分層來(lái)進(jìn)行繼承,基于基礎(chǔ)鏡像(沒(méi)有父鏡像),可以制作各種具體的應(yīng)用鏡像。
特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來(lái),只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來(lái),這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄。
Docker鏡像加載原型
docker的鏡像實(shí)際上由一層一層的文件系統(tǒng)組成,這種層級(jí)的文件系統(tǒng)UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導(dǎo)加載kernel,Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件。
rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu,Centos等等。
平時(shí)我們安裝進(jìn)虛擬機(jī)的CentOS都是好幾個(gè)G,為什么Docker這里才200M?
對(duì)于一個(gè)精簡(jiǎn)的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序庫(kù)就可以了,因?yàn)榈讓又苯佑肏ost的kernel,自己只需要提供rootfs就可以了。
由此可見(jiàn)對(duì)于不同的linux發(fā)行版,bootfs基本是一致的,rootfs會(huì)有差別,因此不同的發(fā)行版可以公用bootfs。
(虛擬機(jī)是分鐘級(jí),容器是秒級(jí)!)
2.3、分層理解
分層的鏡像
我們可以去下載一個(gè)鏡像,注意觀(guān)察下載的日志輸出,可以看到是一層一層的在下載!
思考:為什么Docker鏡像要采用這種分層的結(jié)構(gòu)呢?
最大的好處,我覺(jué)得莫過(guò)于是資源共享了!比如有多個(gè)鏡像都從相同的Base鏡像構(gòu)建而來(lái),那么宿主機(jī)只需在磁盤(pán)上保留一份base鏡像,同時(shí)內(nèi)存中也只需要加載一份base鏡像,這樣就可以為所有的容器服務(wù)了,而且鏡像的每一層都可以被共享。
查看鏡像分層的方式可以通過(guò) docker image inspect命令!
[root@zyl-server ~]# docker image inspect tomcat:9.0
所有的Docker 鏡像都起始于一個(gè)基礎(chǔ)鏡像層,當(dāng)進(jìn)行修改或增加新的內(nèi)容時(shí),就會(huì)在當(dāng)前鏡像層之上,創(chuàng)建新的鏡像層。
舉一個(gè)簡(jiǎn)單的例子,假如基于Ubuntu Linux 16.04創(chuàng)建一個(gè)新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會(huì)在基礎(chǔ)鏡像層之上創(chuàng)建第二個(gè)鏡像層;如果繼續(xù)添加一個(gè)安全補(bǔ)丁,就會(huì)創(chuàng)建第三個(gè)鏡像層。
、
該鏡像當(dāng)前已經(jīng)包含3個(gè)鏡像層,如下圖所示(這只是一個(gè)用于演示的很簡(jiǎn)單的例子)。
在添加額外的鏡像層的同時(shí),鏡像始終保持是當(dāng)前所有鏡像的組合,理解這一點(diǎn)非常重要。下圖中舉了一個(gè)簡(jiǎn)單的例子,每個(gè)鏡像層包含3個(gè)文件,而鏡像包含了來(lái)自?xún)蓚€(gè)鏡像層的6個(gè)文件。
上圖中的鏡像層跟之前圖中的略有區(qū)別,主要目的是便于展示文件。
下圖中展示了一個(gè)稍微復(fù)雜的三層鏡像,在外部看來(lái)整個(gè)鏡像只有6個(gè)文件,這是因?yàn)樽钌蠈又械奈募?是文件5的一個(gè)更新版本。
這種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個(gè)新鏡像層添加到鏡像當(dāng)中。
Docker通過(guò)存儲(chǔ)引擎(新版本采用快照機(jī)制)的方式來(lái)實(shí)現(xiàn)鏡像層堆棧,并保證多鏡像層對(duì)外展示為統(tǒng)一的文件系統(tǒng)。
Linux上可用的存儲(chǔ)引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲(chǔ)引擎都基于Linux中對(duì)應(yīng)的文件系統(tǒng)或者塊設(shè)備技術(shù),并且每種存儲(chǔ)引擎都有其獨(dú)有的性能特點(diǎn)。
Docker在Windows 上僅支持 windowsfilter一種存儲(chǔ)引擎,該引擎基于NTFS文件系統(tǒng)之上實(shí)現(xiàn)了分層和CoW[1]。
下圖展示了與系統(tǒng)顯示相同的三層鏡像。所有鏡像層堆疊并合并,對(duì)外提供統(tǒng)一的視圖。
特點(diǎn):
Docker鏡像都是只讀的,當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫(xiě)層被加載到鏡像的頂部!
這一層就是我們通常說(shuō)的容器層,容器之下的都叫鏡像層!
💖The End💖點(diǎn)點(diǎn)關(guān)注,收藏不迷路💖 |