微服務學習|初識Docker、使用Docker、自定義鏡像、DockerCompose、Docker鏡像倉庫

初識Docker

項目部署的問題

大型項目組件較多,運行環境也較為復雜,部署時會碰到一些問題

依賴關系復雜,容易出現兼容性問題

開發、測試、生產環境有差異

Docker如何解決依賴的兼容問題的?

將應用的Libs (函數庫)、Deps (依賴)配置與應用一起打包

將每個應用放到一個隔離容器去運行,避免互相干擾

內核與硬件交互,提供操作硬件的指令,系統應用封裝內核指令為函數,便于程序員調用用戶程序基于系統函數庫實現功能

Ubuntu和Centos都是基于Linux內核,只是系統應用不同,提供的函數庫有差異

Docker如何解決不同系統環境的問題?

Docker將用戶程序與所需要調用的系統(比如Ubuntu)函數庫一起打包

Docker運行到不同操作系統時,直接基于打包的庫函數,借助于操作系統的Linux內核來運行

Docker如何解決大型項目依賴關系復雜,不同組件依賴的兼容性問題?

Docker允許開發中將應用、依賴、函數庫、配置一起打包,形成可移植鏡像

Docker應用運行在容器中,使用沙箱機制,相互隔離

Docker如何解決開發、測試、生產環境有差異的問題?

Docker鏡像中包含完整運行環境,包括系統函數庫,僅依賴系統的Linux內
核,因此可以在任意Linux操作系統上運行

總結

Docker是一個快速交付應用、運行應用的技術:
1.可以將程序及其依賴、運行環境一起打包為一個鏡像可以遷移到任意Linux操作系統
2.運行時利用沙箱機制形成隔離容器,各個應用互不干擾
3.啟動、移除都可以通過一行命令完成,方便快捷

Docker與虛擬機

虛擬機(virtual machine)是在操作系統中模擬硬件設備,然后運行另一個操作系統,比如在 Windows 系統里面運行Ubuntu 系統,這樣就可以運行任意的Ubuntu應用了

Docker和虛擬機的差異:

docker是一個系統進程;虛擬機是在操作系統中的操作系統
docker體積小、啟動速度快、性能好;虛擬機體積大、啟動速度慢、性能一般

鏡像和容器

鏡像(lmage):Docker將應用程序及其所需的依賴、函數庫、環境、配置等文件打包在一起,稱為鏡像.
容器(Container):鏡像中的應用程序運行后形成的進程就是容器,只是Docker會給容器做隔離,對外不可見。

Docker和DockerHub

DockerHub: DockerHub是一個Docker鏡像的托管平臺。這樣的平臺稱為Docker Registry。國內也有類似于DockerHub 的公開服務,比如 網易云鏡像服務、阿里云鏡像庫等

docker架構

Docker是一個CS架構的程序,由兩部分組成:
服務端(server): Docker守護進程,負責處理Docker指令,管理鏡像、容器等

客戶端(client): 通過命令或RetAPI向Docker服務端發送指令。可以在本地或遠程向服務端發送指令

安裝Docker

企業部署一般都是采用Linux操作系統,而其中又數CentOs發行版占比最多,因此我們在entOS下安裝Docker。

Docker 分為 CE和EE 兩大版本。CE 即社區版(免費,支持周期7個月),EE 即企業版強調安全,付費使用,支持周期 24 個月。
Docker CE分為 stable test 和nightly 三個更新頻道
官方網站上有各種環境下的安裝指南,這里主要介紹 Docker CE在Centos上的安裝

Docker CE 支持64 位版本 Centos7,并且要求內核版本不低于 3.10,Centos 7 滿足最低內核的要求,所以我們在Centos 7安裝Docker。

如果之前安裝過舊版本的Docker,可以使用下面命令卸載:

首先需要大家虛擬機聯網,安裝yum工具

然后更新本地鏡像源

然后輸入命令

啟動docker

Docker應用需要用到各種端口,逐一去修改防火墻設置。非常麻煩,因此建議大家直接關閉防火墻!
啟動docker前,一定要關閉防火墻后!!
啟動docker前,一定要關閉防火墻后!!
啟動docker前,一定要關閉防火墻后!!

通過命令啟動docker

