Docker與微服務

来源:https://www.cnblogs.com/helong-123/archive/2022/06/07/16351020.html
-Advertisement-
Play Games

鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 一、鏡像 鏡像是一種輕量級、可執行的獨立軟體包,它包含運行某個軟體所需的所有內容,我們把應用程式和配置依賴打包形成一個可交付的運行環境(包括代碼、運行時需要的庫、環境變數和配置文件等),這個打包好的運行環境就是image鏡像文件 1.鏡像分層 以 ...


鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站

一、鏡像

鏡像是一種輕量級、可執行的獨立軟體包,它包含運行某個軟體所需的所有內容,我們把應用程式和配置依賴打包形成一個可交付的運行環境(包括代碼、運行時需要的庫、環境變數和配置文件等),這個打包好的運行環境就是image鏡像文件

1.鏡像分層

以tomcat鏡像為例,我們發現在pull的過程中鏡像好像一層一層的在下載

file

(1). Docker鏡像載入原理:

docker鏡像實際上由一層一層的文件系統組成,這種層級的文件系統就是聯合文件系統(UnionFS)

(2). UnionFS(聯合文件系統)

UnionFS(聯合文件系統):Union文件系統是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加, 同時可以將不同目錄掛載到同一個虛擬文件系統下。Union文件系統時Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像)可以製作除具體的應用鏡像。

(3). 具體細節

  • bootfs(boot file sysytem)

主要包含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等

(4). 鏡像分層的好處

共用資源,方便複製遷移、復用

比如說多個鏡像都是從相同的一份base鏡像構建而來(更詳細的講 假如base鏡像共有十層,而A鏡像是base鏡像的前三層,B鏡像是base鏡像的後三層),那麼我們只需要在磁碟上保存一份base鏡像,在記憶體中載入一份base鏡像,就可以為所有由base鏡像構建而來的鏡像的實例容器服務了。

通俗來講,大學圖書館分為好幾層,如工學、文學、醫學每個大的分區又可以細分多個不同的子領域,而我們全校的學生雖然專業眾多,但是都可以在圖書館找到屬於自己專業的書籍。這樣我們就不需要因為學科領域不同也建造多個圖書館了

(5). 容器層、鏡像層

當容器啟動時,一個新的可寫層被載入到鏡像的頂部,這一層通常被稱為 " 容器層" , "容器層 " 之下的都叫 " 鏡像層 " 。Docker鏡像層都是只讀的,容器層是可寫的。

這個好理解,圖書館中的書可以借閱,但是圖書館地基和整體建築肯定不能隨便動

在docker上運行Ubuntu容器實例,使用vim編輯文件,發現報錯了,找不到vim

file

原因

這是由於鏡像是簡易版的Linux,僅包括Linux內核等一些重要的。

但是我們進行配置文件的修改,需要用到vim編輯器,這時候就需要鏡像加強了

apt update 更新包管理工具(ubuntu)

file

apt install vim 下載vim

使用vim編輯器,新建文件a.txt 並寫入hello docker,保存退出。讀取a.txt文件

file

ctrl+q+p 退出容器 docker ps 查看正在運行的容器

file

第一個就是我們剛纔使用的帶vim編輯器的ubuntu容器

docker commit -m="提交的描述信息" -a="作者" 容器ID 要創建的目標鏡像名:[標簽名]

file

commit 帶vim編輯器的ubuntu容器到本地,查看本地鏡像發現帶vim的大小多了近100MB,這就是為什麼鏡像文件小的原因所在,只是按需下載

Docker中的鏡像分層,支持通過擴展現有鏡像,創建新的鏡像。

2.本地鏡像發佈到阿裡雲

在阿裡雲控制台 -> 容器鏡像服務 -> 個人實例(創建一個用於測試)

file

file

file

(1). 創建命名空間

file

(2) 創建鏡像倉庫

file

file

(3) 阿裡雲會自動生成操作指南

file

(3)講鏡像推送到Registry

(4)登錄

docker login --username=用戶名 registry.cn-shanghai.aliyuncs.com

file

(5)設置鏡像版本號

docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[鏡像版本號]

file

(6)推送

docker push registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[鏡像版本號]

file

