今天我們看看Dockerfile創(chuàng )建的方法。
構建docker鏡像,有兩種方法:
1、一種是使用docker commit命令
2、另外一種是基于docker build命令和dockerfile文件
通常情況下,dockerfile構建鏡像比docker commit命令構建 鏡像更加靈活,因此采用后者較多。
dockerfile是一個(gè)文件,它是使用DSL語(yǔ)法編寫(xiě)一個(gè)文件,之后使用docker build命令基于該dockerfile文件中的指令構建一個(gè)新的鏡像。
假設我們的代碼是:
mkdir test cd test touch Dockerfile
不難看出,我們創(chuàng )建了一個(gè)test目錄,并進(jìn)入目錄創(chuàng )建了dockerfile_test文件,這個(gè)目錄就稱(chēng)之為我們的構建環(huán)境,Docker將這個(gè)環(huán)境稱(chēng)之為上下文(context)或者構建上下文,Docker會(huì )在構建鏡像的時(shí)候將構建上下文和上下文中的文件和目錄上傳到Docker 守護進(jìn)程,這樣Docker守護進(jìn)程就能直接訪(fǎng)問(wèn)你在鏡像中存儲的任何代碼、文件或者其他數據。
下面來(lái)看一個(gè)Docker file的內容:
# version: 0.0.1 FROM ubuntu:14.04 MAINTAINER Yeyz 'yeyz@example.com' RUN apt-get update RUN apt-get install -y nginx RUN echo 'Hi, I am your container' > /root/test.html EXPOSE 80
從上面的文件內容中不難看出來(lái),Dockerfile包含了一系列的命令,每個(gè)命令前面都需要用大寫(xiě)的關(guān)鍵字來(lái)進(jìn)行標識。以#開(kāi)頭的內容,會(huì )被識別為注釋。
Docker大體上按照下面的順序來(lái)執行Dockerfile中的命令,
1、Docker從基礎鏡像運行一個(gè)容器,每個(gè)DockerFile的第一個(gè)命令都應該是From,From指定了一個(gè)基礎鏡像,后續指令都在這個(gè)基礎上執行。
2、執行一條指令,對容器作出修改
3、執行類(lèi)似docker commit的操作,提交一個(gè)新的鏡像層
4、Docker鏡像再基于剛才提交的鏡像運行一個(gè)容器
5、執行Dockerfile中的下一條指令,知道所有的容器指令都執行完成
上面的過(guò)程中,任意一個(gè)步驟執行失敗,都意味著(zhù)目標鏡像創(chuàng )建失敗,但是因為目標鏡像是一個(gè)一個(gè)鏡像堆積的結果,其實(shí)我們得到了一個(gè)可以運行的鏡像,只不過(guò)還沒(méi)有達到最終的鏡像的樣子,這個(gè)特性對于調試鏡像很重要。
我們對上面的鏡像進(jìn)行解釋?zhuān)?/p>
Version:代表注釋?zhuān)硎景姹?/p>
From指令,From指定了一個(gè)基礎鏡像ubuntu,說(shuō)明我們的操作是在ubuntu這個(gè)基礎鏡像上進(jìn)行的
Maintainer指令,這個(gè)指令代表的是鏡像的作者,以及作者的電子郵件地址
RUN指令,RUN指令會(huì )在當前鏡像中運行指定的命令,三條指令分別是更新apt倉庫,安裝nginx包,打印一條命令到指定的文件中。每條命令都會(huì )創(chuàng )建一個(gè)鏡像層。如果該命令成功,這個(gè)鏡像層就會(huì )提交,之后繼續指定DockerFile中的下面一條指令。默認情況下,RUN命令會(huì )使用shell中的/bin/bash -c來(lái)執行后面的指令。
Expose指令,這條指令告訴容器內的應用程序使用容器的指定端口。當然,可以使用多個(gè)EXPOSE來(lái)向外面公開(kāi)多個(gè)端口。
我們執行剛才的Dockerfile,得到如下結果:
[root test]# docker build -t='yeyz:test0' . Sending build context to Docker daemon 2.048 kB Step 1/6 : FROM ubuntu:14.04 Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from docker.io/library/ubuntu 2e6e20c8e2e6: Downloading [> ] 539.1 kB/70.69 MB 95201152d9ff: Download complete 5f63a3b65493: Download complete
其中,-t選項是用來(lái)指定鏡像和倉庫名稱(chēng)的,yeyz為倉庫名字,而test0為鏡像名字。命令中的.代表了當前目錄,Docker默認從本地目錄中去尋找DockerFile,也可以替換成一個(gè)指定的Git倉庫源地址來(lái)指定DockerFile的位置。如下:
docker build -t='yeyz/test0' xxxx.com:yeyz/test0
如果想要保留版本信息,可以指定一個(gè)標簽,如下:
docker build -t='yeyz/test0:v1' .
如果我們只想上傳某個(gè)目錄下面的部分文件,可以創(chuàng )建一個(gè).dockerignore的文件,每一行都是一個(gè)文件過(guò)濾匹配模式,這樣,在生成鏡像的時(shí)候,會(huì )自動(dòng)過(guò)濾掉那些不需要的文件。
最終的返回值是一個(gè)鏡像ID,我們拿到鏡像ID之后,就可以使用docker run命令運行鏡像。
3、Dockerfile構建緩存
當我們第一次構建的Dockerfile出現問(wèn)題的時(shí)候,需要再次構建,這個(gè)時(shí)候會(huì )執行相同的指令,假設我們修改了Dockerfile中第4行的內容,那么Docker會(huì )自動(dòng)將前3行通過(guò)緩存的方式來(lái)進(jìn)行加載,這會(huì )節省大量的時(shí)間。
如果我們不想使用Dockerfile的緩存,則可以通過(guò)加上--no-cache參數來(lái)避免使用Dockerfile緩存。
4、查看鏡像的構建歷史
docker history可以查看構建好的鏡像的構建歷史,以及構建好的鏡像的每一層。
[root@VM-16-13-centos test]# docker images mysql REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/mysql latest 4f1413420360 7 weeks ago 545 MB [root@VM-16-13-centos test]# docker history 4f1413420360 IMAGE CREATED CREATED BY SIZE COMMENT 4f1413420360 7 weeks ago /bin/sh -c #(nop) CMD ["mysqld"] 0 B <missing> 7 weeks ago /bin/sh -c #(nop) EXPOSE 3306 33060 0 B <missing> 7 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["docker-ent... 0 B <missing> 7 weeks ago /bin/sh -c ln -s usr/local/bin/docker-entr... 34 B <missing> 7 weeks ago /bin/sh -c #(nop) COPY file:f9202f6b715c0e... 13.1 kB <missing> 7 weeks ago /bin/sh -c #(nop) COPY dir:2e040acc386ebd2... 1.12 kB <missing> 7 weeks ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0 B <missing> 7 weeks ago /bin/sh -c { echo mysql-community-server... 410 MB <missing> 7 weeks ago /bin/sh -c echo "deb http://repo.mysql.com... 55 B <missing> 7 weeks ago /bin/sh -c #(nop) ENV MYSQL_VERSION=8.0.2... 0 B <missing> 7 weeks ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=8.0 0 B <missing> 7 weeks ago /bin/sh -c set -ex; key='A4A9406876FCBD3C... 2.61 kB <missing> 7 weeks ago /bin/sh -c apt-get update && apt-get insta... 52.2 MB <missing> 7 weeks ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0 B <missing> 7 weeks ago /bin/sh -c set -eux; savedAptMark="$(apt-... 4.17 MB <missing> 7 weeks ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0 B <missing> 7 weeks ago /bin/sh -c apt-get update && apt-get insta... 9.34 MB <missing> 7 weeks ago /bin/sh -c groupadd -r mysql && useradd -r... 329 kB <missing> 7 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0 B <missing> 7 weeks ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac177... 69.2 MB
以上就是使用Dockerfile構建docker鏡像的詳細內容,更多關(guān)于用Dockerfile構建docker鏡像的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站