然后輸入命令,可以查看docker版本:

先敲入關閉防火墻的命令,再查看防火墻狀態,確認為dead,然后敲入啟動docker命令,啟動docker

啟動docker后,可敲入查看docker狀態指令查看其狀態是否為運行狀態

配置鏡像

docker官方鏡像倉庫網速較差,我們需要設置國內鏡像

配置鏡像加速器
針對Docker客戶端版本大于 1.10.0 的用戶
您可以通過修改daemon配置文件 /etc/docker/daemon.json 來使用加速器

使用Docker

鏡像相關命令

鏡像名稱一般分兩部分組成:[repository]:[tag]
在沒有指定tag時,默認是latest,代表最新版本的鏡像

鏡像操作命令

案例:從DockerHub中拉取一個nginx鏡像并查看

1.首先去鏡像倉庫搜索nginx鏡像,比如DackerHub:

2.根據查看到的鏡像名稱,拉取自己需要的鏡像

docker pull nginx命令,從DackerHub拉取nginx鏡像,并且默認tag版本為latest

3.通過命令: docker images 查看拉取到的鏡像

案例:利用docker save將nginx鏡像導出磁盤,然后再通過load加載回來

docker save --help 查看該命令的語法,然后將nginx鏡像保存為一個名為nginx.tar的壓縮包,ll命令可查看當前目錄的文件信息,發現nginx.tar已經被創建好。

先將docker中已經存在的nginx鏡像刪除,然后再查看docker中鏡像,發現目前已經沒有nginx鏡像了

將原本的nginx鏡像刪除后,再用docker load -i nginx.tar命令,把nginx.tar壓縮包加載為nginx鏡像,再docker images命令查看docker中的鏡像,發現nginx鏡像又被創建了出來。

容器相關命令

案例:創建運行一個Nginx容器

去docker hub查看Nginx的容器運行命令

docker run --name containerName -p 80:80 -d nginx 查找到該命令后,對該命令進行解讀

運行該命令創建nginx容器并命名為mn,docker ps 查看當前所有運行中的容器及其狀態

該mn容器在啟動中,我們訪問該宿主機ip以及對應的端口

nginx可以訪問到,說明容器成功運行

docker logs mn命令,我們可以查看mn容器的運行日志

docker logs -f mn,可持續的查看日志

案例:進入Nginx容器,修改HTML文件內容,添加“傳智教育歡迎您”

1.進入容器。進入我們剛剛創建的nginx容器的命令為

在DackerHub查到nginx鏡像中,html的位置

2.進入nginx的HTML所在目錄 /usr/share/nginx/html

3.修改indexhtml的內容

修改后,再次訪問宿主機ip以及對應端口,發現頁面已經更改

數據卷

容器與數據耦合的問題

數據卷(volume)是一個虛擬目錄,指向宿主機文件系統中的某個目錄。

數據卷操作的基本語法如下:

上一個案例,我們先docker volume create html命令在docker中創建一個html的數據卷,并docker volume ls命令查看是否創建好

docker volume inspect html命令可查看該數據卷綁定的具體位置

數據卷的作用:

將容器與數據分離,解耦合,方便操作容器內數據,保證數據安全

掛載數據卷

我們在創建容器時,可以通過-v參數來掛載一個數據卷到某個容器目錄

案例:創建一個nginx容器,修改容器內的html目錄內的index.html內容

需求說明:上個案例中,我們進入nginx容器內部,已經知道nginx的html目錄所在位置usr/share/nginx/html,我們需要把這個目錄掛載到html這個數據卷上,方便操作其中的內容

1.創建容器并掛載數據卷到容器內的HTML目錄

2.進入html數據卷所在位置,并修改HTML內容

查詢html數據卷的信息,查找到該數據卷實際的位置,在宿主機直接進入到該文件目錄,使用vscode等高級的編輯器直接打開要修改的頁面文件進行修改

修改保存后,再次訪問該宿主機ip以及該容器的端口,發現以及修改成功

案例:創建并運行一個MySOL容器,將宿主機目錄直接掛載到容器

將mysql.tar壓縮文件加載為鏡像

docker images 查看所有鏡像,發現mysql鏡像已經被創建

