Docker制作鏡像的兩種方式


Docker制作鏡像的兩種方式

Docker制作鏡像有兩種方式:docker commit 制作鏡像和基於dockerfile構建鏡像,在《使用Dockerfile制作鏡像》一文中講到如何用dockerfile構建鏡像,里面只用了FROM和RUN命令,比較簡單。

本文講如何用docker commit制作鏡像以及dockerfile的其他命令和用法。

一、dockers commit制作鏡像

通過docker commit制作鏡像,運行一個基礎鏡像,然后在基礎鏡像上進行軟件的安裝和配置文件的修改。然后提交變動到新的鏡像。

1、docker run

1)docker images 先查看有本地已有的鏡像,選擇需要的基礎鏡像,如果沒有需要的,就用docker pull拉取需要的鏡像

2)然后用docker run 將鏡像跑為容器

2、docker commit  -a 作者信息 -m 說明信息 容器名稱  鏡像的名字(自己取一個)

-a 指定作者信息  -m 提交的說明信息  -p在commit時默認暫停容器

具體執行如下圖:

 

 

最后一個紅框中docker commit  命令最后是保存修改成為鏡像的名字,自己取一個就行

3、docker diff 查看鏡像存儲層變化

4、docker history

-q 只顯示鏡像ID

 

說明:

1)用commit鏡像除了真正想要修改的東西外,由於命令的執行,還會有其他文件被改動或添加,如果是安裝軟件包、編譯構建,

將會有大量無關內容被添加進行,這會導致鏡像極為臃腫docker commit意味着對鏡像操作都是黑箱操作,其他人很難知道里面發生了什么,

維護十分困難。官方不建議通過commit方式來創建。

2)如果不擔心鏡像會越來越大的話,這種方式是最自由最簡單的。

二、Dockerfile命令

Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

注意:鏡像構建時,一定要確保每一層只添加真正需要添加的東西,任何無關的東西都應該清理掉

1、FROM  指定基礎鏡像

格式:FROM <image> 或者 FROM <image>:<tag>

比如:FROM centos:7

2、MAINTAINER 指定維護者信息

格式:MAINTAINER <name>

比如:MAINTAINER  hxq  hxq@foxmail.com

3、RUN 執行命令

1)shell模式:

RUN <命令> 就像直接在命令行中輸入的命令一樣

RUN <command> 默認使用`/bin/sh -c `執行命令

例:RUN  yum install -y httpd

例:RUN  echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

2)exec模式

RUN ["可執行文件", "參數1", "參數2"],這更像是函數調用中的格式

說明:RUN命令是用來執行命令行,注意每用一個RUN(dockerfile指令)就是鏡像添加多一層(最大限制127層)。

          執行多個指令用&&來連接(apt-get加上-y,表示系統安裝提示都默認選擇yes,否則制作鏡像失敗;如果&&命令之間有換行,記得行后要帶上 \ )

4、COPY 復制文件

格式:COPY src desc
復制本地主機src目錄或文件到容器的desc目錄,desc不存在時會自動創建。

拷貝文件或目錄到鏡像(不能自動解壓縮)

5、ADD 高級復制

格式:ADD src dest

比如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html

拷貝文件或目錄到鏡像(可以自動解壓縮或者下載)

該命令將復制指定本地目錄中的文件到容器中的dest中,src可以是是一個絕對路徑,也可以是一個URL或一個tar文件,tar文件會自動解壓為目錄。

6、CMD 容器啟動命令

是可以被 docker run 指令覆蓋的,而ENTRYPOINT的參數可以被--entrypoint覆蓋;會比CMD或者docker run指定的命令要靠前執行。

 

7、ENTRYPOINT 入口點
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1,param2 會在shell中執行。
用於配置容器啟動后執行的命令,這些命令不能被docker run提供的參數覆蓋。和CMD一樣,每個Dockerfile中只能有一個ENTRYPOINT,當有多個時最后一個生效。

8、ENV 用設置環境變量

這些環境變量,后續可以被RUN指令使用,容器運行起來之后,也可以在容器中獲取這些環境變量。
格式:EVN key value
比如:ENV word hello
RUN echo $word

9、ARG 構建參數

10、VOLUMN 定義匿名卷

格式: VOLUME ["/data"]
作用是創建在本地主機或其他容器可以掛載的數據卷,用來存放數據。

11、EXPOSE 暴露端口

格式: EXPOSE port [port2,port3,...]
比如: EXPOSE 80 這條指令告訴Docker服務器暴露80端口,供容器外部連接使用。

功能為暴露容器運行時的監聽端口給外部,但是EXPOSE並不會使容器訪問主機的端口,如果想使得容器與主機的端口有映射關系,必須在容器啟動的時候加上 -P參數

12、WORKDIR  指定工作目錄

格式: WORKDIR /path
比如: WORKDIR /path/to/workdir

為后續的RUN CMD ENTRYPOINT指定配置工作目錄,可以使用多個WORKDIR指令,若后續指令用得是相對路徑,則會基於之前的命令指定路徑。

13、USER 指定當前用戶

格式為:USER username
比如:RUN groupadd -r docker && useradd -r -g docker docker

指定容器運行時的用戶名或UID,后續的RUN也會使用指定的用戶。要臨時使用管理員權限可以使用sudo。在USER命令之前可以使用RUN命令創建需要的用戶。

14、HEALTHCHECK 健康檢查

15、ONBUILD 鏡像觸發器

格式:ONBUILD [INSTRUCTION]
該配置指定當所創建的鏡像作為其他新建鏡像的基礎鏡像時所執行的指令。
例如下面的Dockerfile創建了鏡像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py

 

則基於鏡像A創建新的鏡像時,新的Dockerfile中使用from A 指定基鏡像時,會自動執行ONBBUILD指令內容,等價於在新的要構建鏡像的Dockerfile中增加了兩條指令:
FROM A
ADD ./app
RUN python app.py


16、docker build
創建好Dockerfile之后,通過docker build命令來創建鏡像,該命令首先會上傳Dockerfile文件給Docker服務器端,服務器端將逐行執行Dockerfile中定義的指令。
通常建議放置Dockerfile的目錄為空目錄。另外可以在目錄下創建.dockerignore文件,讓Docker忽略路徑下的文件和目錄,這一點與Git中的配置很相似。

通過 -t 指定鏡像的標簽信息

例如:docker build -t regenzm/first_image . ##     "."指定的是Dockerfile所在的路徑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM