1. 程式人生 > >docker學習筆記4.1-使用Dockerfile檔案構建映象

docker學習筆記4.1-使用Dockerfile檔案構建映象

Dockerfile檔案

Dockerfile 使用基於DSL語法的指令來構建一個Docker映象,之後使用docker build命令基於該Dockerfile的指令構建一個新的映象。

  1. 建立Dockerfile檔案

    我們必須建立一個目錄來儲存Dockerfile,這個目錄被稱為構建上下文(build context)。Docker會在構建映象時將該上下文中的所有目錄和檔案都上傳到Docker的守護程序,便於Docker直接訪問你想在映象中儲存的所有程式碼、檔案和資料等。

    建立程式碼如下:

#mkdir static_web
#cd static_web
#vim Dockerfile

博主的Dockerfile檔案如下:
這裡寫圖片描述

  • 每個Dockerfile由一系列的指令和引數構成。
  • 指令必須為大寫字母,而且後面必須要跟一個引數。
  • Dockerfile的指令是從上往下順序執行的。

Dockerfile指令詳解

  • 每個Dockerfile的第一個指令都是FROM,用來指定一個基礎映象。
  • 在上圖的Dockerfile檔案中,我們接著指定了MAINTAINER指令,該指令指明瞭Docker的作者、作者郵箱
  • RUN指令;在上例中我們更新了apt庫並安裝了nginx服務然後建立了nginx的index.html。每條RUN指令執行完畢之後都會提交一個新的映象層,
  • EXPOSE指令;告訴容器中的應用程式在RUN的時候可以訪問指定埠。為了安全,Docker不會主動開啟該埠,之後在RUN的時候開放改埠。EXPOSE指令也可以將多個容器連結,後續再介紹。

Dockerfile執行流程

  1. 從基礎映象執行一個容器
  2. 執行一條指令
  3. 提交一個新的映象層
  4. 基於剛才的映象層構建一個新容器
  5. 執行下一條指令,直到所有指令執行完畢

從這裡也能看到我們Docker採用的“寫時複製”的概念。這樣的好處一方面是輕量化,另一方面就是即使中間某一個指令執行出錯,我們也可以很方便的基於前一個執行完好的映象進行除錯,而且除錯好之後不用再次執行前面已經執行好了的指令。

基於Dockerfile構建新映象

構建映象程式碼如下:

docker build -t="zhangyang/static_web" .

-t 選項指定了建立新映象的倉庫名和映象名。例如我的倉庫名就是自己的名字zhangyang映象名是static_web
最後的 .告訴Docker從當前目錄去尋找Dockerfile檔案,當然也可以指定一個Git的地址。

執行過程如下:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

可以看到,最終返回了該映象的ID b92c35890d8a
而且在每一個step執行完畢之後都會返回一個ID,即Docker會提交每一步的執行結果。

Dockerfile指令執行失敗

博主在這裡把我的dockerfile檔案的nginx故意錯寫為ngnx,然後build.報錯如下:
這裡寫圖片描述
我們可以看到,錯誤出在step4,而在step3結束之後就提交了一個新的映象層e8ec593f1475
我們可以使用命令

docker run -i -t e8ec593f1475 /bin/bash

進入該容器進行除錯,解決了該問題之後再退出容器修改Dockerfile檔案相應的出錯位置。

Dockerfile和構建快取

Docker將每一步結束之後提交的映象層當作快取。

然而有些時候我們必須確保之前的快取被覆蓋掉。例如,如果已經快取了之前的第三步,即 apt-get update 但是我們必須確保接下來安裝的軟體是最新版本,那就必須忽略快取功能。可以使用docker build 的–no-cache 標誌。

docker build --no-cache -t="zhangyang/static_web" .

構建基於快取的Dockerfile模板

我們可以在Dockerfile檔案中使用ENV指令來設定一個環境變數,此環境變數用來指明該模板最後的更新時間。
Dockerfile模板檔案示例如下:

FROM Ubuntu14.04
MAINTAINER zhangyang "[email protected]"
ENV REFRESHED_AT 2014-07-01
RUN apt-get -qq update

博主在上述檔案建立了一個環境變數REFRESHED_AT。
也就是說,在每次需要重新整理構建的時候,只要修改ENV指令中的日期值就可以重置快取,包快取會被update成為最新值。

