docker~Dockerfile優化程序(xu)的(de)部署
一些理論
我們都知(zhi)道docker這(zhe)個容器工(gong)(gong)具可以幫助我們快速進行環境(jing)的(de)(de)部(bu)署(shu)(shu)(shu),這(zhe)對于運營(ying)人(ren)員(yuan)來說,無疑(yi)是(shi)(shi)(shi)個福(fu)音,而這(zhe)個工(gong)(gong)作大叔(shu)認為(wei)不應該是(shi)(shi)(shi)運營(ying)人(ren)員(yuan)干的(de)(de),而是(shi)(shi)(shi)由開(kai)發(fa)人(ren)員(yuan)來做,因(yin)為(wei)只有你(ni)知(zhi)道你(ni)干的(de)(de)是(shi)(shi)(shi)什么(me),你(ni)干了它,就應該要部(bu)署(shu)(shu)(shu)它,或者把部(bu)署(shu)(shu)(shu)的(de)(de)過(guo)程寫(xie)成一個腳(jiao)本,讓運營(ying)人(ren)員(yuan)去執行,就可以了,這(zhe)也許就是(shi)(shi)(shi)docker產生的(de)(de)原因(yin)吧(ba)!
Dockerfile是為(wei)快(kuai)速構建(jian)docker image而設計的(de),當(dang)你使(shi)用docker build 命令的(de)時候(hou),docker 會讀取當(dang)前目錄下的(de)命名為(wei)Dockerfile(首字母大寫(xie))的(de)純文本(ben)文件并執行(xing)里面的(de)指令構建(jian)出(chu)一個docker image。
Dockerfile的組合可以用一張圖來表示

Dockerfile的一些命令
Dockerfile是將一組(zu)腳本組(zu)合在一個(ge)文件(jian)中(zhong),然(ran)后(hou)(hou)(hou)它(ta)讓批量執行,而腳本中(zhong)最重要(yao)的(de)就(jiu)是FROM,它(ta)告訴docker要(yao)啟動哪個(ge)鏡(jing)像,然(ran)后(hou)(hou)(hou)后(hou)(hou)(hou)觀的(de)動作都是針(zhen)對這個(ge)image來執行——我們(men)要(yao)想執行一個(ge)Dockerfile文件(jian),可(ke)以(yi)使用下(xia)面的(de)代碼:
$ docker build -f /path/to/a/Dockerfile .
下(xia)面是從(cong)eshoponcontainer中截取的一個(ge)Dockerfile文件的內容(rong),我們可以(yi)學習(xi)一下(xia)
FROM microsoft/aspnetcore:1.1.2 ARG source WORKDIR /app EXPOSE 80 COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "Basket.API.dll"]
從上面代碼(ma)中,我們看到(dao)Dockerfile有幾個(ge)命(ming)令,下(xia)面具(ju)體說明一下(xia)
FROM
基于哪個鏡像
RUN
安裝軟件用
MAINTAINER
鏡像創建者
CMD
Container啟動時執行的命令,但是一個Dockerfile中只能有一條CMD命令,多條則只執行最后一條CMD.
CMD主要用于container時啟動指定的服務,當Docker run command的命令匹配到CMD command時,會替換CMD執行的命令。
ENTRYPOINT
container啟動時執行的命令,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執行最后一條
ENTRYPOINT沒有CMD的可替換特性
USER
使用哪個用戶跑container
EXPOSE
container內部服務開啟的端口。主機上要用還得在啟動container時,做host-container的端口映射:
ADD
將文件<src>拷貝到container的文件系統對應的路徑<dest>
所有拷貝到container中的文件和文件夾權限為0755,uid和gid為0
如果文件是可識(shi)別(bie)的壓(ya)縮格式,則docker會幫忙解(jie)壓(ya)縮
如果要ADD本地文(wen)件,則本地文(wen)件必須在 docker build <PATH>,指定的<PATH>目錄下(xia)
如果要ADD遠程文件,則遠程文件必須在 docker build <PATH>,指定的<PATH>目錄下。
注意:使用docker build - < somefile方式進行build,是不能直接將本地文件ADD到container中。只能ADD url file.
ADD只有在build鏡像的時候運行一次,后面運行container的時候不會再重新加載了。
VOLUME
可以將本地文件夾或者其(qi)他container的文件夾掛載到container中。
WORKDIR
切換目錄用,可以多次切換(相當于cd命令),對RUN,CMD,ENTRYPOINT生效
ONBUILD
ONBUILD 指定的命令在構(gou)建鏡(jing)像時(shi)并不執(zhi)行,而是在它的子鏡(jing)像中(zhong)執(zhi)行
好了,今天就說這么多,總之(zhi)我們(men)要(yao)知(zhi)道,Dockerfile主要(yao)用來快速生成image和快速部署(shu)應(ying)用環境的(de)!