創建data和conf目錄,并將提前準備的hmy.cnf放到conf目錄下

在DackerHub上查看配置文件conf在mysql鏡像中的位置,方便我們一會將我們本地自己創建的那個conf目錄掛載到這個位置

將我們本地自己創建的data目錄掛載和自己創建的conf目錄下的hmy.cnf文件都掛載到mysql鏡像中對應的位置,執行下面的創建mysql容器命令

執行該命令創建mysql容器

docker ps命令查看當前所有啟動的容器,發現mysql容器已經被創建

此時,我們打開我們本地自己創建的data目錄,因為其已經掛載到了mysql容器中對應位置的data目錄,所以此時容器內的data目錄內容已經出現在了我們自己本地創建的data目錄中。對這些內容操作即是對容器的的目錄內容進行操作。

數據卷掛載的方式對比

掛載數據卷我們不知道具體的本地文件位置,但是不麻煩,掛載自己創建的文件目錄與文件雖然麻煩些,但是可以自定義具體的位置。數據卷掛載耦合度低,由docker來管理目錄,但是
目錄較深,不好找。目錄掛載耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看。

自定義鏡像

鏡像結構

鏡像是分層結構,每一層稱為一個Layer

什么是Dockerfile

Dockerfile就是一個文本文件,其中包含一個個的指令(Instruction),用指令來說明要執行什么操作來構建鏡像。每一個指令都會形成一層Layer。

案例:基于Ubuntu鏡像構建一個新鏡像,運行一個java項目

Dockerfile文件內容

創間一個docker-demo文件夾并進入

將提前準備好的項目jar包和jdk.tar.gz以及Dockerfile三個文件放入這個目錄中

然后再這個目錄中執行docker build -t javaweb:1.0 . 命令,自定義創建一個鏡像名為javaweb:1.0

docker images命令查看鏡像是否被創建,然后執行docker run --name web -p 8090:8090 -d javaweb:1.0命令,將該鏡像啟動為一個名字為web的容器

訪問宿主機ip以及該容器對應的端口,發現可以訪問,容器啟動成功。

如果每創建一個鏡像,都需要執行這么多命令,是很復雜的,而且可以發現基礎鏡像ubuntu和jdk這些是每個鏡像都需要配的,我們可以把這個提取出成一個單獨的鏡像,讓命令更簡單化。

案例:基于java:8-alpine鏡像,將一個Java項目構建為鏡像

將上述Dockerfile文件簡化為如下所示。

總結

1.Dockerfile的本質是一個文件,通過指令描述鏡像的構建過程
2.Dockerfile的第一行必須是FROM,從一個基礎鏡像來構建
3.基礎鏡像可以是基本操作系統,如ubuntu。也可以是其他人制作好的鏡像,例如:java:8-alpine

什么是DockerCompose

Docker Compose可以基于Compose文件幫我們快速的部署分布式應用,而無需手動一個個創建和運行容器!Compose文件是一個文本文件,通過指令定義集群中的每個容器如何運行。

上述Compose文件內容等價于執行下面的這些指令

CentOS7安裝DockerCompose

如果下載速度較慢,或者下載失敗,可以使用課前資料提供的docker-compose文件

上傳到/usr/local/bin/目錄也可以。

修改文件權限:

將下載好的docker-compose放到/usr/local/bin/目錄,進入該目錄執行上述修改權限的命令

Base自動補全命令

DockerCompose有什么作用?

幫助我們快速部署分布式應用,無需一個個微服務去構建鏡像和部署。

案例:將之前學習的cloud-demo微服務集群利用DockerCompose部署

實現思路如下:

1.查看課前資料提供的cloud-demo文件夾,里面已經編寫好了docker-compose文件

每個目錄中都有已經編寫好的Dockerfile文件

內容都是為了構建該模塊為一個鏡像

docker-compose.yml文件內容大概如下,都是為了將各個鏡像啟動為容器

?2.修改自己的cloud-demo項月,將數據庫、nacos地址都命名為docker-compose中的服務名

user-service模塊中,nacos的地址修改

user-service模塊中,連接數據庫地址修改

order-service模塊中,連接數據庫地址修改

gateway模塊中,nacos的地址修改

3.使用maven打包工具,將項目中的每個微服務都打包為app.jar

