Docker之Dockerfile详解
生活随笔
收集整理的這篇文章主要介紹了
Docker之Dockerfile详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Dockerfile創建鏡像
- Dockerfile是一個文本格式的配置文件,我們可以利用Dockerfile來快速的創建一個自定義的鏡像。
基本結構
- Dockerfile由一行命令語句組成,并且支持以#開頭的注釋
- 一般包括四個部分:基礎鏡像信息,維護者信息,鏡像操作指令,容器啟動時執行指令,如下一個案例
- 如上是一個官網的Demo,一開始指定所基于的鏡像名稱,之后是維護者的信息,后面才是鏡像操作的指令,例如RUN指令將對鏡像執行跟隨在后面的命令,CMD用來指定運行容器時候的操作命令。
- 如下是一個更復雜一點的案例,基于buildpack-deps:jessie-scm基礎鏡像,安裝Golang相關環境,制作一個GO語言的運行環境鏡像(先看看就行):
指令說明
- 指定所創建鏡像的基礎鏡像,如果本地不存在,默認去Docker Hub上下載,格式:FROM < image>
- 任何一個Dockerfile中第一條指令必須是FROM,并且,如果在同一個Dockerfile中創建多個鏡像,可以用多個FROM指令
- 指定維護者信息,格式MAINTAINER< name>。信息會寫入生成鏡像的Author屬性域中例如:
- 運行指定命令格式如下
- 上面第一個命令默認將在shell中斷中運行,即 /bin/sh -C ,后面的使用exec執行不會啟動shell環境
- 每一條RUN指令將在當前鏡像的基礎上執行指定的命令,并且提交為新的進行,當命令比較長的時候,可以用\ 來換行,比如:
- CMD指令用來指定啟動容器時候默認執行的命令,他支持三種格式:
- CMD[“executable”, “param1”, “param2”] 使用exec執行,是推薦使用的方式
- CMD command param1 param2 在/bin/sh 中執行,提供給需要交互的應用
- CMD [“param1”, “param2”]提供給ENTRYPOINT的默認數
- 每個DOckerfile只能有一條CMD命令,如果指定多條,最后一條覆蓋之前的
- LABEL指令用來指定生成鏡像的元數據標簽信息
- 格式為如下例如
- 聲明鏡像內服務所監聽的端口
- 格式如下。 例如
- 改指令只是起到聲明作用,不會自動完成端口映射
- 啟動容器時候需要使用-P,Docker主機會自動分配一個宿主機臨時端口轉發到指定的端口,使用-p,則可以具體的指定哪個宿主機本地端口會映射過來。
- 指定環境變量,在鏡像生成過程中會被后續RUN指令使用,在鏡像啟動的容器中也會存在
- 格式…。如下:
- 指令指定的環境變量在運行時可以被覆蓋掉,比如docker run --evn< key>=< value>built_image
- 該命令將復制指定額< src> 路徑下的內容到容器中的< dest> 路徑下,格式如下
- 其中< src> 可以是Dockerfile所在的目錄的一個相對路徑,也可以是一個URL,還可以是一個tar文件。< desc>可以使鏡像內部的絕對路徑,或者相對于工作目錄的相對路徑。
- 格式如下,復制本地主機的< src> (為Dockerfile所在目錄的相對路徑,文件,或者目錄) 下的內容 到鏡像中的< dest> 下。目標路徑不存在時候回自動創建 。路徑支持正則,當使用本地目錄為源目錄時候,推薦使用COPY
- 指定鏡像的默認入口命令,該入口命令會在啟動容器時候作為命令執行,所有傳入值作為改命令的參數,支持如下兩種格式
- 每個Dockerfila中只能有一個ENTRYPOINT,當指定過個時候,只有最后一個有效,在運行時候可以被–entrypoint參數覆蓋掉,如docker run–entrypoint
- 創建一個數據卷掛載點, 可以從本地主機或者其他容器掛載數據卷,一般用來存放數據庫和需要保存的數據等。格式如下
- 指定運行容器時候的用戶名或者UID,后續的RUN等指令也會使用指定的用戶身份格式如下:
- 需要臨時獲取管理員權限可以使用gosu或者sudo
- 為后續的RUN,CMD和ENTRYPOINT指令配置工作目錄,格式如下
- 如上案例,可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑。最終的路徑為/a/b/c
- 指定一些鏡像內使用的參數(例如版本號信息等),這些參數在執行docker build命令時以下格式傳入
- 配置當所有創建的鏡像作為其他鏡像的基礎鏡像時,所執行的創建操作指令,格式如下:
- 如果基于image-A創建新的鏡像時候,新的Dockerfile使用FROM image-A指定基礎進行,會自動執行ONBUILD指令的內容,等價于在后面添加了兩條指令,如下:
- 使用ONBUILD指令的鏡像,推薦在邊去中注明,例如ruuby:1.9-onbuild
- 指定所創建的鏡像啟動的容器接受退出的信號值,例如:
- 配置所啟動容器如何進行健康檢查(如何判斷健康與否),自Docker1.12開始支持,格式如下:
- OPTION參數支持如下:
- __interval=DURATION(默認30s):過多久檢查一次
- __timeout=DURATION(默認30s):每次檢查等待結果的超時
- __retries=N(默認為3):如果失敗,重試幾次才最終確定失敗。
創建鏡像
- 編寫完Dockerfile后,可以通過docker build命令來創建鏡像,基礎格式如下:
- 如上命令將讀取指定路徑下(包括子目錄)的Dockerfile文件,并將該路勁下所有內容發送給Docker 服務端,由服務端來創建鏡像,因此除非生成鏡像需要,否則一般建議放置Dockerfile的目錄為空目錄。
- 如果使用非內容路徑下Dockerfile,可以通過-f 選項指定其他路徑
- 要指定生成鏡像的便簽可以用-t 選項
- 案例:指定Dockerfile路徑/tmp/docker_builder/,并且生成鏡像標簽為build_repo/first_image,命令如下
使用.dockerignore文件
- 上說的,Dockerfile路徑下的所有文件都會發到Docker服務端打包,那肯定有響應的規避措施,
- 我們通過.dockerignore文件(沒一行添加一條匹配模式)來讓Docker忽略匹配模式路徑下的目錄和文件。如下:
Dockerfile實戰測試
- 以下將分別通過docker commit命令方式,Dockerfile的方式分別為鏡像添加SSH服務并且生成新的鏡像文件,來對象兩者的區別,
通過docker commit 方式創建鏡像
- Docker提供了docker commit 命令,支持用戶提交自己對指定容器的修改,并且生成新的鏡像在本地。格式如下:
- 如下步驟依次執行:
使用Dockerfile創建
- 依次按如下步驟
- 編寫Dockerfile,下面是Dockerfile的內容以及部分的解釋信息,可以對比docker commit 命令創建的過程,操作基本一致:
- 創建鏡像:在sshd_ubuntu目錄下使用docker build命令創建鏡像,
- 查看本地ssh:Dockerfile鏡像已經存在:
- 測試啟動鏡像運行容器效果與上面一致
總結
- Dockerfile使用前需要熟悉每個命令,多實踐,自己寫一些簡單的案例測試,弄清楚原理在寫,Docker Hub官方倉庫有很多優秀鏡像對應的Dockerfile可以借鑒學習
- 創建原則有如下幾個:
- 精簡鏡像用途:
- 選合適基礎鏡像
- 提供足夠清晰的命令注釋和維護者信息
- 正確使用版本號碼
- 減少鏡像層數
- 及時刪除臨時文件和緩存文件
- 提高生成速度
- 調整合理的指令順序
- 減少外部源干擾
上一篇:Docker中數據管理
下一篇:Docker容器實戰思維
總結
以上是生活随笔為你收集整理的Docker之Dockerfile详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 呼啦圈的危害
- 下一篇: 阑尾炎术后多久可以同房