製作docker image 有兩種方式:一是使用 docker container,直接構建容器,再匯出成 image 使用;二是使用 dockerfile,將所有動作寫在檔案中,再 build 成 image。dockerfile 的方式非常靈活,推薦使用。
一般的,dockerfile 分為四部分:基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行指令。』#』 為 dockerfile 中的注釋。先看下面乙個小例子:
# this my first nginx dockerfile
# version 1.0
# base images 基礎映象
from centos
#maintainer 維護者資訊
maintainer tianfeiyu
#env 設定環境變數
env path /usr/local/nginx/sbin:$path
#add 檔案放在當前目錄下,拷過去會自動解壓
add nginx-1.8.0.tar.gz /usr/local/
add epel-release-latest-7.noarch.rpm /usr/local/
#run 執行以下命令
run rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
run yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
run useradd -s /sbin/nologin -m www
#workdir 相當於cd
#expose 對映埠
expose 80
#cmd 執行以下命令
cmd ["nginx"]
from : 指定基礎映象,要在哪個映象建立
格式為from 或from :。
第一條指令必須為 from 指令。
maintainer:指定維護者資訊
格式為maintainer
run:在映象中要執行的命令
格式為run 或 run ["executable", "param1", "param2"]
前者將在 shell 終端中執行命令,即 /bin/bash -c ;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如run [「/bin/bash」, 「-c」,」echo hello」]
。
workdir:指定當前工作目錄,相當於 cd
格式為workdir /path/to/workdir
為後續的 run 、 cmd 、 entrypoint 指令配置工作目錄。
可以使用多個 workdir 指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。例如
workdir /aworkdir bworkdir crun pwd
則最終路徑為 /a/b/c 。
expose:指定容器要開啟的埠
格式為expose [...]
告訴 docker 服務端容器暴露的埠號,供互聯系統使用。在啟動容器時需要通過 -p,docker 主機會自動分配乙個埠**到指定的埠。
env:定義環境變數
格式為env
。 指定乙個環境變數,會被後續 run 指令使用,並在容器執行時保持。
例如
env path /usr/local/nginx/sbin:$path
copy :複製本地主機的 (為 dockerfile 所在目錄的相對路徑)到容器中的
格式為 copy 。add:相當於 copy,但是比 copy 功能更強大
格式為add
該命令將複製指定的 到容器中的 。 其中 可以是dockerfile所在目錄的乙個相對路徑;也可以是乙個 url;還可以是乙個 tar 檔案,複製進容器會自動解壓。
volume:掛載目錄
格式為volume ["/data"]
建立乙個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的資料等。
user
格式為user daemon
指定執行容器時的使用者名稱或 uid,後續的 run 也會使用指定使用者。當服務不需要管理員許可權時,可以通過該命令指定執行使用者。並且可以在之前建立所需要的使用者,例如: run useradd -s /sbin/nologin -m www。
entrypoint
兩種格式:
entrypoint ["executable", "param1", "param2"] entrypoint command param1 param2 (shell中執行)
配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋。每個 dockerfile 中只能有乙個 entrypoint ,當指定多個時,只有最後乙個起效。
cmd支援三種格式
cmd ["executable","param1","param2"] 使用 exec 執行,推薦方式;
cmd command param1 param2 在 /bin/bash 中執行,提供給需要互動的應用;
cmd ["param1","param2"] 提供給 entrypoint 的預設引數;
指定啟動容器時執行的命令,每個 dockerfile 只能有一條 cmd 命令。如果指定了多條命令,只有最後一條會被執行。如果使用者啟動容器時候指定了執行的命令,則會覆蓋掉 cmd 指定的命令。
onbuild:在構建本映象時不生效,在基於此映象構建映象時生效
格式為onbuild [instruction]
配置當所建立的映象作為其它新建立映象的基礎映象時,所執行的操作指令。
entrypoint 和 cmd 的區別:entrypoint 指定了該映象啟動時的入口,cmd 則指定了容器啟動時的命令,當兩者共用時,完整的啟動命令像是 entrypoint + cmd 這樣。使用 entrypoint 的好處是在我們啟動映象就像是啟動了乙個可執行程式,在 cmd 上僅需要指定引數;另外在我們需要自定義 cmd 時不容易出錯。
使用 cmd 的 dockerfile:
[root@sta2 test]# cat dockerfile from mysql cmd ["echo","test"]
使用 entrypoint 的 dockerfile:
[root@sta2 entrypoint]# cat dockerfile from mysql entrypoint ["echo","test"]
結論:entrypoint 不能覆蓋掉執行時的引數,cmd 可以掉覆蓋預設的引數。
可以使用以下命令覆蓋預設的引數,方便除錯 dockerfile 中的 bug:
[root@sta2 entrypoint]# docker run -it --entrypoint=/bin/bash feiyu/entrypoint:1
構建映象時,需要將要使用的包及 dockerfile 檔案放在乙個目錄中。
使用以下命令來構建乙個映象:
# docker build -t feiyu/nginx:1.8 .
docker 映象採用分層的技術,所以建立過程中每乙個命令都相當於一層:
# docker run -d -p 8080:80 --name mynginx feiyu/nginx:1.8 #啟動容器
Docker Dockerfile用法全解析
dockerfile基本的指令 from workdir copy 本地目錄移動 add url目錄等 run 映象構建執行shell 語句 cmd 容器執行執行的shell 語句 entrypoint docker inspect nginx latest 檢視nginx的一些配置資訊,發現指定了...
nginx limit req zone用法詳解
nginx可以使用ngx http limit req module模組的limit req zone指令進行限流訪問,防止使用者惡意攻擊刷爆伺服器。ngx http limit req module模組是nginx預設安裝的,所以直接配置即可。首先,在nginx.conf檔案中的http模組下配置...
Docker Dockerfile 基本結構詳解
dockerfike快速建立自定義的docker映象 一 目錄 1.docker典型結構 2.指令介紹 3.建立docker映象 二 結構 dockerfile分為四部分組成 基礎映象信 維護者資訊 映象操作指令和容器啟動時執行指令。例如 第一行必須指令基於的基礎映象 from ubutu 維護者資...