每個模塊中的maven依賴配置下,打包為app.jar

打包

4.將打包好的app.jar拷貝到cloud-demo中的每一個對應的子目錄中

5.將cloud-demo上傳至虛擬機,利用 docker-compose up -d 來部署

如果啟動有些問題,可以用下面的命令重啟這幾個容器

訪問對應的ip地址用網關對外暴露的端口10010,發現可以執行,說明項目部署完成

Docker鏡像倉庫

常見鏡像倉庫服務

鏡像倉庫( Docker Registry ) 有公共的和私有的兩種形式:

公共倉庫:例如Docker官方的 Docker Hub,國內也有一些云服務商提供類似于 Docker Hub 的公開服務,比如網易云鏡像服務、DaoCloud 鏡像服務、阿里云鏡像服務等。

除了使用公開倉庫外,用戶還可以在本地搭建私有 Docker Registry。企業自己的鏡像最好是采用私有DockerRegistry來實現

簡化版鏡像倉庫

Docker官方的Docker Registry是一個基礎版本的Docker鏡像倉庫,具備倉庫管理的完整功能,但是沒有圖形化界面。

搭建方式比較簡單,命令如下:

帶有圖形化界面版本

使用DockerCompose部署帶有圖象界面的DockerRegistry,命令如下

配置Docker信任地址

我們的私服采用的是http協議,默認不被Docker信任,所以需要做一個配置

docker-compose.yml的內容為

執行

訪問對應地址,可以訪問

在私有鏡像倉庫推送或拉取鏡像

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

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

相關文章

線性回歸的正則方法:嶺回歸和Lasso

線性回歸的正則方法包括嶺回歸(Ridge Regression)和Lasso回歸(Least Absolute Shrinkage and Selection Operator Regression)。這兩種方法都是為了解決線性回歸中可能存在的過擬合問題而提出的。 選擇使用嶺回歸還是Lasso回歸通常…

使用 goland 開發 golang 項目環境配置

方式1:使用 GOPATH 和 GOROOT 在 goland 中打開:Settings - Go,會看到 GOROOT、GOPATH,其相關解釋與配置如下: GOROOT:對應 go 的安裝路徑,例如:D:\go\binGOPATH:是我們…

JavaScript中的事件循環 為什么是微任務先運行

無意中看到這個問題,以下是個人的看法 1、性能和響應性: 微任務通常比宏任務執行得更快,因為微任務通常涉及更少的工作量。將微任務放在宏任務之前可以盡早執行那些需要快速響應的任務,提高系統的響應性能。 2、Promise 的異步特…

3d標簽云實現過程(tagcloud.js)同步原生和 vue

寫在前面 本來是沒有準備寫這個知識點,但是下載這個 js 的時候發現很多都是要錢或者是積分的,我就不明白了一個開源了這么久的 js 怎么還有人拿來掙錢的,同時還有一些只有原生 html 的例子,但是現在都是 框架主導的一些項目&#…

【Exception】Error: Dynamic require of “path“ is not supported

Talk is cheap, show me the code. 環境 | Environment kversionOSwindows 11Node.jsv18.14.2npm9.5.0vite5.0.0vue3.3.8 報錯日志 | Error log >npm run dev> app10.0.0 dev > viteERROR failed to load config from C:\code\frontend\app1\vite.config.js …

【LeetCode二叉樹進階題目】606,102,107

二叉樹進階題目 606. 根據二叉樹創建字符串解題思路及實現 102. 二叉樹的層序遍歷解題思路及實現 107. 二叉樹的層序遍歷 II解題思路及實現 606. 根據二叉樹創建字符串 描述 給你二叉樹的根節點 root ,請你采用前序遍歷的方式,將二叉樹轉化為一個由括號…

從零開始學習typescript——運算符(算術運算符、賦值運算符、比較運算符)

算術運算符 算術運算符主要是針對數值類型和長整型;包括有加法、減法、乘法、除法、自增、自減等運算 加法() let x:number1let y:number 2console.log(xy)減法(-) let x:number1let y:number 2console.log(y-x)乘法…

晶振有哪幾種?晶振旁邊的兩個電容起什么作用?

