Docker之- 使用Docker 映象和倉庫
目錄
- 使用Docker 映象和倉庫
- 什麼是 Docker 映象
- 列出 Docker 映象
- tag 標籤
- Docker Hub
- 拉取映象
- 查詢映象
- 構建映象
- 建立Docker Hub 賬號
- 使用 Docker 的commit 命令建立映象
- 使用 Dockerfile 構建映象
- 基於 Dockerfile 構建新映象
- 指令失敗時呢?
- Dockerfile 和構建快取
- 基於構建快取的 Dockerfile 模版
- 檢視新映象
- 從新映象啟動容器
- Dockerfile 指令
- 將映象推送至 Docker Hub
- 刪除映象
- 總結
使用Docker 映象和倉庫
上一篇文章中,我們學習了包括 docker run 在內的許多對容器進行操作的基本指令,那麼在本節中,我們主要探討 Docker 映象的一些概念,比如什麼是映象,如何對映象進行管理,如何修改映象,如何建立、儲存、共享自己建立的映象等,那麼就開始我們的學習
什麼是 Docker 映象
Docker 映象是由檔案系統疊加而成,最底端是一個引導檔案系統,也就是bootfs
,這很像典型的 Linux/Unix 的引導檔案系統。Docker 使用者永遠不會和引導檔案系統有什麼互動。實際上,一個容器啟動後,它就會被移入內容,而引導檔案系統則會被解除安裝,從而留出更多的空間。(感覺有點像古代的餐館招待?負責引導顧客進入餐館,自己的工作就算是完成了)
傳統的Linux 引導過程中,root檔案系統最先以只讀的方式載入,當引導結束後,會切換為讀寫模式。但是在Docker 中,root檔案系統永遠只是只讀狀態,並且使用聯合載入的技術一次同時載入多個檔案系統。聯合載入會將各層系統檔案疊加在一起,最終的檔案系統包含底層的檔案和目錄。
聯合載入:聯合載入指的是一次同時載入多個檔案系統,但是外面看起來只有一個檔案系統。
Docker 將這樣的檔案系統成為映象。一個映象可以放到另一個映象的頂部。位於下面的映象稱為父映象,一次類推,知道映象棧的最底部,最底部的映象稱為基礎映象。最後,當一個映象啟動容器時,Docker會在映象的最頂層載入一個檔案系統。我們想在 Docker 中執行的程式就是在這個讀寫層中執行的。
用一幅圖來表示一下:
列出 Docker 映象
我們先從如何列出系統中的 Docker 映象來開始,可以使用 docker images 命令來實現,如下
可以看到,我們已經獲取了一個映象列表。那麼,這些映象是從哪來的呢?我們執行 docker run 命令時,同時進行了映象下載
映象從倉庫下載下來。映象儲存在倉庫中,而倉庫存在於 Registry 中。預設的 Registry 是由 Docker 公司執行的公共 Registry 服務,即 Docker Hub。需要進行ID的註冊
Docker Registry 的程式碼是開源的,你也可以擁有自己的Registry。
在 Docker Hub (或者是你自己運營的 Docker Registry)中,映象是儲存在倉庫中的,可以將映象倉庫想象成類似於Git 倉庫的東西。它包括映象、層、以及包括映象的元資料。
倉庫可以包含很多映象,你可以使用docker pull
來拉取倉庫中的映象,如下
Git 拉取程式碼的指令是 git pull ,這樣就很相似了。
再來使用 docker images 看一下現在有哪些映象
因為我的 Docker Hub 倉庫中只有一個 ubuntu 的映象,所以圖中標紅的這個映象是我們剛從 Docker Hub 上下載下來的。
tag 標籤
為了區分同一個倉庫中的不同映象,Docker 為我們提供了 tag 這個標籤,每個映象在列出來的時候都帶有一個標籤,如12.10、 12.04等,這種標籤機制使得一個倉庫中允許儲存多個映象。
我們可以在倉庫後面加一個冒號:標籤名
的方式來指定該倉庫中的某一個映象,例如 docker run -t -i --name new_container ubuntu:12.04 /bin/bash
Docker 會自動幫我們切換到 Ubuntu 的環境下,當然,這種方式建立了一個互動式任務。
在構建容器時指定倉庫的標籤也是一個好習慣,這樣便可以準確的指定容器來源於哪裡。
Docker Hub
Docker Hub 有兩種倉庫,一種是使用者倉庫,一種是頂層倉庫。使用者倉庫是由開發人員自己建立的,頂層倉庫是由Docker Hub 內部人員管理。
使用者倉庫的命名由兩部分構成,如 cxuan/ubuntu
- 使用者名稱 例如 : cxuan
- 倉庫名 例如 : ubuntu
相對的,頂層倉庫的命名就比較嚴謹,如 ubuntu 倉庫。頂層倉庫由 Docker 公司和選定的優質基礎映象廠商來管理,使用者可以基於這些映象構建自己的映象。
使用者映象都是由愛好者社群自己提供的,沒有經過 Docker 公司的認證,所以需要自己承擔相應的風險。
拉取映象
還記得docker run 的啟動過程嗎?再來一下這張圖回顧一下
其實也可以通過 docker pull 命令先預先拉取映象到本地,使用 docker pull 命令可以節省從一個新映象啟動一個容器所需要的時間。下面就來領取一下fedora
基礎映象( fedora 是 Fedora 優質廠商提供的基礎映象 )
可以使用 docker images 檢視新映象是否拉取到本地,不過我們這次只希望看到 fedora 的映象,那麼你可以使用這個命令: docker images fedora
可以看到我們已經把 fedora 映象拉取到了本地
查詢映象
我們可以通過 docker search 命令來查詢所有 Docker Hub 上公共可用的映象,如下
下面還有很多映象,我們主要看一下每條映象都返回了哪些內容
- 倉庫名稱
- 映象描述
- 使用者評價 --- 反應一個映象的受歡迎程度
- 是否官方 --- 是否由Docker 公司及其指定廠商開發的映象
- 是否自動構建 --- 表示這個映象是由 Docker Hub 自動構建的
從上面查詢的結果中選擇一個映象進行拉取,docker pull jamtur01/puppetmaster
這條命令將會下載 jamtur01/puppetmaster映象到本地。
接下來就可以使用這個映象來構建一個容器,下面就用 docker run 命令構建一個容器。
...
檢視版本號
構建映象
上面我們看到如何拉取並且構建好帶有定製內容的 Docker 映象,那麼我們如何修改自己的映象,並且管理和更新這些映象呢?
- 使用 docker commit 命令
- 使用 docker build 命令和 Dockerfile 檔案
現在我們不推薦使用 docker commit 命令,相反應該使用更靈活更強大的 Dockerfile 來構建映象。不過,為了對 Docker 又一個更深的瞭解,我們還是會先介紹一下 docker commit 構建映象。之後,我們重點介紹Docker 所推薦的構建方法:編寫 Dockerfile 之後使用 docker build
命令。
建立Docker Hub 賬號
構建映象中很重要的一環就是如何共享和釋出映象。可以將映象推送到 Docker Hub中或者自己的私有 Registry 中。為了完成這項工作,需要在 Docker Hub上建立一個賬號
如果你還沒有Docker 通行證,在 hub.docker.com 註冊一個,記下你的使用者名稱,登入本地計算機上的Docker公共登錄檔。使用docker login
,輸入使用者名稱和密碼進行登入
你的個人資訊會儲存在 $HOME/.dockercfg 檔案中
使用 Docker 的commit 命令建立映象
建立 Docker映象的第一種方式是使用 docker commit 命令。可以將此想象為我們是在版本控制系統裡面提交變更,畢竟這和 git commit 命令真是太像了。
我們先從建立一個容器開始,這個容器基於我們前面見過的 ubuntu 映象。如下
接下來,我們在 ubuntu 中安裝 apache 伺服器,使用apt-get -yqq update
和 apt-get -y install apache2
命令。
我們啟動了一個容器,並安裝了 Apache 伺服器,我們會將這個伺服器作為 Web 伺服器執行,所以我們想把它當前狀態儲存起來。這樣下次啟動就不用重新安裝了。為了完成這項工作,需要先使用 exit 從 ubuntu 中退出,之後再執行 docker commit 命令。如下
我們看到,在上圖所示的 docker commit 命令中,指定了要提交修改過的容器ID(可以通過 docker ps -l -q 命令得到剛剛建立的容器 ID),以及一個映象倉庫和映象名,這裡是 jamtur01/puppetmaster
可以使用 docker images jamtur01/puppetmaster
命令檢視剛剛建立的映象。
可以在提交時指定更多的資料,就和 git 的命令是一樣的,使用 docker commit -m
命令
這條命令中我們使用 -m(message) 指定提交資訊,同時指定了 --authro 選項,列出映象作者資訊。接著列出了想要提交的容器ID, 最後指定了 jamtur01/puppetmaster ,併為其打上了 webserver 的tag 標籤。
可以使用 docker inspect
命令來檢視新建立的映象的詳細資訊。
使用 Dockerfile 構建映象
我們並不推薦使用 docker commit 方法來構建映象。相反,我們推薦使用 Dockerfile
和 docker build
的命令來構建映象。Dockerfile 使用基於 DSL 語法的指令來構建一個 Docker 映象,之後使用 docker build 命令基於 Dockerfile 中的指令構建一個新的映象。
我們的第一個 Dockerfile
下面我們建立一個目錄並初始化 Dockerfile,我們建立一個包含簡單web伺服器的Docker映象
如上圖所示,我們在 /usr/local/docker 目錄下建立了一個 static_web
的目錄,再建立了一個 Dockerfile 檔案。那麼這個 static_web 目錄就是我們的構建環境。Docker 稱此環境為上下文(context)
或者 構建上下文(build context)
,Docker 會在構建映象時將構建上下文和該上下文中的檔案和目錄上傳到 Docker 守護程序。這樣 Docker 守護程序就可以直接訪問你映象中的 程式碼、檔案和資料。
下面是一個通過 Dockerfile 來構建 web 伺服器的 Docker 映象
# Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER James Turnbull "[email protected]"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' \
>/usr/share/nginx/html/index.html
EXPOSE 80
該 Dockerfile 由一系列指令和引數組成。每條指令,如FROM,都必須為大寫字母,而且後面要跟隨一個引數: FROM ubuntu:14.04。Dockerfile 中的指令會按照順序由上向下
執行,所以編寫 Dockerfile 時,請注意它的順序。
如果不能使用
:wq
來進行儲存的話,請首先使用sudo su
切換到管理員模式,然後就可以儲存啦。
每條指令都會建立一個新的映象層並對映象進行提交。Docker 大體按照如下流程執行 Dockerfile 指令
- Docker 從基礎映象執行一個容器
- 執行一條指令,對容器作出修改
- 執行類似docker commit 操作,提交一個新的映象層
- Docker 再基於剛提交的映象執行一個新容器
- 執行 Dockerfile 中的下一條指令,直到所有指令都執行完畢
從上面可以看出,如果你的Dockerfile 由於某些原因(例如指令失敗了)沒有正常結束,那麼你將得到了一個可以使用的映象。這對除錯很有幫助: 可以基於映象執行一個具備互動功能的容器,使用最後建立的映象對你最後失敗的指令做出除錯
Dockerfile 也支援中文註釋,以 # 開頭的行都會被認為是註釋。Dockerfile 中的第一行就是註釋的例子
每個 Dockerfile 的第一行指令都應該是 FROM。FROM指令指定一個已經存在的映象,後續指令都將基於該映象進行,這個映象被稱為基礎映象(base image)。
在上面的示例中,我們使用了
ubuntu:14.04
作為新映象基礎映象。基於這個 Dockerfile 構建的新映象以 Ubuntu 14.04 作業系統為基礎。再執行一個容器時,必須要指明基於哪個基礎映象進行構建。接著指定了
MAINTAINER
指令,這條指令會告訴 Docker 該映象的作者是誰,以及作者的電子郵件地址,這有助於標示映象的所有者以及聯絡方式。在這些指令之後,我們指定了三條
RUN
指令。RUN指令會在當前的映象中執行指定的命令。在這個例子中,我們通過 RUN 指令更新了已經安裝的 APT 倉庫,安裝了 nginx 包,之後建立了 /usr/share/nginx/html/index.html 檔案,該檔案由一些簡單的示例文字。像前面說的那樣,每條RUN指令都會建立一個新的映象層,如果該命令執行成功,就會將此映象提交,繼續執行下一條指令。預設情況下,RUN指令會在shell裡使用命令包裝器 /bin/sh -c 來執行。如果是在一個不支援 shell 的平臺上執行或者不希望在 shell 中執行,也可以使用 exec 格式的 RUN 指令
如下 : RUN["apt-get", "install", "-y", "nginx"]
在這種方式中,我們使用陣列的方式來指定要執行的命令和要傳遞的引數。
接著設定了
EXPOSE
命令,這條執行告訴 Docker 容器內的應用程式將會使用容器的指定介面。這並不意味著可以自動訪問任意容器執行中的服務埠,可以指定多個 EXPOSE 指令向外公開多個埠。
基於 Dockerfile 構建新映象
執行 docker build
命令時,Dockerfile 中的所有指令都會被執行並且提交,並且在命令成功結束後返回一個新映象,下面就來看看如何構建一個新映象。
一定不要忘記最後面有個空格 和.
,也可以在構建映象的過程中為映象設定一個標籤: 使用方法為“映象名 : 標籤”,如下所示
指令失敗時呢?
之前大致介紹了一下指令失敗時的執行過程,下面來看一個例子: 假設我們在上面的 Dockerfile 中把 nginx 拼成了 ngnx ,再來構建一遍
我們可以看到,程式出錯了,這個時候我們希望去除錯一下這次失敗。我們使用 docker run 命令來基於這次構建到目前為止已經成功的最後一步建立一個容器,這裡它的ID 是 dee85a65a396
,我們可以使用如下命令
docker run -t -i dee85a65a396 /bin/bash
,來恢復到出錯之前的映象,然後重新執行出錯的指令apt-get install -y ngnx
,可以看到哪裡出錯了
但是感覺這個步驟是多餘了一些,如果 Dockerfile 中出現了錯誤,那麼 Docker 就會給你提示,用不著重新執行命令來找出問題原因。
Dockerfile 和構建快取
由於每一步的結果都會作為下一步的基礎映象,所以Docker 構建映象的過程非常聰明,它會將之前的映象層作為快取。
正如上面 Dockerfile 來舉例,比如,在我們除錯過程中,不需要在第一步和第三步之間做任何修改,因此 Docker 會將之前構建時建立的映象當作快取並作為新的開始點。再次構建時,Docker 會直接從第四步開始。當之前的構建步驟沒有變化時,這會節省大量的時間。如果第一步到第三步之間有什麼變化,則回到第一步開始。
然而,有的時候不希望有快取的功能,這個時候你需要使用 apt-get update
,那麼 Docker 將不會重新整理 APT 包的快取,要想略過快取,可以使用 docker build
的 --no-cache 標誌。
基於構建快取的 Dockerfile 模版
構建快取的一個好處就是,我們可以實現簡單的 Dockerfile 模版,一般會在 Dockerfile 檔案頂部使用相同的指令集模版,比如對 ubuntu ,使用下面的模版
FROM ubuntu:14.04
MAINTAINER James Turnbull "[email protected]"
ENV REFRESHED_AT 2019-08-15
RUN apt-get -qq update
我們來分析一下這個新的 Dockerfile :
- 首先,通過 FROM 指令為新映象設定了一個基礎映象 ubuntu:14.04。
- 接著,使用 MAINTAINER 指令添加了自己的詳細資訊
- 然後,通過 ENV 指令設定了一個名為 REFRESHED_AT 的環境變數,用來表示最後一次的更新時間
- 最後,使用 RUN 指令執行 apt-get -qq update 命令,該指令會重新整理 APT 包的快取,用來確保每個安裝的軟體包都在最新版本。
檢視新映象
現在來看一下新構建的映象,使用 docker images 命令來完成
如果想要了解映象是如何構建出來的,可以使用 docker history 命令,如下
從結果可以看出映象構建的每一層都是哪些指令構成的
從新映象啟動容器
我們可以基於新構建的映象啟動新容器,來檢查我們的構建工作是否正常
在這裡,我們使用 docker run 命令,啟動一個 static_web 的容器, -d
表示的是以分離(detached) 的方式在後臺執行。這種方式適合 nginx守護程序 這種需要長時間執行的程序。我們也指定了需要在 容器中執行的命令: nginx -g "daemon off;"
,將以前臺方式執行 nginx 作為我們的伺服器。
我們這裡也使用了一個新的 -p 標誌,用來控制 Docker 再執行時應該給外部開放哪些埠
- Docker 可以在宿主機上隨機選擇 49153 --- 65535 之間的一個比較大的埠對映到 80 埠上
- 可以在 Docker 宿主機指定一個具體的埠來對映到 80 埠上
使用 docker ps
檢視一下埠分配情況
Docker 把 32769 埠對映到了 80 埠上
也可以通過 docker port
檢視埠的對映情況
Dockerfile 指令
Dockerfile 指令比較多,這裡我們會對 Dockerfile 單獨列一個章節進行說明
將映象推送至 Docker Hub
映象構建完畢之後,我們也可以將它上傳到 Docker Hub 上面去,這樣其他人就能使用這個映象了。
Docker Hub 的私有倉庫是需要收費的
我們可以使用 docker push 命令將映象推送至 Docker Hub。命令如下
為什麼推送不上去?
網上搜索了一下,大概是映象標籤的問題,重新為映象設定一個標籤
然後把這個標籤推送上去,相當於就是把映象推送上去
我們可以在 Docker Hub 上看到我們推送的映象了
刪除映象
如果不再需要一個映象了,也可以將它刪除,使用 docker rmi
命令來刪除一個映象
該操作只能刪除本地映象,如果你已經推送至 Docker Hub 上,那麼你還需要在 Docker Hub 上將其刪除
登入 Docker Hub ,直接點下面的連結刪除
docker rmi 刪除多個容器的方式直接在後面列舉容器即可,中間用空格隔開
總結
本篇文章主要講述了 Docker 中的映象和倉庫的一些概念和基本用法,那麼你是否能回顧起來下面這些內容呢?
- 什麼是映象
- 如何列出Docker中的映象,tag標籤是幹什麼用的
- 如何拉取遠端倉庫中的映象
- 如何查詢映象
- 對於映象構建,你能想到哪些內容
- 如何推送映象至 Docker Hub
- 如何刪除映象
相關推薦
04_Docker入門(下)之docker映象和倉庫的使用
docker映象和倉庫 映象介紹 docker映象是由檔案系統疊加而成的。最低端是一個引導檔案系統,即bootfs。當一個容器啟動後,它會將被移動到記憶體中,而引導檔案系統則會被解除安裝,以留出更多的記憶體以供initrd磁碟映象使用。 docker映象第二層是root檔案系統rootfs,它位
Docker之- 使用Docker 映象和倉庫
目錄 使用Docker 映象和倉庫 什麼是 Docker 映象 列出 Docker 映象 tag 標籤 Docker Hub 拉取映象 查詢映
使用Docker映象和倉庫
前面學習了安裝Docker 和 docker 的一些管理docker容器的命令。 回顧一下 $ sudo docker run -i -t --name another_container ubuntu
docker之安裝使用和映象與容器
一.安裝下載 下載:epel-release-6-8.noarch.rpm 安裝:rpm -Uvh epel-release-6-8.noarch.rpm yum install docker-io 啟動:/etc/init.d/docker start 搜尋映象:docker
Docker學習(三)-----Docker映象和倉庫瞭解以及加速
映象(Image)是構建容器的基礎,映象是一種分層結構的檔案系統。我們可以從倉庫(Repository)中下載映象,而倉庫又儲存在Registry中,Docker Hub是Docker官方提供的Registry。即可以從Docker Hub的頂層倉庫中免費獲取官
docker之 網路模式和跨主機通訊
Docker的四種網路模式Bridge模式 當Docker程序啟動時,會在主機上建立一個名為docker0... Docker的四種網路模式 Bridge模式 當Docker程序啟動時,會在主機上建立一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連線到這個虛擬網橋上。虛擬網橋
docker之安裝使用和鏡像與容器
clas color ear entos earch release span centos hello 一.安裝下載 下載:epel-release-6-8.noarch.rpm 安裝:rpm -Uvh epel-release-6-8.noarch.rpm
Docker容器、映象和檔案的轉化關係
容器轉成映象: sudo docker commit <CONTAINER ID> imagename 容器轉成檔案: sudo docker export <C
Docker安裝及映象和容器的使用
Docker Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。 Docker與常見虛擬化方式的區
Docker之Nginx映象執行
上一篇我們講解關於docker執行hello-world的映象,該映象是由docker自己的映象庫提供的,接下來我們將怎麼講第三方的映象執行起來,這裡通過nginx映象實現第一步:下載Nginx映象我們去下載nginx映象檔案,這裡使用了時速雲的https://hub.ten
Docker之docker映象容器檔案拷貝到宿主主機
docker容器中,那麼如果專案執行之後產生的日誌檔案,我們希望可以本地檢視,那麼就需要把產生的日誌檔案copy到我們本地機器上,來看看具體操作吧。 這裡我們就介於上一篇文章,構建失敗的時候是因為本地機器已經把jpress.war包刪除了,那麼我們先把之前jpress映象裡
Docker之docker私有倉庫搭建(第十七篇)
Docker 已經提供了docker hub倉庫,第三方也提供相應的倉庫,比如網易,時速雲,阿里雲等,那為什麼還要搭建自己私有的倉庫呢?1)網路有關,有的時候你在的環境可能突然就斷網了,但是內部區域網還可以訪問,那麼你就可以去公司私有的倉庫去下載2)安全性,你自己或者公司的專
Docker之修改映象容器(第十三篇)
想想看我們什麼時候會對容器進行儲存呢?一種情況就是容器已經在環境中運行了一段時間,產生了大量的資料,另一種情況就是當最初構建的容器之後,又往容器裡面加入其它專案,不管哪一種,說到底就是容器裡面的東西有變更,或多或少,那麼我們就要對變更之後的容器進行儲存,用於以後備份和恢復
Docker建立rabbitMq映象和容器
前提條件:docker環境,rabbitmq 頁面如下 2.下載映象(這邊用的是阿里的映象庫) # docker pull rabbitmq:3.7-management (如果直接docker pull rabbitmq 下載最新的,預設tag為lat
Windows7下安裝Docker、下載映象和執行OpenTsdb容器
1.Docker溯源 Docker的前身是名為dotCloud的小公司,主要提供的是基於 PaaS(Platform as a Service,平臺及服務)平臺為開發者或開發商提供技術服務,並提供的開發工具和技術框架。因為其為初創的公司,又生於IT行業,dotClo
docker之容器訪問和網絡連接(三)
-name 應用容器 network http containe 地址 ins ODB names 前言 當一臺服務器上部署了多個應用容器,它們直接可能需要相互通信,比如web應用容器需要訪問mysql數據庫容器。 主機訪問容器 通過映射端口的形式我們可以在外部訪問容器內的
Docker——理解好映象和容器的關係
關注公眾號,大家可以在公眾號後臺回覆“部落格園”,免費獲得作者 Java 知識體系/面試必看資料。 映象也是 docker 的核心元件之一,映象時容器執行的基礎,容器是映象執行後的形態。前面我們介紹了容器的用法,今天來和大家聊聊映象的問題。 本文是本系列的第四篇,閱讀前面文章有助於更好的理解本
Docker 之 docker命令介紹
bar centos 參數 help 進入 pac load clas ets 1 概述容器狀態轉換相關的命令列表關系,docker的狀態轉換和管理的命令,即docker的生命周期管理的命令,如下截圖圓形圖標表示docker的狀態方框表示命令執行命令後觸發的事件箭頭的命令
1、為什麼使用docker?之docker簡介
使用Docker可以很方便的建立和管理映象,以及管理已經生成的和正在執行的容器。那麼為什麼使用映象和容器呢?映象是一種檔案儲存方式,可以把許多檔案(如:一個jar包或多個jar)做成一個映象檔案。例如可
學習Docker之Docker初體驗---SpringBoot整合Docker的部署、釋出與應用
準備工作 會一點springboot 不會沒關係,花十幾分鍾補一下Quick-SpringBoot 會一點Maven 不會沒關係,花幾分鐘補一下Maven的快速應用 會一點Linux命令 不會沒關係,花十幾分再補一下Linux菜鳥教程 一臺