Docker基礎入門:常規軟件安裝與鏡像加載原理

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💖點點關注,收藏不迷路💖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么我的集群一個 Spark Executor / Yarn Container 只分配一個vCore?

在很多集群里,在關閉了Spark的DynamicAllocation的前提下(避免自動申請空閑資源,干擾測試結果),都會觀察到:提交Spark作業時,申請 1 個 driver + n 個 executor 會在Yarn上對應創建 n+1 個 container,但是每個container只有一個vCore,通過--driver-cores和--executor-…

Grafana Prometheus 通過JMX監控kafka 【2023最新方式】

第三方kafka exporter方案 目前網上關于使用Prometheus 監控kafka的大部分資料都是使用一個第三方的 kafka exporter&#xff0c;他的原理大概就是啟動一個kafka客戶端&#xff0c;獲取kafka服務器的信息&#xff0c;然后提供一些metric接口供Prometheus使用&#xff0c;隨意它…

docker 安裝mysql8.0

1、拉取鏡像 docker pull mysql2、運行鏡像 docker run -d --restartalways --name mysql --privilegedtrue -p 3306:3306 -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/logs…

07_Hudi案例實戰、Flink CDC 實時數據采集、Presto、FineBI 報表可視化等

7.第七章 Hudi案例實戰 7.1 案例架構 7.2 業務數據 7.2.1 客戶信息表 7.2.2 客戶意向表 7.2.3 客戶線索表 7.2.4 線索申訴表 7.2.5 客戶訪問咨詢記錄表 7.3 Flink CDC 實時數據采集 7.3.1 開啟MySQL binlog 7.3.2 環境準備 7.3.3 實時采集數據 7.3.3.1 客戶信息表 7.3.3.2 客戶…

ubuntu安裝jdk、emqx、nginx

一、安裝jdk 要在Ubuntu上安裝JDK 1.8&#xff0c;您可以按照以下步驟進行操作&#xff1a; 打開終端&#xff08;CtrlAltT&#xff09;。確保您的系統已更新&#xff1a; sudo apt update sudo apt upgrade安裝OpenJDK 8&#xff1a; sudo apt install openjdk-8-jdk安裝完成…

.net core發布到IIS上出現 HTTP 錯誤 500.19

1.檢查.net core 環境運行環境是否安裝完成&#xff0c;類似如下環境 2.IIS是否安裝全 本次原因就是IIS未安裝全導致的 按照網上說的手動重啟iis&#xff08;iisreset&#xff09;也不行

基于C#的消息處理的應用程序 - 開源研究系列文章

今天講講基于C#里的基于消息處理的應用程序的一個例子。 我們知道&#xff0c;Windows操作系統的程序是基于消息處理的。也就是說&#xff0c;程序接收到消息代碼定義&#xff0c;然后根據消息代碼定義去處理對應的操作。前面有一個博文例子( C#程序的啟動顯示方案(無窗口進程發…

【數據結構】 ArrayList簡介與實戰

文章目錄 什么是ArrayListArrayList相關說明 ArrayList使用ArrayList的構造無參構造指定順序表初始容量利用其他 Collection 構建 ArrayListArrayList常見操作獲取list有效元素個數獲取和設置index位置上的元素在list的index位置插入指定元素刪除指定元素刪除list中index位置上…

機器學習基礎(二)

線性回歸 誤差是獨立并且具有相同的分布通常認為服從均值為0方差為的高斯分布。 損失函數(loss Function)/代價函數(Cost Function) 其實兩種叫法都可以,損失函數(loss function)或代價函數(cost function)是將隨機事件或其有關隨機變量的取值映射為非負實數以表示該隨…

Android開發之性能優化:過渡繪制解決方案

1. 過渡繪制 屏幕上某一像素點在一幀中被重復繪制多次&#xff0c;就是過渡繪制。 下圖中多個卡片跌在一起&#xff0c;但是只有第一個卡片是完全可見的。背后的卡片只有部分可見。但是Android系統在繪制時會將下層的卡片進行繪制&#xff0c;接著再將上層的卡片進行繪制。但其…

