構建私有映象

2021-10-24 15:26:00 字數 4101 閱讀 6992

以官方nginx映象為例,使用dockerfile來定製映象。

mkdir mynginx

cd mynginx

touch dockerfile

在dockerfile檔案中寫入以下內容:

from nginx

run echo

''> /usr/share/nginx/html/index.html

使用docker build命令建立映象

docker build -t mynginx:1.0 .
執行docker run命令,既可以執行構建好的mynginx映象,通過瀏覽器 http://ip:8080 即可訪問nginx服務

from 指定基礎映象

所謂定製映象,一定是以乙個映象為基礎,在其上進行定製。基礎映象是必須指定的,而from指令就是指定基礎映象,因此乙個dockerfile中from是必需的,並且一定是第一條指令。 在docker hub上有許多高質量的官方映象,如nginx,redis,mysql,tomcat,centos,ubuntu等,可以在其中找到乙個符合我們要求的映象為基礎映象進行定製。

除了選擇現有的映象為基礎外,docker還存在乙個特殊的映象,名為scratch。這個映象是虛擬的概念,並不實際存在,它表示乙個空白的映象。

如果以scratch映象為基礎映象的話,意味著不以任何映象為基礎,接下來所寫的指令將作為映象的第一層開始存在。 對於linux下靜態編譯程式來說,並不需要有作業系統提供執行時支援,所需的一切庫都已經在可執行檔案裡了,因此直接使用from scratch會讓映象的體積更小。使用go語言開發的應用很多會使用這種方式來製作映象,這也是為什麼有人認為go特別適合容器微服務架構語言的原因之一。

run 執行命令

run指令是用來執行命令列命令的,由於命令列的強大能力,run指令在定製映象時是最常用的指令之一。其格式有兩種: shell格式:run 《命令》

run echo

''> /usr/share/nginx/html/index.html

exec格式:run [「可執行檔案」,「引數1」, 「引數2」 ]

run tar -xzf redis.tar.gz -c /usr/src/redis--strip-components=1

run make -c /usr/src/redis

run make -c /usr/src/redis install

copy 複製檔案

格式:

copy指令將從構建上下文目錄中《原始檔》的檔案/目錄複製到新的一層映象的《目標路徑》位置,如:

《原始檔》可以是多個,甚至可以是萬用字元,如:

copy hom* /mydir/

copy hom?.txt /mydir/

add 檔案複製

cmd 容器啟動命令

cmd指令的格式和run相似,也是兩種格式: shell格式:cmd 《命令》 exec格式:cmd [「可執行檔案」,「引數1」, 「引數2」 ] 引數列**式:cmd [「引數1」, 「引數2」 ],在指定entrypoint指令後,用cmd指定具體的引數

docker不是虛擬機器,容器就是程序。既然是程序,那麼在啟動容器的時候,需要指定所執行的程式及引數,cmd指令就是用於指定預設的容器主程序啟動命令的。

entrypoint 入口點

entrypoint的目的和cmd一樣,都是在指定容器啟動程式及引數。entrypoint在執行的時也可以替代,不過比cmd要略顯繁瑣,需要通過docker run的引數–entrypoint來指定。 當指定了entrypoint後,cmd的含義就發生了改變,不再是直接的執行其命令,而是將cmd的內容作為引數傳給entyrypoint指令。

env 設定環境變數

格式有兩種:

這個指令很簡單,就是設定環境變數而已,後面的其他指令都可以使用這裡定義的環境變數。

env version=1.0 debug=on

$version

# 使用前面定義的環境變數version

arg 構建引數

格式:arg 《引數名》 [=《預設值》] 構建引數和env的效果一樣,都是設定環境變數。所不同的是,arg所設定的構建環境的環境變數,在之後容器執行時是不會存在這些環境變數的,但是不要因此就使用arg儲存密碼之類的資訊,因為docker history還是可以看到所有值的。 dockerfile中的arg指令是定義引數名稱,以及定義其預設值,該預設值可以在構建命令docker build 中用–build-arg 《引數名》=《值》來覆蓋。

volume 定義匿名卷

格式為:

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

volume /data
這裡的 /data 目錄就會在執行時自動掛載為匿名卷,任何向 /data 中寫入的資訊都不會記錄到容器儲存層,從而保證了容器儲存層的無狀態化,當然執行時也可以覆蓋這個掛載設定,如:

docker run -d -v mydata:/data ***x
在這行命令中,就使用了mydata這個命令卷掛載到了 /data 這個位置,替代了dockerfile中定義的匿名卷的掛載位置。

expose 宣告埠

格式為 expose 《埠》 [《埠》…] expose指令時宣告執行時容器提供的服務埠,這只是乙個宣告,在執行時並不會因為這個宣告應用就會開啟這個埠的服務。 在dockerfile中寫入這樣的宣告有兩個好處:

是幫助映象使用者理解這個映象服務的守護埠,以方便配置對映

在執行時使用隨機埠對映時,也就是 docker run -p 時,會自動隨機對映expose的埠

workdir指定工作目錄

格式為 workdir 《工作目錄路徑》 使用workdir指令可以用來指定工作目錄(或者稱為當前目錄),以後各層的當前目錄就被改為指定目錄,如該目錄不存在,則會自動建立。 初學者可能遇到的錯誤是將dockerfile當shell指令碼來寫,這種錯誤的理解還可能會導致下面的錯誤:

run echo

"hello"

> world.txt

usre 指定當前使用者

格式為 user 《使用者名稱》 user指令和workdir指令都是改變環境狀態並影響以後的層。workdir是改變工作目錄,user是改變之後層的執行run,cmd以及entrypoint這類命令的身份。 user只是幫助切換指定使用者,如果使用者不存在,則無法切換。

run groupadd -r redis &&

useradd -r -g redis redis

user redis

run [

"redis-server"

]

healthcheck 健康檢查

格式:

healthcheck指令告訴docker應該如何判斷容器的狀態是否正常,這是docker 1.12引入的新指令。通過該指令指定一行命令,用這行命令來判斷容器主程序的服務狀態是否正常,從而比較真實的反應容器實際狀態。 乙個映象指定了healthcheck指令後,其容器啟動,初始狀態會為starting,在執行健康檢查成功後變為healthy,如果連續一定次數失敗,則會變為unhealthy。 healthcheck支援下列選項:

為了幫助健康檢查,健康檢查命令的輸出(包括stdout以及stderr)都會被儲存於健康檢查狀態裡,可以用docker inspect 來檢視。

1 1 4 構建私有映象

mkdir mynginx 新建mynginx目錄 cd mynginx touch dockerfile 新建檔案dockerfile ls vim dockerfile 編輯dockerfile dockerfile檔案內容如下 在dockerfile檔案目錄下 執行如下命令 基於官方nginx...

docker上傳映象到私有映象

這裡的 192.168.1.1 dev 表示倉庫位址 根據自己的來 登入 docker login 192.168.1.1 dev然後會要求輸入使用者名稱密碼 如果出現報錯 get x509 cannot validate certificate for 192.168.1.1 because it...

docker建立私有映象

一 安裝febootstrap yum y install febootstrap 或2 安裝依賴環境 yum install ocaml ocaml foo devel ocaml camlp4 devel ocaml ocamldoc ocaml findlib devel ocaml extl...