主頁 >  其他 > docker 鏡像管理

docker 鏡像管理

2020-09-22 05:36:37 其他

Docker Image簡單說明:含有啟動容器所需要的內核和檔案系統,

  • 采用【分層構建】機制,最底層為bootfs,之上為rootfs

    • bootfs:是引導系統的檔案系統,包含bootloader和kernel,容器啟動完后,宿主機(docker deamon行程所在的機器)的會從記憶體中卸載掉bootfs,以節約資源,

      從下圖可以看處來,bootfs層使用了aufs或者btrfs檔案系統,

    • rootfs:位于bootfs之上,表現為docker容器的根檔案系統,從下圖可以看出來,rootfs給我們提供了基本的根檔案系統(/bin, /var, /usr等),

      • 傳統模式中,系統啟動時,內核掛載rootfs時會首先將其掛載為只讀模式,完整性自檢完成后將其重新掛載為讀寫模式,
      • docker中,rootfs由內核掛載為只讀模式,而后通過【聯合掛載】技術額外掛載一個【可寫】層,

docker image layer:

  • 下圖深藍色的鏡像都稱為父鏡像(parent image),深藍色最下層是基礎鏡像(Base Image)
  • 最上層的淺藍色層為【可讀寫】層,它之下都是【只讀】層,

例子:要在Debian內核上搭建一個apache環境的話:

  • 先去找一個純凈的最小的Debian image
  • 讓后再在Debian image上面,堆上一個編輯器軟體 image(Emacs,或者vim)
  • 然后在Emacs image上再堆上一個apache image

啟動關聯:當要啟動apache image時,必須要先啟動Debian image,再啟動Emacs image,

當某個容器啟動后,產生的臨時檔案,怎么處理?

不是docker的apache 啟動后,產生的臨時檔案一般放在/var下,但是既然是docker了,apache產生的臨時檔案就不可以寫入Debian image的/var目錄下了,理由是,這些深藍色的image層都是只讀的,并且這些深藍色image層也會讓別的軟體共同使用,所以產生的臨時檔案就寫到了淺藍色的apache container層了,

當執行了docker container rm 容器后,保存在apache container層里的臨時檔案也一并被洗掉了,

docker 的【分層構建,聯合掛載】功能,需要由專有的檔案系統支撐,

  • aufs:advanced-multi-layered unification filesystem(高級多層統一檔案系統)

  • 被用于實作docker的【聯合掛載】功能,

  • aufs包裝了UnionFS,2006年由日本人Junjiro Okajima開發,但由于UnionFS本身就不好,所以aufs也很臃腫,導致linux本人一直沒有同意把aufs加入到linux的內核里,

  • docker最初使用aufs作為容器檔案系統層,目前也支持,

  • aufs的競爭產品是overlayfs,后者從3.18版本開始被加入到linux內核,

  • docker的分層鏡像,除了aufs,還支持btrfs,vfs,devicemapper等

  • 新版本的docker使用的是:overlay2(抽象2級檔案系統,必須建立在某個檔案系統上)

    Storage Driver: overlay2
    Backing Filesystem: xfs
    

docker registry:

啟動容器時,docker daemon行程會試圖從本地獲取相關的鏡像,但當本地鏡像不存在時,將從Registry(默認的registry 就是docker hub)中下載該鏡像并保存到本地,

如果啟動容器時,只指定鏡像和tag的話,就默認去找docker hub,除非你指定了registry的ip地址,

  • public docker registry:默認就是docker hub,

  • private docker registry:是自己創建的registry服務,自己創建也不麻煩,可以使用由VMware提供的開源harbor,來創建自己的registry服務,

    一般docker hub上的鏡像,比如nginx,拿過來是用不了的,因為配置都不一樣,所以專案上一般都是自己打成鏡像,

  • Sponsor Registry:第三方的Registry,供客戶和docker社區使用

  • Mirror Registry:第三方的registry,比如阿里的Registry

  • Vendor Registry:由發布docker鏡像的供應商提供的Registry,比如redhat給自己作業系統提供的鏡像,

