Docker基礎入門:常規軟件安裝與鏡像加載原理
- 一、Docker常規軟件安裝
- 1.1、部署nginx
- 1.2、部署tomcat
- 1.3、部署elasticsearch
- 1.4、如何部署kibana-->連接elasticsearch
- 1.5、部署可視化工具
- 二、 鏡像加載原理
- 2.1、鏡像是什么
- 2.2、Docker鏡像加速原理
- 2.3、分層理解
💖The Begin💖點點關注,收藏不迷路💖 |
一、Docker常規軟件安裝
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、運行nginx,8011為容器外部端口,80端口為容器內部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、進入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#
本地訪問8011測試:
[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配置文件,都需要進入容器內部十分麻煩,------》引入數據卷,通過路徑映射,在容器外部即可修改。
1.2、部署tomcat
1、下載tomcat
### --rm 用完即刪(一般用來測試)
docker run -it --rm tomcat:9.0###(這里使用這個)
docker pull tomcat:9.02、運行tomcat參數說明:
-p 小寫 主機端口:容器端口
-P 大寫 隨機分配端口
i 交互
t 終端
d 后臺docker run -d -p 8012:8080 --name=mytomcat tomcat
原因tomcat默認是最小的鏡像,有的文件被刪除了。保證最小運行環境。
解決:
1、進入容器
[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#
測試訪問:
? 思考:部署項目,每次進入容器內部,是不是很麻煩?------》引入數據卷,通過路徑映射,在容器外部即可修改。
1.3、部署elasticsearch
? 思考:
es暴露端口多
es內存占用大
es的數據一般要放置到安全目錄(掛載)
——————怎么解決?
1、下載、啟動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、查看當前運行的鏡像
[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、查看當前cpu使用情況(50%)
docker status
4、測試訪問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、增加內存限制(-e ES_JAVA_OPTS="-Xms64m -Xmx512m"),最低占用64m內存,最高占用512m內存。[root@zyl-server ~]# docker stop 89b955d50f2f
89b955d50f2f
[root@zyl-server ~]# 6、再次運行
[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、再次查看內存
[root@zyl-server ~]# docker stats
1.4、如何部署kibana–>連接elasticsearch
1.5、部署可視化工具
1、portainer(使用這個)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer2、Rancher(CI/CD、持續部署、集成時再用這個)
什么是portainer ?
portainer 是 Docker的圖形化界面管理工具!提供一個后臺面板供我們操作!
1、啟動運行[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、訪問測試:http://192.168.234.10:8088
二、 鏡像加載原理
2.1、鏡像是什么
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基于運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時、庫、環境變量和配置文件。
所有的應用,直接打包docker鏡像,就可以直接跑起來!
如何得到鏡像:
從遠程倉庫下載
朋友拷貝給你
自己制作一個鏡像DockerFile
2.2、Docker鏡像加速原理
UnionFS(聯合文件系統)
我們下載的時候看到的一層層就是這個!
UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union 文件系統是Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。
Docker鏡像加載原型
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導加載kernel,Linux剛啟動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之后整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系統中的/dev,/proc,/bin,/etc等標準目錄和文件。
rootfs就是各種不同的操作系統發行版,比如Ubuntu,Centos等等。
平時我們安裝進虛擬機的CentOS都是好幾個G,為什么Docker這里才200M?
對于一個精簡的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs就可以了。
由此可見對于不同的linux發行版,bootfs基本是一致的,rootfs會有差別,因此不同的發行版可以公用bootfs。
(虛擬機是分鐘級,容器是秒級!)
2.3、分層理解
分層的鏡像
我們可以去下載一個鏡像,注意觀察下載的日志輸出,可以看到是一層一層的在下載!
思考:為什么Docker鏡像要采用這種分層的結構呢?
最大的好處,我覺得莫過于是資源共享了!比如有多個鏡像都從相同的Base鏡像構建而來,那么宿主機只需在磁盤上保留一份base鏡像,同時內存中也只需要加載一份base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。
查看鏡像分層的方式可以通過 docker image inspect命令!
[root@zyl-server ~]# docker image inspect tomcat:9.0
所有的Docker 鏡像都起始于一個基礎鏡像層,當進行修改或增加新的內容時,就會在當前鏡像層之上,創建新的鏡像層。
舉一個簡單的例子,假如基于Ubuntu Linux 16.04創建一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會在基礎鏡像層之上創建第二個鏡像層;如果繼續添加一個安全補丁,就會創建第三個鏡像層。
、
該鏡像當前已經包含3個鏡像層,如下圖所示(這只是一個用于演示的很簡單的例子)。
在添加額外的鏡像層的同時,鏡像始終保持是當前所有鏡像的組合,理解這一點非常重要。下圖中舉了一個簡單的例子,每個鏡像層包含3個文件,而鏡像包含了來自兩個鏡像層的6個文件。
上圖中的鏡像層跟之前圖中的略有區別,主要目的是便于展示文件。
下圖中展示了一個稍微復雜的三層鏡像,在外部看來整個鏡像只有6個文件,這是因為最上層中的文件7是文件5的一個更新版本。
這種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個新鏡像層添加到鏡像當中。
Docker通過存儲引擎(新版本采用快照機制)的方式來實現鏡像層堆棧,并保證多鏡像層對外展示為統一的文件系統。
Linux上可用的存儲引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基于Linux中對應的文件系統或者塊設備技術,并且每種存儲引擎都有其獨有的性能特點。
Docker在Windows 上僅支持 windowsfilter一種存儲引擎,該引擎基于NTFS文件系統之上實現了分層和CoW[1]。
下圖展示了與系統顯示相同的三層鏡像。所有鏡像層堆疊并合并,對外提供統一的視圖。
特點:
Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部!
這一層就是我們通常說的容器層,容器之下的都叫鏡像層!
💖The End💖點點關注,收藏不迷路💖 |