Docker鏡像的基本瞭解和使用

獲取鏡像

許多優質的鏡像都可以在docker hub 上獲取使用
https://hub.docker.com/search/?q=&type=image

點開網站可以看見衆多優質鏡像可供使用,

從 Docker Registry 獲取鏡像的命令是 docker pull 。其命令格式爲:

 docker pull [選項] [Docker Registry地址]<倉庫名>:<標籤>

格式說明如下:
Docker Registry地址:地址的格式一般是 <域名/IP>[:端口號] 。默認地址是 Docker Hub。

倉庫名:如之前所說,這裏的倉庫名是兩段式名稱,既 <用戶名>/<軟件名> 。 對於 Docker Hub,如果不給出用戶名,則默認爲 library ,也就是官方鏡 像。

比如: docker pull ubuntu:18.04
上面的命令中沒有給出 Docker Registry 地址,因此將會從 Docker Hub 獲取鏡像。而鏡像名稱是 ubuntu:18.04 ,因此將會獲取官方鏡像 library/ubuntu 倉庫中標籤爲 14.04 的鏡像。

再有就是一些 常用的docker 命令:

1.docker images :列出已經下載下來的鏡像
列表包含了倉庫名、標籤、鏡像 ID、創建時間以及所佔用的空間。鏡像ID是鏡像唯一標識,同一個鏡像可以對應多個標籤

2.docker images [倉庫名和標籤] :根據倉庫名和標籤列出鏡像

3.docker images -f since=mongo:3.2 :在 mongo:3.2 之後建立的鏡像,-f 簡寫–filter,使用過濾列出鏡像,since=mongo:3.2指在mongo:3.2之後,相反 before 之前。

4.docker commit:docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]],們定製好了變化,我們希望能將其保存下來形成鏡像。 要知道,當我們運行一個容器的時候(如果不使用卷的話),我們做的任何文件修 改都會被記錄於容器存儲層裏。而 Docker 提供了一個 docker commit 命令,可 以將容器的存儲層保存下來成爲鏡像。換句話說,就是在原有鏡像的基礎上,再疊 加上容器的存儲層,並構成新的鏡像。

5.docker rmi [選項] <鏡像1> [<鏡像2> ...]:如果要刪除本地的鏡像,可以使用 docker rmi 命令,docker rm 命令是刪除容器,不要混淆,其中, <鏡像> 可以是 鏡像短 ID 、 鏡像長 ID 、 鏡像名 或者 鏡像摘要 。

使用 Dockerfile 定製鏡像

鏡像的定製實際上就是 定製每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作 的命令都寫入一個腳本,用這個腳本來構建、定製鏡像,那麼之前提及的無法重複 的問題、鏡像構建透明性的問題、體積的問題就都會解決

Dockerfile指令

COPY 複製文件

格式:
COPY <源路徑>... <目標路徑> 
COPY ["<源路徑1>",... "<目標路徑>"]
COPY 指令將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像 內的 <目標路徑> 位置

ADD 更高級的複製文件

ADD 指令和 COPY 的格式和性質基本一致。但是<源路徑>可以是一個 URL,這樣docker會去下載鏈接的文件放到<目標路徑>,官方推薦儘量使用Copy,最適合使用 ADD 的場合,就是所提及的需要自動解壓縮的場合。

CMD 容器啓動命令

CMD 指令的格式和 RUN 相似,也是兩種格式:
 shell 格式: CMD <命令> 
 exec 格式: CMD ["可執行文件", "參數1", "參數2"...] 
 參數列表格式: CMD ["參數1", "參數2"...] 。在指定了 ENTRYPOINT 指 令後,用 CMD 指定具體的參數。
 CMD 指令就是用於 指定默認的容器主進程的啓動命令的。

ENTRYPOINT 入口點

 shell 格式: CMD <命令> 
 exec 格式: CMD ["可執行文件", "參數1", "參數2"...] 
 當指定了 ENTRYPOINT 後, CMD 的含義就發生了改變,不再是直接的運行其命 令,而是將 CMD 的內容作爲參數傳給 ENTRYPOINT 指令,換句話說實際執行 時,將變爲:
  <ENTRYPOINT> "<CMD>"