晶振可以分為普通晶振、溫補晶振、壓控晶振、恒溫晶振、差分晶振。 普通晶振通常用作微處理器的時鐘器件,主要應用于那些穩定度要求不要的設備中,例如電視機、微波爐。 溫補晶振,在晶振內部采取了對晶體頻率、溫度特性進行補償,已…

軟件工程理論與實踐 (呂云翔) 第十三章 軟件測試方法與過程課后習題及其答案解析

第十三章 軟件測試方法與過程 1.判斷題 (1)白盒測試無須考慮模塊內部的執行過程和程序結構,只需了解模塊的功能即可。() 解析:白盒測試需要考慮模塊內部的執行過程和程序結構,以便設計測試用例和覆蓋代碼路徑。 &a…

軟文推廣有什么作用?媒介盒子分享

數字時代,品牌方以往的營銷打法可能需要應時而變,傳統的廣告模式很難將品牌推廣出去,原因就在于傳統廣告的成本高昂并且針對性較弱,而軟文推廣能夠通過較低的成本將產品或品牌信息送到消費者面前,今天媒介盒子就來分享…

58同城算法工程師一面&二面 面試題

來源:投稿 作者:LSC 編輯:學姐 一面 40min 1.Gbdt和xgboost的區別 XGBoost是對GBDT的改進和擴展,它提供了更高的效率、更好的性能、正則化技術、內置特征選擇等功能。 (1)正則化: GBDT使用基本的樹模型,并在每一輪…

vue3.0 + qiankun遇到的問題

進入子應用再回到主應用切換動態路由時 TypeError: Cannot read properties of undefined (reading ‘appWrapperGetter’) application ‘plat’ died in status UNMOUNTING: instance.$destroy is not a function 第一個報錯是因為子應用切走時沒有銷毀 vue的實例&#xff0…

常用RFC規范匯總

官網:https://www.rfc-editor.org/ The RFC Series (ISSN 2070-1721) contains technical and organizational documents about the Internet, including the specifications and policy documents produced by five streams: the Internet Engineering Task Force …

TCP/IP

分層模型 TCP 傳輸控制協議 UDP 用戶數據包協議 四層 應用層 負責發送/接收消息 傳輸層 負責拆分和組裝 .期間會有編號 網絡層 TCP/UDP 屬于網絡層, 不會判斷和處理編號 數據鏈路層 以太網 ,網絡設備 TCP 連接 TCP連接需要端口,進行通信 Java 通過Socket 接收消息 發送 …

基于SpringBoot+Vue的體檢預約管理系統

基于SpringBootVue的體檢預約管理系統的設計與實現~ 開發語言:Java數據庫:MySQL技術:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系統展示 主頁 管理員界面 用戶界面 摘要 體檢預約管理系統是一種基于Spring Boot…

Vue3常用操作

一、Vue3項目構建 1、安裝最新版本vue npm create vuelatest 2、選擇需要的配置 3、進入項目 cd 項目名稱 4、下載依賴 npm install 5、啟動項目 npm run dev

chatGLM3微調

文章目錄 一、問答數據集生成器使用設置問題啟動使用產出效果 二、進行微調第一步:下載模型第二步:項目準備2.1 下載項目2.2 然后使用 pip 安裝依賴2.3 開始 第三步進行微調3.1安裝相關依賴3.2準備數據集,并且上傳3.3對數據集進行預處理3.4 進…

如何使用技術SEO來優化評論

你在網上購買嗎?我的意思是,在當今時代,誰不這樣做?作為買家,無論您想購買什么,您都了解全面和高質量評論的價值。這是您在決定是否購買產品時考慮的重要因素。 這就是為什么許多人在網上購物之前使用評論…

移動端click事件、touch事件、tap事件的區別

在移動端,有三種常見的事件類型,click事件、touch事件、tap事件。它們的區別如下: click事件:click事件是在用戶點擊屏幕的時候觸發,如果是移動設備,則會在用戶點擊屏幕的同時觸發touch事件。但是&#xff…

【開源】基于Vue和SpringBoot的康復中心管理系統

項目編號: S 056 ,文末獲取源碼。 \color{red}{項目編號:S056,文末獲取源碼。} 項目編號:S056,文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 普通用戶模塊2.2 護工模塊2.3 管理員…