您好,登錄后才能下訂單哦!
這篇文章主要講解了“Docker怎么創(chuàng)建本地鏡像”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Docker怎么創(chuàng)建本地鏡像”吧!
鏡像是容器運(yùn)行基礎(chǔ),容器是鏡像運(yùn)行后的形態(tài),二者緊密相連又有不同。
1、鏡像的概念
鏡像是一個(gè)包含程序運(yùn)行必要依賴環(huán)境和代碼的只讀文件,它采用分層的文件系統(tǒng),將每一次改變以讀寫層的形式增加到原來的只讀文件上。
1.1鏡像與容器
如果將容器理解為一套程序運(yùn)行的虛擬環(huán)境,那么鏡像就是用來構(gòu)建這個(gè)環(huán)境的模板。通過同一鏡像,我們可以構(gòu)造出很多相互獨(dú)立但運(yùn)行環(huán)境一樣的容器。
鏡像的最底層必須是一個(gè)稱為啟動(dòng)文件(bootfs)的鏡像,用戶不會(huì)與這一層直接打交道。bootfs的上層鏡像叫作根鏡像(rootfs),它在通常情況下是一個(gè)操作系統(tǒng),如Ubuntu、Debina和CentOS等。
2、本地鏡像的管理
2.1查看
docker images docker images ub* //使用通配符 查看結(jié)果類似下表
REPOSITORY | TAG | IMAGE_ID | CREATED | VIRTUAL SIZE |
centos | laster | 10009deww3 | 45 hours ago | 199MB |
REPOSITORY是倉庫名稱,一般用來存放同一類型的鏡像,其名稱由創(chuàng)建者指定。
命令規(guī)則:
1、[namespace\ubuntu]:由命名空間和實(shí)際的倉庫名組成,中間用”\“隔開,如果要提交到DOcker Hub 非官方的倉庫名必須要遵守此規(guī)則。
2、[ubuntu]:只有倉庫名,它屬于頂級(jí)命名空間,該空間只能用于官方的鏡像。本地也可以這種命名,但是無法分發(fā)到DOcker Hub上進(jìn)行分享。
3、【dl.dockerpool.com:5000\ubuntu:12.04]:指定URL路徑的方式。一般是用于自己搭建的Hub或者第三方Hub上,dl.dockerpool.com:5000是第三方Hub的主機(jī)名及端口。
TAG用于區(qū)分同一倉庫中的不同鏡像。如果未指定,默認(rèn)為laster
IMAGE_ID每個(gè)鏡像都有一個(gè)字符串類型、長(zhǎng)為64位的HashID,同容器ID一樣,用來唯一標(biāo)識(shí)一個(gè)鏡像。一般取前面一部分只要在本機(jī)唯一標(biāo)識(shí)一個(gè)鏡像即可,和Git的CommitID規(guī)則類似。
CREATED鏡像創(chuàng)建時(shí)間。
VIRTUAL SIZE鏡像所占用的虛擬大小,該大小包含了所有共享文件的大小。
2.2下載
docker run命令運(yùn)行一個(gè)鏡像時(shí),首先會(huì)在本地查找鏡像,如果本地不存在會(huì)繼續(xù)去Docker Hub上面搜索符合條件的鏡像并將其下載下來運(yùn)行。
docker pull ubuntu:13.10 13.10: Pulling from library/ubuntu //本地已經(jīng)有了 6599cadaf950: Pull complete 23eda618d451: Pull complete f0be3084efe9: Pull complete 52de432f084b: Pull complete a3ed95caeb02: Pull complete Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3 Status: Downloaded newer image for ubuntu:13.10
docker search wordpress //Docker Hub搜索符合條件的鏡像 搜索結(jié)果會(huì)顯示 鏡像的名稱(NAME)、描述(DESCRIPTION)、 鏡像評(píng)分(STARS)(越高表明質(zhì)量越好)、 是否為官方鏡像(OFFICIAL)、是否使用了自動(dòng)構(gòu)建(AUTOMATED)
有時(shí)運(yùn)行的鏡像本地沒有,會(huì)從Docker Hub上獲取,可以通過docker pull 命令預(yù)先下載到本地,再使用docker run命令。
docker pull ubuntu
2.3刪除
刪除的鏡像如果被容器所依賴,即便容器已停止了,也仍然需要依賴鏡像,這里不能直接刪除,如果一定要強(qiáng)制刪除可以使用-f參數(shù)。但是為了安全起見建議先停止容器,刪除容器后再刪除鏡像。
docker rmi 鏡像ID或名稱 //比刪除容器命令多了一個(gè)i docker rmi -f 鏡像ID或名稱 //強(qiáng)制刪除鏡像
3、創(chuàng)建本地鏡像
創(chuàng)建本地鏡像有三種方式:
1、通過鏡像導(dǎo)出成tar文件的方式,然后導(dǎo)入鏡像創(chuàng)建一個(gè)新鏡像。(這種方式在 Docker開發(fā)實(shí)踐筆記一 容器的導(dǎo)入和導(dǎo)出已說明)
2、使用commit命令保存對(duì)基礎(chǔ)鏡像的修改創(chuàng)建出新的鏡像
運(yùn)行鏡像容器后,對(duì)容器進(jìn)行修改,然后使用commit提交創(chuàng)建。
docker run -i -t ubuntu 修改容器,比如安裝軟件、修改配置等。 docker commit -m="Message" --author="LIU" 運(yùn)行的容器ID myDOcker/redis:v1 如果需要對(duì)上面的鏡像再修改,進(jìn)入容器內(nèi)更新后再使用上面的命令提交一個(gè)新版本鏡像即可。 docker commit -m="Message" --author="LIU" 運(yùn)行的容器ID myDOcker/redis:v2
3、使用Dockerfile文件創(chuàng)建鏡像(推薦方式)
Dockerfile用來創(chuàng)建一個(gè)自定義的image,包含了用戶指定的軟件依賴等。
下面是一個(gè)DOckerfile文件實(shí)例,本例只是介紹語法無任何實(shí)際意義。
#version: 1.00 #指定待擴(kuò)展的父級(jí)鏡像。除注釋外文件開頭必須是一個(gè)FROM指令 FROM ubuntu:latest #作者信息 MAINtAINER jiuwu "jiuwu@qq.com" #設(shè)置root用戶為后續(xù)命令的執(zhí)行者 USET root #執(zhí)行操作 RUN apt-age update RUN apt-get install -y nginx #使用&&拼接命令 RUN touch test.txt && echo "abc" >> abc.txt #對(duì)外暴露端口 EXPOSE 80 8080 1038 #添加文件 第一個(gè)是源文件,第二個(gè)是要添到的容器中的目標(biāo)路徑 ADD abc.txt /opt/ #添加文件件 ADD /webapp /opt/webapp #添加網(wǎng)絡(luò)文件 ADD https://www.baidu.com/logo.jpg /opt/ #設(shè)置環(huán)境變量 ENV WEBAPP_PORT=9000 #設(shè)置工作目錄 WORKDIR /opt/ #設(shè)置啟動(dòng)命令,只能出現(xiàn)一次,后面的會(huì)覆蓋前面的 ENTRYPOINT ["ls"] #設(shè)置啟動(dòng)參數(shù),只能出現(xiàn)一次,后面的會(huì)覆蓋前面的 CMD ["-a","-l"] #設(shè)置卷 VOLUME ["/data","/var/www"] #設(shè)置子鏡像的觸發(fā)操作(當(dāng)有鏡像以此鏡像為父鏡像時(shí),會(huì)執(zhí)行下面的操作) ONBUILD ADD ./app/src ONBUILD RUN echo "on build excuted " >> onbuild.txt
下面是對(duì)上述指令的詳細(xì)說明:
指令不區(qū)分大小寫。但是,命名約定為全部大寫。
所有Dockerfile都必須以FROM
命令開始。 FROM
命令會(huì)指定鏡像基于哪個(gè)基礎(chǔ)鏡像創(chuàng)建,接下來的命令也會(huì)基于這個(gè)基礎(chǔ)鏡像(譯者注:CentOS和Ubuntu有些命令可是不一樣的)。FROM
命令可以多次使用,表示會(huì)創(chuàng)建多個(gè)鏡像。具體語法如下:
FROM <image name>
1. MAINTAINER:設(shè)置該鏡像的作者。語法如下:
MAINTAINER <author name>
2. RUN:在shell或者exec的環(huán)境下執(zhí)行的命令。RUN
指令會(huì)在新創(chuàng)建的鏡像上添加新的層面,接下來提交的結(jié)果用在Dockerfile的下一條指令中。語法如下:
RUN 《command》 RUN apt-get update //這種形式使用/bin/sh環(huán)境中執(zhí)行的命令 RUN ["apt-get","update"] //直接使用系統(tǒng)調(diào)用exec來執(zhí)行 多個(gè)命令可以用&&連接執(zhí)行 RUN apt-get update && apt-get install nginx
這里需要注意一下,因?yàn)橐淮蜶UN會(huì)增加一個(gè)新層,所有最佳實(shí)踐是減少RUN次數(shù),盡量將多個(gè)操作合并到RUN中一次執(zhí)行。
3. ADD:復(fù)制文件指令。它有兩個(gè)參數(shù)<source>和<destination>。destination是容器內(nèi)的路徑。source可以是URL或者是啟動(dòng)配置上下文中的一個(gè)文件。語法如下:
ADD 《src》 《destination》
如果源文件是主機(jī)上的zip或tar形式的壓縮文件,Docker會(huì)先解壓縮,然后將文件添加到鏡像指定的位置,如果是URL指定的網(wǎng)絡(luò)壓縮文件則不解壓。
4. CMD:提供了容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令。 Dockerfile只允許使用一次CMD指令。 使用多個(gè)CMD會(huì)抵消之前所有的指令,只有最后一個(gè)指令生效。 CMD有三種形式:
CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2
5. EXPOSE:指定容器在運(yùn)行時(shí)監(jiān)聽的端口。語法如下:
EXPOSE <port>; //多個(gè)端口使用空格隔開 EXPOSE 80 8080 9000
運(yùn)行容器時(shí)通過參數(shù)-P(大寫)即可將EXPOSE里所指定的端口映射到主機(jī)上另外的隨機(jī)端口,其它容器或主機(jī)就可以通過映射后的端口與此容器通信。同時(shí),我們也可以通過-p(小寫)參數(shù)將DOckerfile中EXPOSE中沒有列出的端口設(shè)置成公開的。
6. ENTRYPOINT:配置給容器一個(gè)可執(zhí)行的命令,這意味著在每次使用鏡像創(chuàng)建容器時(shí)一個(gè)特定的應(yīng)用程序可以被設(shè)置為默認(rèn)程序。同時(shí)也意味著該鏡像每次被調(diào)用時(shí)僅能運(yùn)行指定的應(yīng)用。類似于CMD
,Docker只允許一個(gè)ENTRYPOINT,多個(gè)ENTRYPOINT會(huì)抵消之前所有的指令,只執(zhí)行最后的ENTRYPOINT指令。語法如下:
ENTRYPOINT ["executable", "param1","param2"] ENTRYPOINT command param1 param2
7. WORKDIR:指定RUN
、CMD
與ENTRYPOINT
命令的工作目錄。語法如下:
WORKDIR /path/to/workdir
8. ENV:設(shè)置環(huán)境變量。它們使用鍵值對(duì),增加運(yùn)行程序的靈活性。語法如下:
ENV <key> <value>
在運(yùn)行容器的時(shí)候可以通過-e參數(shù)來設(shè)置或修改環(huán)境變量:
docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.test.com ....
9. USER:鏡像正在運(yùn)行時(shí)設(shè)置一個(gè)UID。語法如下:
USER <uid> //比如:USER root
10. VOLUME:授權(quán)訪問從容器內(nèi)到主機(jī)上的目錄。語法如下:
VOLUME ["/data"]
此掛載一般是在運(yùn)行容器的時(shí)候指定,因?yàn)橐P(guān)聯(lián)到宿主機(jī)上,這樣分享Dockerfile就不方便了。多個(gè)容器可以通過同一個(gè)掛載點(diǎn)共享數(shù)據(jù),即便其中一個(gè)容器已經(jīng)停止,掛載點(diǎn)也仍然可以訪問,只有當(dāng)掛載點(diǎn)的容器引用全部消失時(shí),掛載點(diǎn)才會(huì)自動(dòng)刪除。
11. ONBUILD: 指定的命令在構(gòu)建鏡像時(shí)并不執(zhí)行,而是在它的子鏡像中執(zhí)行。
ONBUILD中的命令會(huì)在當(dāng)前鏡像的子鏡像構(gòu)建時(shí)執(zhí)行。可以把ONBUILD命令當(dāng)成父鏡像的Dockerfile傳遞給子鏡像的Dockerfile的指令。
在子鏡像的構(gòu)建過程中,Docker 會(huì)在執(zhí)行Dockerfile中的任何指令之前,先執(zhí)行父鏡像通過ONBUILD傳遞的指令。
當(dāng)從給定鏡像構(gòu)建新鏡像時(shí),ONBUILD指令很有用。例如,你可能會(huì)在一個(gè)語言棧鏡像中使用ONBUILD,語言棧鏡像用于在Dockerfile中構(gòu)建用戶使用相應(yīng)語言編寫的任意軟件,正如 Ruby 的ONBUILD變體
使用ONBUILD構(gòu)建的鏡像應(yīng)用一個(gè)單獨(dú)的標(biāo)簽,例如:ruby:1.9-onbuild或ruby:2.0-onbuild。
在ONBUILD中使用ADD或COPY時(shí)要格外小心。如果新的構(gòu)建上下文中缺少對(duì)應(yīng)的資源,“onbuild”鏡像會(huì)災(zāi)難性地失敗。添加一個(gè)單獨(dú)的標(biāo)簽,允許Dockerfile的作者做出選擇,將有助于緩解這種情況。
最后再重點(diǎn)說明一下CMD和ENTRYPOINT命令:
兩個(gè)命令都是用來指定容器啟動(dòng)時(shí)默認(rèn)運(yùn)行的命令。
假如,我們指定的ENTRYPOINT是這樣的:
ENTRYPOINT ["ls","-l"]
并構(gòu)建出名為 jiuwu/newImage的鏡像,那么 docker run jiuwu/newImage的運(yùn)行結(jié)果與docker run ubuntu ls -l是一樣,而docker run jiuwu/newImage -a 的運(yùn)行結(jié)果與docker run ubuntu ls -l -a 一樣。
不然發(fā)現(xiàn),ENTRYPOINT與CMD的區(qū)別在于運(yùn)行容器時(shí)添加在鏡像名之后的參數(shù),對(duì)ENTRYPOINT 是拼接,而對(duì)CMD則是覆蓋。我們可以在運(yùn)行容器的時(shí)候使用--entrypoint來覆蓋Dockerfile中的指定:
docker run --entrypoint echo jiuwu/newImage "hello docker"
輸出為:hello docker
通常情況下風(fēng)們會(huì)將ENTRYPOINT 和CMD搭配起來使用。ENTRYPOINT 用于指定需要運(yùn)行的命令,CMD用于指定運(yùn)行命令所需要的參數(shù)(這是個(gè)知識(shí)點(diǎn),記?。J纠缦拢?/p>
ENTRYPOINT ["ls"] CMD ["-a","-l"]
感謝各位的閱讀,以上就是“Docker怎么創(chuàng)建本地鏡像”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Docker怎么創(chuàng)建本地鏡像這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。