ENV 設置環境變量

  格式有兩種: 
  ENV <key> <value> 
  ENV <key1>=<value1> <key2>=<value2>...
  這個指令很簡單,就是設置環境變量而已,無論是後面的其它指令,如 RUN ,還 是運行時的應用,都可以直接使用這裏定義的環境變量。 
  ENV VERSION=1.0 DEBUG=on \ 
  	  NAME="one"
  	  這個例子中演示瞭如何換行,以及對含有空格的值用雙引號括起來的辦法
  	  在某些指令可以進行 環境變量使用:$VERSION ,加$即可
  	  下列指令可以支持環境變量展開: ADD 、 COPY 、 ENV 、 EXPOSE 、 LABEL 、 USER 、 WORKDIR 、 VOLUME 、 STOPSIGNAL 、 ONBUILD 。

ARG 構建參數

  格式: ARG <參數名>[=<默認值>]
  構建參數和 ENV 的效果一樣,都是設置環境變量。所不同的是, ARG 所設置的 構建環境的環境變量,在將來容器運行時是不會存在這些環境變量的。

VOLUME 定義匿名卷

  格式爲:
  VOLUME ["<路徑1>", "<路徑2>"...] 
  VOLUME <路徑>
  爲了防止運行時用戶忘記將動態文件所保存目 錄掛載爲卷,在 Dockerfile 中,我們可以事先指定某些目錄掛載爲匿名卷,這 樣在運行時如果用戶不指定掛載,其應用也可以正常運行,不會向容器存儲層寫入 大量數據。

EXPOSE 聲明端口

  
  格式爲 
  EXPOSE <端口1> [<端口2>...]

WORKDIR 指定工作目錄

  格式爲 
  WORKDIR <工作目錄路徑> 。
  使用 WORKDIR 指令可以來指定工作目錄(或者稱爲當前目錄),以後各層的當前 目錄就被改爲指定的目錄,該目錄需要已經存在, WORKDIR 並不會幫你建立目錄。
  如果需要改變以後各層的工作目錄的位置,那麼應該使用 WORKDIR 指令。

USER 指定當前用戶

  格式: 
  USER <用戶名>
  USER 指令和 WORKDIR 相似,都是改變環境狀態並影響以後的層。 WORKDIR 是改變工作目錄, USER 則是改變之後層的執行 RUN , CMD 以及 ENTRYPOINT 這類命令的身份。 當然,和 WORKDIR 一樣, USER 只是幫助你切換到指定用戶而已,這個用戶必 須是事先建立好的,否則無法切換。

HEALTHCHECK 健康檢查

  格式:
  HEALTHCHECK [選項] CMD <命令> :設置檢查容器健康狀況的命令 
  HEALTHCHECK NONE :如果基礎鏡像有健康檢查指令,使用這行可以屏蔽掉 其健康檢查指令

ONBUILD 爲他人做嫁衣裳

  格式: 
  ONBUILD <其它指令> 。 
  ONBUILD 是一個特殊的指令,它後面跟的是其它指令,比如 RUN , COPY 等, 而這些指令,在當前鏡像構建時並不會被執行。只有當以當前鏡像爲基礎鏡像,去 構建下一級鏡像的時候纔會被執行。 Dockerfile 中的其它指令都是爲了定製當前鏡像而準備的,唯有 ONBUILD 是 爲了幫助別人定製自己而準備的。

鏡像的實現原理

Docker 鏡像是怎麼實現增量的修改和維護的?

每個鏡像都由很多層次構成, Docker 使用 Union FS 將這些不同的層結合到一個鏡像中去。 通常 Union FS 有兩個用途, 一方面可以實現不借助 LVM、RAID 將多個 disk 掛到 同一個目錄下,另一個更常用的就是將一個只讀的分支和一個可寫的分支聯合在一 起,Live CD 正是基於此方法可以允許在鏡像不變的基礎上允許用戶在其上進行一 些寫操作。 Docker 在 AUFS 上構建的容器也是利用了類似的原理。

Dockerfie 官方文檔:https://docs.docker.com/engine/reference/builder/
Dockerfile 最佳實踐文檔:https://docs.docker.com/engine/userguide/eng- image/dockerfile_best-practices/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章