1. 程式人生 > >深入淺出Docker技術-Dockerfile詳解

深入淺出Docker技術-Dockerfile詳解

一、Dockerfile介紹

    Docker通過讀取Dockerfile裡面的內容可以自動build image,Dockerfile是一個包含了build過程中需要執行的所有命令的文字檔案。也可以理解為Dockfile是一種被Docker程式解釋的指令碼,由一條一條的指令組成,每條指令對應Linux系統下面的一條命令,由Docker程式將這些Dockerfile指令翻譯成真正的Linux命令。Dockerfile有自己書寫格式和支援的命令,Docker程式解決這些命令間的依賴關係,類似於Makefile。

Docker程式將讀取Dockerfile,根據指令生成定製的image。相比image這種黑盒子,Dockerfile這種顯而易見的指令碼更容易被使用者接受,它明確的表明image是怎麼產生的。有了Dockerfile,當我們需要定製自己額外的需求時,只需在Dockerfile上新增或者修改指令,重新生成image即可,省去了敲命令的麻煩。

二、Dockerfile編寫規則及指令說明

Dockerfile的指令是忽略大小寫的,建議使用大寫,使用#作為註釋,每一行只支援一條指令,每條指令可以攜帶多個引數。

Dockerfile的指令根據作用可以分為兩種:構建指令和設定指令。構建指令用於構建image,其指定的操作不會在執行image的容器上執行;設定指令用於設定image的屬性,其指定的操作將在執行image的容器中執行。

  • FROM(指定基礎image)

構建指令,必須指定且需要在Dockerfile其他指令的前面。後續的指令都依賴於該指令指定的image。FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以位於本地倉庫。

該指令有兩種格式:

1

FROM<image>

指定基礎image為該image的最後修改的版本。或者:

1

FROM<image>:<tag>

指定基礎image為該image的一個tag版本。

  • MAINTAINER(用來指定映象建立者資訊)

構建指令,用於將image的製作者相關的資訊寫入到image中。當我們對該image執行docker inspect命令時,輸出中有相應的欄位記錄該資訊。格式:

1

MAINTAINER<name>

  • RUN(執行命令)

構建指令,RUN可以執行任何被基礎image支援的命令。如基礎image選擇了centos,那麼軟體管理部分只能使用centos的命令。該指令有兩種格式:

1

2

RUN<command>(the commandisrun inashell-`/bin/sh-c`)

RUN["executable","param1","param2"...](exec form)

  • CMD(設定容器啟動時執行的操作)

設定指令,用於container啟動時指定的操作。該操作可以是執行自定義指令碼,也可以是執行系統命令。該指令只能在檔案中存在一次,如果有多個,則只執行最後一條。該指令有三種格式:

1

2

CMD["executable","param1","param2"](like an exec,thisisthe preferred form)

CMD commandparam1 param2(asashell)

CMD主要用於container時啟動指定的服務,當Docker run command的命令匹配到CMD command時,會替換CMD執行的命令。

當Dockerfile指定了ENTRYPOINT,那麼使用下面的格式:

1

CMD["param1","param2"](asdefaultparameters toENTRYPOINT)

ENTRYPOINT指定的是一個可執行的指令碼或者程式的路徑,該指定的指令碼或者程式將會以param1和param2作為引數執行。所以如果CMD指令使用上面的形式,那麼Dockerfile中必須要有配套的ENTRYPOINT。

  • ENTRYPOINT(設定容器啟動時執行的操作)

container啟動時執行的命令,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執行最後一條。ENTRYPOINT沒有CMD的可替換特性。兩種格式:

1

2

ENTRYPOINT["executable","param1","param2"](like an exec,the preferred form)

ENTRYPOINT commandparam1 param2(asashell)

該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。

當獨自使用時,如果你還使用了CMD命令且CMD是一個完整的可執行的命令,那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效。

1

2

3

# CMD指令將不會被執行,只有ENTRYPOINT指令被執行;

CMD echo"Hello, World!"

ENTRYPOINT ls-l

另一種用法和CMD指令配合使用來指定ENTRYPOINT的預設引數,這時CMD指令不是一個完整的可執行命令,僅僅是引數部分;ENTRYPOINT指令只能使用JSON方式指定執行命令,而不能指定引數。

1

2

3

FROM ubuntu

CMD["-l"]

ENTRYPOINT["/usr/bin/ls"]

  • USER(設定容器的使用者)

設定指令,設定啟動容器的使用者,預設是root使用者。

1

2

3

# 指定memcached的執行使用者;

