主頁 > 作業系統 > Docker與微服務

Docker與微服務

2022-06-08 06:54:48 作業系統

鏡像下載、域名決議、時間同步請點擊 阿里云開源鏡像站

一、鏡像

鏡像是一種輕量級、可執行的獨立軟體包,它包含運行某個軟體所需的所有內容,我們把應用程式和配置依賴打包形成一個可交付的運行環境(包括代碼、運行時需要的庫、環境變數和組態檔等),這個打包好的運行環境就是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容器被刪了??????

file

這個時候就不怕資料丟失了,因為我們之前使用容器卷保存資料了

  • 再次創建mysql容器 資料卷宿主機絕對路徑就是之前設定的

file

  • 資料庫中資料從本地主機共享過來了,再也不怕刪庫跑路了??????

file

3.Redis

  • 搜索鏡像 docker search redis

file

  • 拉取鏡像, docker pull redis

file

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

file

  • 進入容器,連接客戶端

file

這樣肯定是不行的,因為redis需要保存資料,還要修改組態檔

  • 在本地主機新建目錄 /app/redis

file

  • 將一個redis.conf 檔案模板拷貝進 /app/redis 目錄下

file

  • 修改redis.conf組態檔

file

  • .將daemonize yes改為 no ,因為該設定何docker run中-d引數沖突,會導致容器一直啟動失敗

file

  • 再次創建redis容器(記得先把之前6379埠停了)

docker run -p 6379:6379 --name myredis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf

file

  • 測驗連接成功

file

本文轉自:https://blog.csdn.net/qq_52595134/article/details/124460846

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487407.html

標籤:其他

上一篇:在Linux中使用crontab

下一篇:yum安裝 一直出現There are no enabled repositories in “/etc/yum.repos.d“, “/etc/yum/repos.d“, 的解決辦法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more