docker registry包含repository和index

  • repository:docker鏡像的所有迭代版本組成的鏡像倉庫,一個registry中可以有多個repository,
    • repository又分為:
      • 頂層倉庫:直接用image:tag來表示,比如,redis:5,
      • 用戶倉庫:用戶名/倉庫名來表示,比如,user1/redis:5.
    • 每個倉庫可以包含多個tag(標簽),
  • index
    • 維護用戶賬戶,鏡像的校驗以及公共命名空間的資訊,
    • 相當于為registry提供了一個完成用戶認證等功能的檢索介面,

實際專案開發時,對docker的運用流程:

開發人員從docker hub上,下載要使用的鏡像,然后再修改它后,放入到自己公司的私有registry上;后來再由運維人員做各種環境的部署,

cloud native(云原生)大致意思:

比如從docker hub上下個redis,redis的組態檔是需要定制的,我總不能因為要改個組態檔,而從新打包個redis鏡像,所以redis組態檔的就不能寫死在redis鏡像里了,而是通過讀取系統的環境變數,來生成組態檔,這樣一來,在啟動redis容器時,就可以把你自己的配置,通過環境變數的方式傳遞給redis鏡像,從而達到修改組態檔的目的,

docker hub功能介紹:

  • Image Repository:自己的私有docker image 倉庫,一般用法:從docker hub上拉一個image,然后修改,再推到這里,
  • automated builders:自動構建image,當監聽到github上的 dockerfile檔案發生變化后,自動構建image,
  • webhooks:是automated builders里的功能之一,當你成功提交image到自己的docker hub后,呼叫這個鉤子,
  • organizations:創建一個作業組,
  • github and bitbucket intergration:和github,bitbucket集成使用,

如何從docker hub以外的registry上下載image呢?

# docker pull <registry>[:port]/[<namespace>]<name>:<tag>

當從https://quay.io/ 上下載image時,使用下面的命令:

# docker pull quya.io/coreos/flannel::v0.11.0-arm64

這里省略了port,默認的port是443(https協議的埠號),

coreos是用戶倉庫,比如,user1/redis:5.

下載完成后,使用docker image ls查看的結果:發現多了【quay.io】的前綴,說明是從quay.io上下載的image,而不是從docker hub上下載的image,

REPOSITORY               TAG                 IMAGE ID            SIZE
quay.io/coreos/flannel   v0.11.0-arm64       32ffa9fadfd7        53.5MB
  • namespace用法:

    namespace examples
    organization:組織 redhat/k8s, google/k8s
    login(user name):用戶名 user1/app, user2/app
    role:角色 devel/app, test/app, prod/app

制作自己的image的方法:

1,使用dockerfile制作

2,基于容器制作

3,基于docker hub的automated builds功能制作

基于容器制作image

容器啟動后,把發生了變化的內容,打成一個image,

命令用法:

# docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <[email protected]>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)

舉例:先下載一個busybox image,然后在里面添加一個/data/html/index.html檔案,檔案內容:【welcome to busybox!!】執行docker container rm,再執行docker container runbusybox后,發現剛才創建的/data/html/index.html檔案沒有了,所以可以得知,沒有commit的修改再下次啟動后,就沒有了,

創建完/data/html/index.html檔案后,為了防止在commit的程序中某些東西又產生了改動,指定-p選項,告訴docker先把container暫停一下,那么我們先commit(docker container commit -p bb1)一次,不指定repository和tags看看效果,用docker image ls查看,發現多了一行none的一行,

REPOSITORY               TAG                 IMAGE ID             SIZE
<none>                   <none>              1e7b9d544ff6         1.22MB

說明image成功了,但是沒有repository和tag,只有個image id,

下面通過使用docker tag命令把只有image id的image加上repository和tag

# docker tag 1e7b9d544ff6 ys/busybox:local1

執行結果查看(docker image ls):repository和tag都添加上了,

REPOSITORY               TAG                 IMAGE ID             SIZE
ys/busybox               local1              1e7b9d544ff6         1.22MB

可以再一個tag:docker tag ys/busybox:local1 ys/busybox:local2