ENTRYPOINT["memcached"]

USER daemon

1

ENTRYPOINT["memcached","-u","daemon"]

  • EXPOSE(暴露容器埠)

EXPOSE可以用來暴露埠,或者在docker run時指定 --expose=1234,這兩種方式作用相同。但是, --expose可以接受埠範圍作為引數,比如 --expose=2000-3000。但是,EXPOSE和 --expose都不依賴於宿主機器。預設狀態下,這些規則並不會使這些埠可以通過宿主機來訪問。

基於EXPOSE指令的上述限制,Dockerfile的作者一般在包含EXPOSE規則時都只將其作為哪個埠提供哪個服務的提示。使用時,還要依賴於容器的操作人員進一步指定網路規則,需要配合 docker run-pPORT:EXPORT使用,這樣EXPOSE設定的埠號會被指定需要對映到宿主機器的埠,這時要確保宿主機器上的埠號沒有被使用。如果直接指定 docker run-pEXPORT,這樣EXPOSE設定的埠號會被隨機對映成宿主機器中的一個埠號。不過通過EXPOSE命令文件化埠的方式十分有用。

本質上說,EXPOSE或者 --expose只是為其他命令提供所需資訊的元資料(比如容器間link操作就依賴EXPOSE元資料),或者只是告訴容器操作人員有哪些已知選擇。

格式:

1

EXPOSE<port>[<port>...]

EXPOSE指令可以一次設定多個埠號,相應的執行容器的時候,可以配套的多次使用-p選項。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# 暴露一個埠;

EXPOSE port1

# 如果想代理EXPOSE埠, 相應的執行容器使用的命令;

docker run-pport1 image

# 暴露多個埠;

EXPOSE port1 port2 port3

# 如果想代理EXPOSE埠, 相應的執行容器使用的命令;

docker run-pport1-pport2-pport3 image

# 還可以指定需要對映到宿主機器上的某個埠號;

docker run-phost_port1:port1-phost_port2:port2-phost_port3:port3 image

注意,EXPOSE僅僅是暴露一個埠,一個標識,在沒有定義任何埠對映時,外部是無法訪問到容器提供的服務。而埠對映(-p)是docker比較重要的一個功能,原因在於我們每次執行容器的時候容器的IP地址不能指定,而是在橋接網絡卡的地址範圍內隨機生成的。宿主機器的IP地址是固定的,我們可以將容器的埠的對映到宿主機器上的一個埠,免去每次訪問容器中的某個服務時都要檢視容器的IP的地址。對於一個執行的容器,可以使用docker port加上容器ID和EXPOSE暴露的埠來檢視該埠號在宿主機器上的對映埠。

1

2

$docker port redis6379