springcloud3 hystrix實現服務降級的案例配置2

一 服務降級的說明 1.1 服務降級說明 "服務器忙&#xff0c;請稍后在試"不讓客戶達等待&#xff0c;立即返回一個友好的提示。 1.2 服務降級的觸發情況 1.程序運行異常&#xff1b; 2.超時&#xff1b; 3.服務熔斷觸發服務降級&#xff1b;4 .線程池/信號量打…

電商增強現實3D模型優化需要關注的4個方面

到目前為止&#xff0c;AR技術已經發展到足以在更廣泛的范圍內實施。 在電子商務中&#xff0c;這項技術有望提供更令人興奮的購物體驗。 為了實現這一目標&#xff0c;在這篇博客中&#xff0c;我將介紹如何針對電子商務中的 AR 優化 3D 模型。 推薦&#xff1a;用 NSDT編輯器…

Python 函數

Built-in Functions — Python 3.11.4 documentation

Transformer(二)(VIT,TNT)(基于視覺CV)

目錄 1.視覺中的Attention 2.VIT框架&#xff08;圖像分類&#xff0c;不需要decoder&#xff09; 2.1整體框架 2.2.CNN和Transformer遇到的問題 2.3.1CNN 2.3.2Transformer 2.3.3二者對比 2.4.公式理解 3TNT 參考文獻 1.視覺中的Attention 對于人類而言看到一幅圖可以立…

區塊鏈系統探索之路:私鑰的壓縮和WIF格式詳解

在前面章節中&#xff0c;我們詳細介紹了公鑰的壓縮&#xff0c;在比特幣網絡中&#xff0c;一個私鑰可以對應兩個地址&#xff0c;一個地址是由未壓縮公鑰所生成的地址&#xff0c;另一個就是由壓縮公鑰所創建的地址&#xff0c;從公鑰到區塊鏈地址的轉換算法&#xff0c;我們…

【設計模式——學習筆記】23種設計模式——解釋器模式Interpreter(原理講解+應用場景介紹+案例介紹+Java代碼實現)

案例引入 通過解釋器模式來實現四則運算&#xff0c;如計算ab-c的值&#xff0c;具體要求 先輸入表達式的形式&#xff0c;比如abc-de&#xff0c;要求表達式的字母不能重復在分別輸入a,b,c,d,e的值最后求出結果 傳統方案 編寫一個方法&#xff0c;接收表達式的形式&#xf…

基于Pan-Tompkins的實時QRS檢測算法:便攜式ANSI-C實現深入解析

引言 隨著醫學工程和移動設備技術的進步&#xff0c;實時QRS檢測算法在心電圖分析中變得越來越重要。其中&#xff0c;Pan-Tompkins算法由于其高效性和準確度&#xff0c;在許多應用中都受到廣泛認可。本文將深入探討此算法的ANSI-C實現&#xff0c;并提供詳細的代碼實例。 1…

【kubernetes】配置資源管理

目錄 Secret 創建 Secret 1、用kubectl create secret命令創建Secret 2、內容用 base64 編碼&#xff0c;創建Secret 使用方式 1、將 Secret 掛載到 Volume 中&#xff0c;以 Volume 的形式掛載到 Pod 的某個目錄下 2、將 Secret 導出到環境變量中 ConfigMap 創建 Co…

請解釋一下CSS中的rem和em單位有什么不同,分別如何使用?

聚沙成塔每天進步一點點 ? 專欄簡介? CSS中的rem和em單位的區別和使用? em單位使用示例&#xff1a; ? rem 單位使用示例&#xff1a; ? 區別和適用場景? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何…

Nginx常見的三個漏洞

目錄 $uri導致的CRLF注入漏洞 兩種常見場景 表示uri的三個變量 案例 目錄穿越漏洞 案例 Http Header被覆蓋的問題 案例 $uri導致的CRLF注入漏洞 兩種常見場景 用戶訪問http://example.com/aabbcc&#xff0c;自動跳轉到https://example.com/aabbcc 用戶訪問http://exa…