Docker映象構建 Dockerfile

2021-10-05 15:14:59 字數 3809 閱讀 5154

docker machine

docker swarm

docker compose

那麼在很多的生產環境中,我們可能需要構建適合自己生產環境的映象,應為github不可能擁有所有場合下都適用的映象!那麼這個時候我們就必須得構建自己映象

那麼構建映象的方式有兩種

基於容器提交為乙個新的映象:此種方法我們需要先執行乙個容器,然後對容器進行自定義配置,當我們配置完畢後,通過docker commint命令就可以生成乙個新的映象

基於dockerfile構建映象:我們無需提前執行乙個容器,只需要將你所要執行的配置編排到乙個dockerfile檔案中,然後直接通過docker build命令自動構建即可!

dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於基礎映象並最終建立乙個新的映象。它們簡化了從頭到尾的流程並極大的簡化了部署工作。dockerfile從from命令開始,緊接著跟隨者各種方法,命令和引數。其產出為乙個新的可以用於建立容器的映象。

dockerfile 一般分為四部分:基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行指令,』#』 為 dockerfile 中的注釋。

下面我們來了解一下dockerfile中常用的操作指令

from 指定基於哪個基礎映象,必須為第乙個命令

**語法:**

from from :from @**示例**

from php:5.6

注意:tag和digest是可選的,如何不使用這兩個值時,會使用latest版本的基礎映象,並以lates為tag

格式:

maintainer 示例:

maintainer fendo fendo

maintainer fendo.com

maintainer fendo fendo

將本地檔案複製到映象中

格式:copy 《源路徑》... 《目標路徑》

copy ["《源路徑1>",... "《目標路徑》"]

copy指令有兩種格式,第一種後邊直接跟shell命令,第二種類似於函式呼叫

add 指令和 copy 的格式和性質基本一致,但是在 copy 基礎上增加了一些功能:

如果 《源路徑》 為乙個 tar 壓縮檔案的話,壓縮格式為 gzip , bzip2 以及 xz 的情況下, add 指令將會自動解壓縮這個壓縮檔案到 《目標路徑》 去

run用於在映象容器中執行命令,其有以下兩種命令執行方式:

格式:run run ["executable", "param1", "param2"]

第一種後邊直接跟shell命令:

在linux作業系統上預設 /bin/sh -c,在windows作業系統上預設 cmd /s /c

第二種是類似於函式呼叫:

可將executable理解成為可執行檔案,後面就是兩個引數

run  mkdir -p /opt/tom/web

run [「ls」,」-l」,」/opt/tom/web」]

暴漏容器執行時的監聽埠給外部

格式:expose port/協議(預設為tcp協議)

注意:此處暴漏埠並不是直接暴漏給外部,而是允許暴露給外部,你若不通過-p或者-p引數指定埠對映,外部是無法直接訪問的

建立乙個可以從本地主機或其他容器掛載的掛載點。

容器執行時應該盡量保持容器儲存層不發生寫操作,對於資料庫類需要儲存動態資料的應用,其資料庫檔案應該儲存於卷(volume)中,在dockerfile 中,我們可以事先指定某些目錄掛載為匿名卷,這樣在執行時如果使用者不指定掛載,其應用也可以正常執行,不會向容器儲存層寫入大量資料。

格式:volume ["《路徑1>", "《路徑2>"...]

volume 《路徑》

使用 workdir 指令可以來指定工作目錄( 或者稱為當前目錄) ,以後各層的當前目錄就被改為指定的目錄,如該目錄不存在, workdir 會幫你建立目錄

格式:workdir 《工作目錄路徑》

例項:比如要在/opt/docker/下建立乙個file.txt檔案

你可以把/opt定義為工作目錄,這樣在建立這個檔案時直接寫相對路徑就可以了

workdir /opt

run touch docker/file.txt

容器啟動時要執行的命令

格式:cmd cmd ["executable","param1","param2"]

cmd ["param1","param2"]

entrypoint  配置容器,容器啟動時要執行的命令,它和cmd很像,也是只有一條生效,如果寫多個只有最後一條有效。和cmd不同是:cmd 是可以被 docker run 指令覆蓋的,而entrypoint不能覆蓋

格式:entrypoint command param1 param2

entrypoint ["executable", "param1", "param2"]

設定環境變數,它主要是為後續的run指令提供乙個環境變數

格式:env env =...

示例:env myname fendo

env mydog fendo dog

env mycat fendo

user 指令和 workdir 相似,都是改變環境狀態並影響以後的層。 workdir 是改變工作目錄, user 則是改變之後層的執行 run , cmd 以及 entrypoint 這類命令的身份。當然,和 workdir 一樣, user 只是幫助你切換到指定使用者而已,這個使用者必須是事先建立好的,否則無法切換。

格式user 《使用者名稱》

onbuild 是乙個特殊的指令,它後面跟的是其它指令,比如 run , copy 等,而這些指令,在當前映象構建時並不會被執行。只有當以當前映象為基礎映象,去構建下一級映象的時候才會被執行

格式:onbuild [instruction]

比如當前映象為a,在dockerfile種新增:

onbuild run ls -al

這個 ls -al 命令不會在a映象構建或啟動的時候執行

此時有乙個映象b是基於a映象構建的,那麼這個ls -al 命令會在b映象構建的時候被執行。

容器健康狀況檢查命令

格式:healthcheck [options] cmd command

healthcheck none

第乙個的功能是在容器內部執行乙個命令來檢查容器的健康狀況

第二個的功能是在基礎映象中取消健康檢查命令

[options]的選項支援以下三中選項:

--interval=duration 兩次檢查預設的時間間隔為30秒

--timeout=duration 健康檢查命令執行超時時長,預設30秒

--retries=n 當連續失敗指定次數後,則容器被認為是不健康的,狀態為unhealthy,預設次數是3

cmd後邊的命令的返回值決定了本次健康檢查是否成功,具體的返回值如下:

0: success - 表示容器是健康的

1: unhealthy - 表示容器已經不能工作了

2: reserved - 保留值

docker構建映象

做映象就是構建映象!提交容器更改,生成新的映象!docker commit 容器名 新映象的名字 tag 例如 將web2容器提交為乙個新的映象,新映象的名字為nginx 1.1 在docker中映象的儲存方式是分層儲存的!每個映象都會有不同層數!映象的層數只能增加不能減少!映象是唯讀的!裡面的記憶...

docker構建映象

建立docker映象有兩種方法。1。docker commit 這種不推薦,就不介紹了。2。用docker build命令和dockerfile檔案 下面構建乙個nginx小應用。建立資料夾 mkdir static web 進入這個資料夾 cd static web 建立dockerfile檔案 ...

Docker 構建映象

docker 構建映象 1 首先,在專案的根目錄下,新建乙個文字檔案.dockerignore,寫入下面的內容。git node modules npm debug.log 2 然後在專案的根目錄下,新建乙個文字檔案 dockerfile,寫入下面的內容。run npm install regist...