要點:需要乙個專門的目錄,存放dockerfile檔案,且dockerfile檔案首字母必須大寫,如果有某些檔案要打包到映象中,需要把這些檔案也放到該目錄(和dockerfile檔案同一目錄),如果要忽略某些檔案,建立乙個.dockeringore檔案,該檔案中包含的檔名在docker打包時不會被打包進docker映象中。
一、開始製作映象
目標:以busybox為基礎映象,在dockerfile目錄中建立乙個index.html,複製到映象中,啟動容器時執行 httpd 命令,指向該index.html所在目錄,打包成映象後啟動為容器後,看能否訪問 http 服務,返回index.html。
#1.建立乙個目錄並進入該目錄
mkdir -p /usr/local/docker_images/busybox_image1 && cd /usr/local/docker_images/busybox_image1
#2.建立dockerfile檔案
vim dockerfile
3.#編寫dockerfile,以busybox為基礎映象,定義開發者資訊,定義index.html存放目錄的環境變數,後面的指令使用該變數,
#然後把index.html複製到映象中,最後定義容器啟動時執行cmd命令,啟動乙個httpd服務
4.當前目錄下新建index.html
vim index.html
檔案內容: welcome dockerfile
5.使用docker build 命令製作映象,./ 表示當前目錄的dockerfile檔案
二、測試
1.檢視製作好的映象
2.啟動webhttpd:v0.1映象為容器,docker run -d --name web1 --rm webhttpd:v0.1
命令說明:-d 後台方式啟動
使用 docker inspect web1,檢視容器內部ip,再 curl 該ip ,返回index.html中的內容
三、dockerfile指令詳解
dockerfile中包括from、maintainer、lable、copy、add、workdir、volume、expose、env、run、cmd、entrypoint、user、arg、onbuild等多個指令。
1.from,指定基礎映象,格式為from image或from image:tag,並且dockerfile中第一條指令必須是from指令
2.maintainer(已過期),格式為maintainer user_name user_email,指定維護者資訊,可使用label替換
3.lable,格式為lable < key>=< value> < key>=< value>,用於替代maintainer
4.copy,用於從宿主機複製src目錄或檔案到容器的desc目錄,desc不存在時會自動建立,格式為 copy < src> < dest> 或copy ["< src>",…,"< dest>"],src有多個,請使用第二種方式,且dest必須是目錄
5.add,與copy很相似,但是add支援url路徑或乙個tar檔案,tar檔案會自動解壓為目錄,能訪問網路中的檔案
6.workdir,定義工作目錄,為後續的run cmd entrypoint指定配置工作目錄,如 workdir /usr/local/ ,add nginx ./ ,此時./ 表示 /usr/local
7.volume,用於在image中建立乙個掛載點目錄,以掛載docker host上的卷或其他容器上的卷,如volume /data/mysql/
映象中定義儲存卷,建立成映象啟動容器後會自動與宿主機進行繫結
8.expose,用於為容器開啟指定要監聽的埠以實現與外部通訊,狀態為待暴露的埠,還不能訪問,需與docker run *** -p ,與大p配合使用,那麼容器中的埠則真正繫結了宿主機的埠
9.env,格式evn key value 。用於指定環境變數,後續可以被run copy等指令使用,容器執行起來之後,也可以在容器中獲取這些環境變數,如env word hello,run echo $ 賦預設值,如果沒有word變數則輸出zhuyu,docker run 容器時可傳變數值覆蓋word值,docker run --name b1 --rm -e word=「zhangsan」 tinyhttpd:v0.1
10.run,run 與 cmd 都是執行命令的,只是兩者執行的時間點不一樣,run是docker build時執行的,cmd是docker run 時執行的,格式為run command或 run [「executable」,「param1」,「param2」…],前者在shell終端中執行命令,/bin/sh -c command,例如:/bin/sh -c 「echo hello」;後者使用exec執行,可指定其他執行終端使用run["/bin/bash","-c",「echo hello」]
11.cmd,是映象啟動為容器時預設要執行的命令,如果有多個cmd指令,則只會執行最後乙個cmd
支援三種格式:
cmd command param1 param2 在/bin/sh中執行。
cmd [「executable」,「param1」,「param2」],使用exec執行。
cmd [「param1」,「param2」] 提供給enterypoint的預設引數。
前兩種語法格式意義同run,cmd用於指定容器啟動時執行的命令,每個dockerfile只能有乙個cmd命令,多個cmd命令只執行最後乙個。若容器啟動時指定了執行的命令,則會覆蓋掉cmd中指定的命令
12.entrypoint,格式有兩種:
entrypoint [「executable」,「param1」,「param2」]
entrypoint command param1,param2 會在shell中執行。
用於配置容器啟動後執行的命令,這些命令不能被docker run提供的引數覆蓋。和cmd一樣,每個dockerfile中只能有乙個entrypoint,當有多個時最後乙個生效。
13.user,格式為:user username,指定容器執行時的使用者名稱或uid,後續的run也會使用指定的使用者。要臨時使用管理員許可權可以使用sudo。在user命令之前可以使用run命令建立需要的使用者。
例如:run groupadd -r docker && useradd -r -g docker docker
14.arg,用於在 docker build 階段時向dockerfile檔案傳變數值,在dockerfile檔案中先定義,
arg author=「[email protected]」
label maintainer="$"
通過 --build-arg傳參, docker build --build-arg author=「zhangsan [email protected]」 -t *** ./
使用Dockerfile構建nginx映象
dockerfile的指令 from 指定基礎映象 from是必備的指令,並且必須為第一條指令 run 用來執行命令列命令。其基本格式 shell格式 run 命令 輸入在bash環境中的命令即可,乙個dockerfile允許使用run不得超過127層,所以,使用一次run,使用 換行,使用 執行下...
Dockerfile編譯安裝nginx映象
root localhost mkdir nginx root localhost cd nginx root localhost nginx touch dockerfile root localhost nginx vim dockerfile from daocloud.io library ...
dockerfile 製作docker容器
根目錄建立.dockerignore,寫入以下內容 git node modules npm debug.log 新建乙個檔案 dockerfile,寫如下內容 from node 8.4 run npm install registry expose 3000from nginx 基礎映象,表示要...