原創(chuàng)文章黄橘,歡迎轉(zhuǎn)載蒙秒。轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自IT人故事會(huì)桑李,謝謝麻昼!
原文鏈接地址:「走進(jìn)k8s」Dockerfile 基本用法(三)
上次說(shuō)了鏡像和容器的基本操作和兩者的關(guān)系奠支,這次咱們一起說(shuō)說(shuō)定制鏡像腳本Dockfile。
(一)Dockerfile
Dockerfile 是一個(gè)文本文件抚芦,其內(nèi)包含了一條條的指令(Instruction)倍谜,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容叉抡,就是描述該層應(yīng)當(dāng)如何構(gòu)建尔崔。
- ①編寫(xiě)Dockerfile
創(chuàng)建Dockerfile
mkdir mynginx
cd mynginx
vi Dockerfile
編輯內(nèi)容
FROM nginx
RUN echo '<h1>Hello,World,Dockerfile</h1>' > /usr/share/nginx/html/index.html
- ②構(gòu)建鏡像
命令: docker build -t 名稱(chēng):版本號(hào) .
提取Dockerfile,將Dockerfile按行進(jìn)行分析 Dockerfile每行第一個(gè)單詞褥民,如CMD季春、FROM等,這個(gè)叫做command消返。根據(jù)command载弄,將之后的字符串用對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行接收。處理完所有的命令撵颊,如果需要打標(biāo)簽宇攻,則給最后的鏡像打上tag,結(jié)束倡勇。
docker build -t nginx:v0 .
- ③該鏡像歷史
鏡像的歷史來(lái)源
docker history nginx:v0
(二)Dockerfile命令合集
- ①FROM
所謂定制鏡像逞刷,那一定是以一個(gè)鏡像為基礎(chǔ),在其上進(jìn)行定制妻熊。就像我們之前運(yùn)行了一個(gè) nginx 鏡像的容器亲桥,再進(jìn)行修改一樣,基礎(chǔ)鏡像是必須指定的固耘。而FROM就是指定基礎(chǔ)鏡像,因此一個(gè) Dockerfile 中 FROM 是必備的指令词身,并且必須是第一條指令厅目。
選擇dockerhub中官方鏡像為基礎(chǔ),這樣更加的安全穩(wěn)定法严,而且可持續(xù)性损敷,有人維護(hù)。
對(duì)于scratch 就是空白鏡像深啤,有老鐵奇怪一個(gè)空白的沒(méi)有基礎(chǔ)的拗馒,我如何執(zhí)行我的程序,對(duì)于linux系統(tǒng)來(lái)說(shuō)溯街,并不需要有操作系統(tǒng)提供運(yùn)行時(shí)支持诱桂,所需的一切庫(kù)都已經(jīng)在可執(zhí)行文件里了洋丐,比方使用go語(yǔ)言開(kāi)發(fā)的應(yīng)用編譯打包成為二進(jìn)制的問(wèn)題,在用scratch進(jìn)行打包挥等,這就是為什么go語(yǔ)言更核心容器下面的微服務(wù)架構(gòu)的原因友绝。
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
FROM scratch #制作base Image
FROM centos #使用base Image
FROM centos:7.9
FROM mysql:5.6
- ②LABEL
給鏡像添加信息。使用docker inspect可查看鏡像的相關(guān)信息
LABEL maintainer="394498036@qq.com"
LABEL version="1.0"
LABEL description="This is description \
歡迎關(guān)注:編程坑太多"
- ③RUN
指令指定將要運(yùn)行并捕獲到新容器映像中的命令肝劲。 這些命令包括安裝軟件迁客、創(chuàng)建文件和目錄,以及創(chuàng)建環(huán)境配置等辞槐≈朗基本就是shell腳本。
#不建議使用
RUN yum update
RUN yum install -y vim
RUN python-dev
#建議使用
RUN yum update && yum install -y vim \
python-dev #反斜線(xiàn)換行
RUN apt-get update && apt-get install -y perl \
pwgen --no-install-recommends && rm -rf \
/var/lib/apt/lists/* #注意清理cache
每一個(gè)指令都會(huì)創(chuàng)建一層榄檬,并構(gòu)成新的鏡像卜范。當(dāng)運(yùn)行多個(gè)指令時(shí),會(huì)產(chǎn)生一些非常臃腫丙号、非常多層的鏡像先朦,不僅僅增加了構(gòu)建部署的時(shí)間,也很容易出錯(cuò)犬缨。因此喳魏,在很多情況下,我們可以合并指令并運(yùn)行怀薛。
注意初學(xué)docker容易出現(xiàn)的2個(gè)關(guān)于RUN命令的問(wèn)題:
1.RUN代碼沒(méi)有合并刺彩。
2.每一層構(gòu)建的最后一定要清理掉無(wú)關(guān)文件。
- ④ENV
方便編寫(xiě)比較復(fù)雜的Dockerfile枝恋,主要為了方便維護(hù)创倔。
ENV MYSQL_VERSION 5.6
E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* #引用常亮
- ⑤COPY
將文件和目錄復(fù)制到容器的文件系統(tǒng)。文件和目錄需位于相對(duì)于 Dockerfile 的路徑中焚碌。盡量使用COPY不使用ADD畦攘。這里ADD就不做講解。
COPY ["", ""]
COPY nginx.conf /etc/nginx/nginx.conf
- ⑥WORKDIR
工作目錄
WORKDIR /test #如果沒(méi)有會(huì)自動(dòng)創(chuàng)建test目錄
WORKDIR idig8
RUN pwd #輸出結(jié)果應(yīng)該是/test/idig8
用WORKDIR十电,不要用RUN cd 盡量使用絕對(duì)目錄知押!
- ⑦ENTRTYPOINT
設(shè)置容器啟動(dòng)時(shí)運(yùn)行的命令
讓容器以應(yīng)用程序或者服務(wù)的形式運(yùn)行
不會(huì)被忽略,一定會(huì)執(zhí)行
- ⑧CMD
設(shè)置容器啟動(dòng)后默認(rèn)執(zhí)行的命令和參數(shù)
容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令
如果docker run 指定了其他命令鹃骂,CMD命令被忽略
如何定義了多個(gè)CMD台盯,只有最后一個(gè)會(huì)執(zhí)行
PS:一般來(lái)說(shuō),應(yīng)該會(huì)將 Dockerfile 置于一個(gè)空目錄下畏线,或者項(xiàng)目根目錄下静盅。如果該目錄下沒(méi)有所需文件,那么應(yīng)該把所需文件復(fù)制一份過(guò)來(lái)寝殴。如果目錄下有些東西確實(shí)不希望構(gòu)建時(shí)傳給 Docker 引擎蒿叠,那么可以用 .gitignore 一樣的語(yǔ)法寫(xiě)一個(gè).dockerignore明垢,該文件是用于剔除不需要作為上下文傳遞給 Docker 引擎的。
基本思路:
1.編寫(xiě).dockerignore文件
2.容器只運(yùn)行單個(gè)應(yīng)用
3.將多個(gè)RUN指令合并為一個(gè)
4.基礎(chǔ)鏡像的標(biāo)簽不要用latest
5.每個(gè)RUN指令后刪除多余文件
6.選擇合適的基礎(chǔ)鏡像(alpine版本最好)