Docker用Dockerfile定制镜像
用Dockerfile定制鏡像
? ? 鏡像的定制實際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構(gòu)建、操作的命令都寫入一個腳本,用這個腳本來構(gòu)建、定制鏡像,那之前提示的無法重復(fù)的問題。鏡像透明性問題。體積的問題就都會解決,所以就有了Dockerfile。
? ? Dockerfile是一個文本文件,其內(nèi)容包含了一條條的指令,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。
創(chuàng)建一個空的目錄(養(yǎng)成好習(xí)慣,目錄要干凈,項目路徑也是要干凈簡潔)
mkdir?mynginx
創(chuàng)建一個文件?Dockerfile?里面這樣寫
FROM?nginx
RUN?echo?'<h1>Hello,?Docker!</h1>'?>?/usr/share/nginx/html/index.html
就兩行,第一行是指定基礎(chǔ)鏡像,就是這個鏡像已哪個鏡像為基礎(chǔ)開始創(chuàng)建。上面是用的官方nginx鏡像,官方Docker?Hub有很多基礎(chǔ)鏡像,??
服務(wù)類:
nginx??、?redis??、?mongo??、?mysql??、?httpd??、?php??、?tomcat、
語言應(yīng)用:
node??、?openjdk??、?python??、?ruby??、?golang?、?
操作系統(tǒng):
ubuntu??、?debian??、?centos??、?fedora??、?alpine等很多鏡像。
如果想用空白鏡,也就是不用鏡像就直接?FROM?scratch?這個并不罕見,swarm?etcd?或者一些GO語言開發(fā)的應(yīng)用很多會直接用這種方式來制作鏡像。
這個是Dockerfile里的第一條指令,第二條是用的RUN
RUN??指令是用來執(zhí)行命令行命令的。兩種格式:
shell?格式:?RUN?<命令>??
exec?格式:?RUN?["可執(zhí)行文件",?"參數(shù)1",?"參數(shù)2"]
?
一定一定一定要注意,每一條RUN都會創(chuàng)建一個單獨的一層鏡像的,千萬不要這么寫:
這創(chuàng)建了七層鏡像。正確姿勢是類似這樣:
?
其實就是一條RUN?指令。必須這么寫,這樣就創(chuàng)建了一層了。不過講真,這看著不舒服。
還有就是Union?FS是有最大層數(shù)限制的,AUFS曾經(jīng)是最大42層,現(xiàn)在是127層。
還有就是,構(gòu)建鏡像的時候,確保每一層只添加真正需要的東西,其他的或者是中間生成的垃圾,都記得刪除清理掉。保持干凈,給后面的鏡像留下干凈的環(huán)境。
?
然后繼續(xù)回到Dokcerfile構(gòu)建這塊來,現(xiàn)在是開始構(gòu)建鏡像。
格式?docker?build?[選項]?<上下文路徑/URL/->
具體操作是:docker?build?-t?nginx:v3?.
細(xì)節(jié)看下下面(我故意輸入了一些命令,回憶下現(xiàn)在是個什么狀態(tài))
?
跑跑試試
?
可以,沒問題。
關(guān)于?【鏡像構(gòu)建上下文(Context)】
上面?docker?build?-t?nginx:v3?.??最后面的那個.是指定上下文的意思,這個上下文要注意,這塊容易混淆。
當(dāng)構(gòu)建的時候,用戶會指定構(gòu)建鏡像上下文的路徑,?docker?build??命令得知這個路徑后,會將路徑下的所有內(nèi)容打包,然后上傳給?Docker?引擎。這樣?Docker?引擎收到這個上下文包后,展開就會獲得構(gòu)建鏡像所需的一切文件。然后如果你在Dockerfile中這么寫:
COPY?./package.json?/app/
其實是把上下文中的package.json復(fù)制到了/app/里。不是當(dāng)前目錄,也不是Dockerfile所在的目錄。
?
???一般來說,應(yīng)該會將??Dockerfile??置于一個空目錄下,或者項目根目錄下。如果該目錄下沒有所需文件,那么應(yīng)該把所需文件復(fù)制一份過來。如果目錄下有些東西確實不希望構(gòu)建時傳給?Docker?引擎,那么可以用??.gitignore??一樣的語法寫一個??.dockerignore??,該文件是用于剔除不需要作為上下文傳遞給?Docker?引擎的。
同時:在默認(rèn)情況下,如果不額外指定??Dockerfile??的話,會將上下文目錄下的名為Dockerfile??的文件作為?Dockerfile
?
Docker?build還有其他姿勢:直接簡單看下下面就好。
(1)docker?build?https://github.com/twang2218/gitlab-ce-zh.git#:11.1
(2)docker?build?http://server/context.tar.gz
(3)docker?build?-?<?Dockerfile?或者?cat?Dockerfile?|?docker?build?-
(4)docker?build?-?<?context.tar.gz
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Docker用Dockerfile定制镜像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker用Commit给容器做快照
- 下一篇: Redis笔记整理