(7)測試

刪除本地Ubuntu1.3的鏡像

file

(8)從阿裡雲Registry中拉取鏡像

docker pull registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[鏡像版本號]

file

測試成功!

file

二、容器數據捲

1.作用

試想一下:我們的docker容器很容易被自己誤刪或者被別人惡意刪除,那我們容器中的重要數據不就丟失了嗎?

docker採用容器數據捲的方式解決此類問題。

捲就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,不屬於聯合文件系統,可以繞過聯合文件系統提供一些用於持久化和共用數據的特性。

容器數據捲設計的目的就是數據的持久化,它完全獨立於容器的生存周期,因此Docker不會再容器刪除時刪除其掛載的數據捲

註意事項

Docker掛載主機目錄訪問如果出現cannot open directory:Permission denied解決辦法:在掛載目錄後多加一個--privileged=true參數即可

作用: 擴大容器的許可權解決掛載目錄沒有許可權的問題,使得容器中root擁有所有許可權,否則root只是外部一個普通的用戶

2.特點

  • 數據捲可在容器之間共用或重用數據
  • 捲中的更改可以直接實時生效
  • 數據捲中的更改不會包含再鏡像的更新中
  • 數據捲的生命周期一直持續倒沒有容器使用它為止

3.測試

docker run -it --privileged=true -v/宿主機絕對路徑目錄:/容器內目錄 鏡像名

file

(1). 在容器docker_data目錄中創建文件

file

(2). 在本地host_data目錄下發現 dockerin.txt文件已共用

file

(3). 在本地host_data目錄下新建文件並寫入數據 hello docker

file

(4). 在容器docker_data目錄中發現hostin.txt文件 並讀取到共用過來的數據

file

(5). docker inspect 容器ID 查看容器內部細節

file

假設容器停止,在主機新建文件能否共用嗎?

(6). 停止容器

file

(7). 在主機創建文件c.txt

file

(8). 重啟容器

file

(9). 進入容器docker_data目錄下發現c.txt文件已共用

file

4.容器捲的讀寫規則

容器數據捲的讀寫規則預設 rw 可讀可寫,就如同上述的例子

file

ro:容器實例內部被限制,只能讀取不能寫

docker run -it --privileged=true -v/宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名

(1). 創建只讀的Ubuntu容器實例

file

(2). 在本地主機上創建a.txt文件 並寫入數據 xueyueqing

file

(3). 這容器中只能讀文件,其他操作被限制

file

5.容器捲的繼承

docker run -it --privileged=true --volumes-from 父類 --name u2 ubuntu

file

(註意:向將之前的u2容器刪除,docker rm 容器ID)

(1). u2繼承u1的docker_data目錄及目錄下的文件

file

(2). 在u2中創建文件,u1中也會共用數據

file

file

當u1停止了,u2會共用本地主機數據嗎? 會

file

(3). u2容器共用了主機的數據

file

容器捲的繼承本質是繼承了容器之間的規則與容器本身沒有關係,因此u1容器停止不影響u2容器與本地主機數據共用

如果啟動u1容器,那麼u1中會有之前本地主機創建的文件嗎? 會

file

三、docker上安裝常用軟體

總體步驟:

  • 搜索鏡像

  • 拉取鏡像

  • 查看鏡像

  • 啟動鏡像

  • 停止鏡像

  • 移除容器

補充:

netstat -tunlp | grep 埠號 查看埠使用情況

ps - ef | grep 埠號 查看埠使用情況

kill - 9 進程號 殺進程

1.Tomcat

(1).搜索鏡像 docker search tomcat

file

(2).拉取鏡像,一般都是使用第一個 docker pull tomcat

file

(3).查看tomcat鏡像是否下載成功 docker images tomcat

file

(4).使用tomcat鏡像創建容器實例 docker run -d -p 8080:8080 --name t1 tomcat

-p 小寫,主機埠:docker容器埠 -d 後臺運行

-P 大寫,隨機分配埠

(5). 啟動成功

file

file

(6). 訪問不到tomcat首頁

file

首先檢查防火牆埠8080是否開啟,使用雲伺服器還需要檢查雲伺服器安全組中的8080埠規則是否添加