檢視新映象

docker images zhangyang/static_web 

這裡寫圖片描述

docker history zhangyang/static_web

這條命令會顯示映象構建過程
這裡寫圖片描述
此命令詳細顯示了映象構建的每一層,以及其Docker指令

從新映象啟動容器時的埠設定

-p標誌指定容器在執行時開放哪些埠給宿主機
-P(大寫)標誌將Dockerfile檔案中的EXPOSE指定的埠全部開放

從新映象啟動一個容器:

docker run -d -p 80 --name static_web_2 zhangyang/static_web / nginx -g "daemon off;"

上述命令運行了一個名為static_web_2的新容器,選項-d是告訴Docker在後臺以分離(detached)方式執行,這種模式非常適合nginx這樣需要長時間執行的程序。最後我們還指定了在容器中需要執行的命令:nginx -g “daemon off;”。這將以前臺的方式執行nginx來作為我們的伺服器。

-p選項把80埠開放給了宿主機,Docker可以有兩種模式來開放埠:

  • 在宿主機上隨即選取49153-65535的一個埠對映到容器的80埠
  • 指定具體的埠號對映到80埠

我們可以使用下面的命令來檢視埠分配情況:

docker ps -l

也可以使用docker port ID 埠號 來檢視被對映的宿主機上的具體埠號。

效果如下圖所示:
這裡寫圖片描述

docker run -d -p 127.0.0.1:80:80 --name static_web_2 zhangyang/static_web \nginx -g "daemon off;"

也可以直接指定宿主機上的某一個埠對映給容器。但顯然這樣這能執行一個Docker不利於我們充分發揮Docker的優勢。
如果非要指定宿主機的IP地址的話可以這樣寫:

docker run -d -p 127.0.0.1::80 --name static_web_2 zhangyang/static_web \nginx -g "daemon off;"

該命令會隨機分配一個127.0.0.1上的埠對映到容器的80埠上

相關推薦

docker學習筆記4.1-使用Dockerfile檔案構建映象

Dockerfile檔案 Dockerfile 使用基於DSL語法的指令來構建一個Docker映象,之後使用docker build命令基於該Dockerfile的指令構建一個新的映象。 建立Dockerfile檔案 我們必須建立一個目錄來儲存Doc

3.docker學習筆記:編寫Dockerfile檔案

編寫Dockerfile檔案 編寫規則 在構建新的映象時如果採用docker build的方式是需要編寫Dockerfile檔案的,該檔案定義了容器在建立時的行為(安裝軟體、執行命令、拷貝檔案等)。docker會在build的時候執行相關操作,下面介

Docker學習筆記-- 如何使用Dockerfile構建鏡像

學習筆記 docker 如何使用 Dockerfile是一種被Docker程序解釋的腳本,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程序將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支持的命令,Dock

Docker學習筆記-- 如何使用Dockerfile構建映象

Dockfile是一種被Docker程式解釋的指令碼,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程式將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支援的命令,Docker程式解

docker--學習筆記最後附dockerfile--nginx實例

docker一、docker簡介1、Docker優勢(1)、啟動速度快,秒級實現(2)、資源利用率高,一臺機器可以跑上千個docker容器(3)、更快的交付和部署,一次創建也配置後,可以再任意地方運行(4)、內核級別的虛擬化,不需要額外的hypervisor支持。會有更高的性能和效率(5)、易遷移,平臺依賴性

影象處理與分析(數字影象處理第二版)學習筆記4.1

第四章,頻率域影象增強 1,連續和離散傅立葉變換和反變換表示式? 一維連續:                     二維連續:              一維離散:                 二維離散:              2,二維影象離散

docker學習筆記16:Dockerfile 指令 ADD 和 COPY介紹

一、ADD指令 ADD指令的功能是將主機構建環境(上下文)目錄中的檔案和目錄、以及一個URL標記的檔案 拷貝到映象中。 其格式是: ADD  源路徑  目標路徑 如: #test FROM ubuntu MAINTAINER hello ADD test1.txt t

docker學習筆記18:Dockerfile 指令 VOLUME 介紹