結果如下:image id是相同的,所以是同一個image(鏡像),只是tag不同,版本相同,

REPOSITORY               TAG                 IMAGE ID             SIZE
ys/busybox               local1              1e7b9d544ff6         1.22MB
ys/busybox               local2              1e7b9d544ff6         1.22MB

tag命令用法:

# docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

檢查一下commit后的image里是否有/data/html/index.html檔案,先終止container(docker container rm),再run,發現里面有/data/html/index.html檔案,說明commit成功了,

洗掉一個tag看看,tag只是某個image的參考,洗掉掉一個tag,如果還有別tag指向這個同一個image,則image還是不會被洗掉的,tag和linux里的硬鏈接差不多,當然tag的主要作用還是表示同一個image的不同版本,所以一般每個tag對應的image id都是不同的,

到此為止,我們只是在原來的image里添加了一些檔案,如果我想改變image啟動時默認的運行程式呢?這就需要用到-c選項了,

比如我讓image啟動后運行的命令為httpd,注意CMD都是大寫,-f是讓httpd在前臺運行,-h指定html的路徑,

# docker container commit -a "ys <[email protected]>" -c 'CMD ["/bin/httpd","-f","-h","data/html"]' -p bb1 ys/busybox:local3

然后啟動ys/busybox:local3,用 docker inspect bb1查看CMD變成了:

"Cmd": [
                "/bin/httpd",
                "-f",
                "-h",
                "data/html"
            ],

發現IP是172.17.0.2,所以運行curl 172.17.0.2后,在控制臺列印出來的就是【welcome to busybox!!】,

測驗完我們自己打的image沒有問題了,想把這個image傳到registry上的話,怎么辦呢?

比如傳到docker hub上,
  • 首先你先申請一個docker hub賬戶,比如docker hub賬戶名是ys,

  • 在docker hub上創建一個repository,repository的名字必須和你在本地用docker container commit是指定的名字一樣才行,

  • 在終端登錄到docker hub,使用命令docker login,不指定[SERVER]的話,就是登錄到docker hub,

    # docker login [OPTIONS] [SERVER]
    Options:
      -p, --password string   Password
          --password-stdin    Take the password from stdin
      -u, --username string   Username
    
  • 用docker image ls,確保你本地的repository的名字和你在docker hub上創建的repository的名字一樣,

  • docker image push [OPTIONS] NAME[:TAG],把本地的image,推送到docker hub上,

    # docker image push ys/busybox:v0.1
    

    執行上面的命令后,在你的docker hub上創建的ys里的tags里就有了v0.1了,

    如果不指定tag,則把本地所有的tags都推送到docker hub上,

  • 退出登錄:docker logout

比如把制作好的image,上傳到阿里的registry上,
  • 首先你先申請一個阿里云賬戶,
  • 創建【命名空間】和【倉庫名稱】,
  • 點擊創建好的倉庫行最后的【管理】,安裝里面的說明操作就可以了,

需求:在一臺機器A上打了個image,機器B也想用,可以,通過阿里云或者docker hub中轉一下,下載到機器B上,但是這樣比較麻煩,所以需要使用輕量的方法,

  • 步驟1:機器A,使用docker save把image壓縮成一個檔案,

    Usage:  docker image save [OPTIONS] IMAGE [IMAGE...]
    Save one or more images to a tar archive (streamed to STDOUT by default)
    Options:
      -o, --output string   Write to a file, instead of STDOUT
    

    例子:把本機的redis鏡像保存成test.gz,把這個test.gz發給機器B,

    # docker image save -o test.gz redis:5
    
  • 步驟2:機器B,使用docker load把從機器A得到的壓縮后的檔案,存盤成image檔案,

    Usage:  docker image load [OPTIONS]
    Load an image from a tar archive or STDIN
    Options:
      -i, --input string   Read from tar archive file, instead of STDIN
      -q, --quiet          Suppress the load output
    

    例子:把機器A傳過來的test.gz,做成image檔案,

    # docker image load -i test.gz
    

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854

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

標籤:其他

上一篇:一文解讀RESTful (轉)

下一篇:排名靠前的博客

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more