檢查tomcat中webapps目錄下是否有tomcat首頁

(7). 進入tomcat容器,發現tomcat中webapps目錄下為空

file

(8). 刪掉webapps,將webapps.dist 改為webapps

file

成功了!!!

file

(原因是因為新版tomcat 預設訪問路徑webapps目錄是空的,預設配置在webapps.dist目錄中 ,需要修改下)

(9). 停止、刪除容器一氣呵成

file

2.MySQL

(1). 簡易版

  • 搜索鏡像 docker search mysql

file

  • 拉取鏡像,使用5.7版本的 docker pull mysql:5.7

file

  • 查看mysql鏡像是否下載成功 docker images mysql

file

  • 使用tomcat鏡像創建容器實例 docker run -d -p 8080:8080 --name t1 tomcat

先檢查Linux本地主機是否啟動了MySQL,防止埠衝突

file

  • 啟動容器 docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

file

  • 進入容器,登錄root用戶

file

  • 簡單測試下MySQL

file

file

  • 使用SQLyog測試 連接成功

file

** 問題一:測試中文數據,發現亂碼**

file

問題二:mysql容器如果被誤刪了,那麼我的數據該怎麼辦

file

解決方案:請看實戰版

(2). 實戰版

  • 創建一個mysql目錄保存數據

file

  • 使用容器捲保存數據 docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

file

  • 在本地主機/mysql/conf目錄下新建my.cnf 文件利用容器捲共用,將文件共用到mysql容器解決亂碼
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

file

  • 進入容器,登錄mysql

file

  • 查看mysql編碼 show variables like 'character%'

file

  • 測試

file

  • 成功解決中文亂碼問題

file

  • mysql容器被刪了
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在本文中,我們將看到Prometheus監控技術棧的局限性,以及為什麼移動到基於Thanos的技術棧可以提高指標留存率並降低總體基礎設施成本。 用於此演示的內容可以在下麵鏈接中獲取,並提交到他們各自的許可證。 https://github.com/particuleio/teks/tree/main ...
  • Java是編譯型語言還是解釋型語言 答案:java既是編譯型語言,也是解釋型語言。 你可以說它是編譯型的。因為所有的Java代碼都需要經過javac編譯為.class文件,但主要是由於java現在擁有了jit,會將熱點代碼的.class文件直接編譯為二進位本地代碼。 你可以說它是解釋型的。因為jav ...
  • 運算符重載 運算符重載基礎 函數重載(Function Overloading)可以讓一個函數名有多種功能,在不同情況下進行不同的操作。**運算符重載(Operator Overloading)**也是一個道理,同一個運算符可以有不同的功能。 例子:用+號實現複數加法運算;成員函數重載運算符 #in ...
  • Python文本分析“王心凌”彈幕演示案例,包含步驟:爬蟲+情感判定+情感占比餅圖+Top10高頻詞+詞雲圖。 ...
  • .NET CORE webapi 調用阿裡雲簡訊服務 1.獲取AccessKey 您可以為阿裡雲賬號(主賬號)和RAM用戶創建一個訪問密鑰(AccessKey)。在調用阿裡雲API時您需要使用AccessKey完成身份驗證。 背景信息 AccessKey包括AccessKey ID和AccessKe ...
  • AAAA AAAA即認證、授權、審計、賬號(Authentication、Authorization、Audit、Account)。在安全領域我們繞不開的兩個問題: 授權過程可靠:讓第三方程式能夠訪問所需資源又不泄露用戶數據,常用的多方授權協議主要有 OAuth2 和 SAML 2.0 授權結果可控 ...
  • 1.前言 hi,大家好,我是三合,距離上一篇博客已經過去了整整兩年,這兩年裡,博主通關了《人生》這個游戲里的兩大關卡,買房和結婚。最近閑了下來,那麼當然要繼續寫博客了,今天這篇博客的主要內容是,net core/.net6中,如何利用SummerBoot(點我打開詳情介紹)中的feign模塊快速接入 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 在CentOS中使用yum命令出現報錯: 今天想給linux裝個git 管理代碼 執行命令: 1 yum -y install git 然後出現了這麼一句 error:There are no enabled repositories in "/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...