在介紹VOLUME指令之前,我們來看下如下場景需求: 1)容器是基於映象建立的,最後的容器檔案系統包括映象的只讀層+可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來(或者基於容器建立新的映象)。能否可以讓容器程序持久化的資料儲存在主機上呢?這

Docker學習筆記4: Docker-Compose—簡化複雜容器應用的利器

[[email protected] dockerfile_dir]# docker-compose up Building web Step 1 : FROM python:2.7 ---> 77cf0ea98df6 Step 2 : ADD . /code ---> 75cd86

Docker學習筆記五:Dockerfile

通用參考和推薦 docker build命令使用Dockerfile或者上下文構建映象,構建上下文是指定的本地路徑或者URL的檔案。本地路徑是本地檔案系統的目錄,URL是本地的Git倉庫。構建是由Docker守護程序執行的,而不是CLI。構建過程首先要做的就是

Linux學習日記 —— 4.1.2 檔案處理命令之目錄處理命令

目錄處理命令 ————建立目錄———— 命令名稱:mkdir 命令英文原意:make directories 命令所在路徑:/bin/mkdir 執行許可權:所有使用者 語法:mkdir [-p] [目錄名] 功能: 建立新目錄(資料夾) -p

Linux系統程式設計學習筆記1)-檔案的I/O操作

概述 在Linux系統下,通常以一個非負整數來代指一個開啟的檔案,這些檔案可以包括終端,socket,裝置,普通檔案等等。規定的三個標準的檔案描述符為0,1,2下面分別介紹(在互動式shell中,這些檔案描述符通常指向shell執行所在的終端): 檔案描述

docker 學習筆記1)--常用命令

ner 命令 所有 刪除 新的 containe docke 運行 拷貝 docker pull---- 獲取image(鏡像)docker build---- 創建image(鏡像)docker images ----查詢所有的image(鏡像)docker run---

DOCKER 學習筆記4 認識DockerCompose 多容器編排

前言 通過上一節的學習,學會了如何在Linux 環境下搭建Docker並且部署Springboot 專案,並且成功的跑了起來,當然,在生產環境中,不只是需要一個後端的Web 專案,還需要比如 Nginx 作為反向代理。資料庫也需要單獨部署在一個容器裡面,要是我們像之前學過的那樣一個個部署,那豈不是很麻煩。 所

docker學習筆記:簡單構建DockerfileDocker for Windows】

參考與入門推薦:https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html#autoid-0-0-9 最近學習docker,寫一個簡單構建Dockerfile的筆記。 我的系統:Windows 10 Docker版本:Docker for Win

Dockerfile構建映象並測試執行(docker學習筆記2)

Dockerfile構建映象並測試執行 1建立Dockerfile 建立一個空目錄,建立一個名為的檔案Dockerfile,將以下內容複製並貼上到該檔案中,然後儲存。記下解釋新Dockerfile中每個語句的註釋。 # 使用官方Python作為執行時父映象 FR

Docker學習筆記(三):Dockerfile及多步驟構建映象

## Dockerfile指令 官方文件地址:https://docs.docker.com/engine/reference/builder/ Dockerfile是一個文字格式的配置檔案,其內容包含眾多指令,使用者可以使用它快速的建立自定義映象。 ### 部分指令列表 指令|作用|備註 -|-|- FRO

Docker學習筆記——Java及Tomcat Dockerfile

java tomcat dockerfile 1、Java Dockerfile創建項目目錄java,目錄下上傳所需java版本壓縮包,並創建Dockerfile文件,項目結構如下:java -Dockerfile -jdk-8u111-linux-x64.gzDockerfile內容:#

Docker學習筆記1-從0創建並發布一個docker鏡像

雲計算 Docker Docker安裝略運行環境centos7先創建一個本地的目錄[root@localhost /]# mkdir nginx && cd nginx下載示例的配置文件留著備用[root@localhost nginx]# wget http://raw.github

Docker學習筆記-(5)容器數據管理,鏈接容器,構建私有庫

控制 st2 容器數據 pan 備份文件 data- 否則 所有 連接 五、容器數據管理,鏈接容器,構建私有庫 ① 容器數據管理 docker管理數據的方式有兩種: 數據卷 數據卷容器 1. 數據卷 數據卷是一個或多個容器專門指定繞過Union File System的