0.0.0.0:6380

    相關推薦

    深入淺出Docker技術-Dockerfile

    一、Dockerfile介紹    Docker通過讀取Dockerfile裡面的內容可以自動build image,Dockerfile是一個包含了build過程中需要執行的所有命令的文字檔案。也可以

    docker容器技術Dockerfile(六)

    上一篇文章的連線:docker容器技術之儲存卷(五) 目錄 一、前言 二、Dockerfile 2.1製作映象有兩種: 2.2 什麼是Dockerfile? 2.3 Dockerfile的語法格式 dockerfile做映象時的工作邏輯: .dockering

    docker虛擬化技術dockerfile與實踐

    什麼是dockerfile?     Dockerfile是為基於已有映象快速構建docker image(映象)而設計的,當你使用docker build命令的時候,docker 會讀取當前目錄下的命名為Dockerfile(首字母大寫)的純文字檔案並執行裡面的指令構建出

    dockerfile Docker入門02——Dockerfile

    Docker入門02——Dockerfile詳解   基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE

    Docker官方起步文件總結-第二節:Dockerfile

    Dockerfile A Dockerfile is a text document that contains all the commands a user could call on the

    docker Dockerfile

    如何使用 Dockerfile用來建立一個自定義的image,包含了使用者指定的軟體依賴等。當前目錄下包含Dockerfile,使用命令build來建立新的image,並命名為edwardsbean/centos6-jdk1.7: docker build -t ed

    Docker系列07—Dockerfile

    本文收錄在容器技術學習系列文章總目錄 1、認識Dockerfile 1.1 映象的生成途徑  基於容器製作  dockerfile,docker build   基於容器製作映象,已經在上篇詳細講解過了;這篇主要講解基於Dockerfile,使用docker buil

    Docker筆記(十一):Dockerfile與最佳實踐

    Dockerfile是一個文字檔案,包含了一條條指令,每條指令對應構建一層映象,Docker基於它來構建一個完整映象。本文介紹Dockerfile的常用指令及相應的最佳實踐建議。 1. 理解構建上下文(build context) Docker映象通過docker build指令構建,該指令執行時當前的工作目

    磁盤陣列 RAID 技術原理

    十分 單獨 很好 不同的 raid1 miss 和數 會同 帶寬 RAID一頁通整理所有RAID技術、原理並配合相應RAID圖解,給所有存儲新人提供一個迅速學習、理解RAID技術的網上資源庫,本文將持續更新,歡迎大家補充及投稿。中國存儲網一如既往為廣大存儲界朋友提供免費、精

    Docker常用命令

    nbsp 詳解 .cn 本地 test 並且 www 更多 top docker ps 查看當前正在運行的容器 docker ps -a 查看所有容器的狀態 docker start/stop id/name 啟動/停止某個容器 docker attach id 進

    dockerfile

    rsh add exec 鏡像 一個 pac git 類型 -type 基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE VOLUME WORKDIR USER ARG 基本示例 # Th

    Android熱修復技術原理(最新最全版本)

    總結 核心 桌面圖標 實時 開源 穩定性 安卓 定義 check 本文框架 什麽是熱修復? 熱修復框架分類 技術原理及特點 Tinker框架解析 各框架對比圖 總結 ??通過閱讀本文,你會對熱修復技術有更深的認知,本文會列出各類框架的優缺點以及技術原理,文章末尾簡單描述

    CentOS7下如何正確安裝並啟動Docker(圖文

    main transacti linux. 機制 cee HA 管理 docke project   我使用了CentOS 7操作系統,可以非常容易地安裝Docker環境。假設,下面我們都是用root用戶進行操作,執行如下命令進行準備工作: yum install

    Dockerfile(二)

    -h poi cd命令 資源 自動 創建 圖片 技術分享 efault Dockerfile文件詳解 什麽是dockerfile? Dockerfile是一個包含用於組合映像的命令的文本文檔。可以使用在命令行中調用任何命令。 Docker通過讀取Dockerfile中的指

    docker網絡

    asq docker網絡 原因 iptable 外網 -s table 改ip 網卡 docker三種默認網絡: none/host/bridgehost是 --network=host 這種就是和主機在同一網絡,沒有實現隔離,主機的端口用過以後 容器無法使用 ,但是效率

    區塊鏈溯源的技術架構

            隨著近兩年區塊鏈技術的發展,區塊鏈防偽溯源的特性被認為是最有應用前景的區塊鏈落地領域之一,各大科技巨頭紛紛佈局,那麼區塊鏈溯源系統搭建的過程中,技術架構層面有哪些需要注意的事項呢?   資料溯源技術的關鍵,在於資料模型的構建,它決定了

    區塊鏈以及區塊鏈技術入門(2)

    很多人迷惑於區塊鏈和以太坊,不知如何學習,本文簡單說了一下學習的一些方法和資源。 一、    以太坊和區塊鏈的關係      從區塊鏈歷史上來說,先誕生了比特幣,當時並沒有區塊鏈這個技術和名詞,然後業界從比特幣中提取了技術架構和體系,稱

    區塊鏈以及區塊鏈技術入門(1)

    區塊鏈是目前一個比較熱門的新概念,蘊含了技術與金融兩層概念。從技術角度來看,這是一個犧牲一致性效率且保證最終一致性的的分散式的資料庫,當然這是比較片面的。從經濟學的角度來看,這種容錯能力很強的點對點網路,恰恰滿足了共享經濟的一個必須要求——低成本的可信環境。 1. 技術人員看待區塊鏈的正確姿勢

    web前端技術內容之Vue.js框架

    Vue.js是一個漸進式框架,只需要具備基本的HTML/CSS/JavaScript基礎就可以快速上手。在用Vue.js構建大型應用時推薦使用NPM安裝,但是需要注意npm的版本需要大於3.0。在通過npm安裝專案後,我們需要對其目錄進行解析:(1)Build:專案構建(webpack)相關程式碼;(2)co

    誰用光了磁盤?Docker System命令

    network 清理 容器 查看 vol ner oci overlay asc 譯者按: Docker鏡像,容器,數據卷以及網絡都會占用主機的磁盤空間,這樣的話,磁盤很容易就會被用完。這篇博客介紹了一個簡單的解決方案 - Docker System命令。 原文: Wh