Docker怎么創(chuàng)建本地鏡像

這篇文章主要講解了“Docker怎么創(chuàng)建本地鏡像”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Docker怎么創(chuàng)建本地鏡像”吧!

創(chuàng)新互聯(lián)從2013年成立,先為鳳山等服務(wù)建站,鳳山等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為鳳山企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

鏡像是容器運行基礎(chǔ),容器是鏡像運行后的形態(tài),二者緊密相連又有不同。

1、鏡像的概念

鏡像是一個包含程序運行必要依賴環(huán)境和代碼的只讀文件,它采用分層的文件系統(tǒng),將每一次改變以讀寫層的形式增加到原來的只讀文件上。

1.1鏡像與容器

如果將容器理解為一套程序運行的虛擬環(huán)境,那么鏡像就是用來構(gòu)建這個環(huán)境的模板。通過同一鏡像,我們可以構(gòu)造出很多相互獨立但運行環(huán)境一樣的容器。

鏡像的最底層必須是一個稱為啟動文件(bootfs)的鏡像,用戶不會與這一層直接打交道。bootfs的上層鏡像叫作根鏡像(rootfs),它在通常情況下是一個操作系統(tǒng),如Ubuntu、Debina和CentOS等。

Docker怎么創(chuàng)建本地鏡像Docker怎么創(chuàng)建本地鏡像

2、本地鏡像的管理

2.1查看

docker images
docker images ub* //使用通配符

查看結(jié)果類似下表
REPOSITORYTAGIMAGE_IDCREATEDVIRTUAL SIZE
centoslaster10009deww345 hours ago199MB

REPOSITORY是倉庫名稱,一般用來存放同一類型的鏡像,其名稱由創(chuàng)建者指定。

命令規(guī)則:

1、[namespace\ubuntu]:由命名空間和實際的倉庫名組成,中間用”\“隔開,如果要提交到DOcker Hub 非官方的倉庫名必須要遵守此規(guī)則。

2、[ubuntu]:只有倉庫名,它屬于頂級命名空間,該空間只能用于官方的鏡像。本地也可以這種命名,但是無法分發(fā)到DOcker Hub上進行分享。

3、【dl.dockerpool.com:5000\ubuntu:12.04]:指定URL路徑的方式。一般是用于自己搭建的Hub或者第三方Hub上,dl.dockerpool.com:5000是第三方Hub的主機名及端口。

TAG用于區(qū)分同一倉庫中的不同鏡像。如果未指定,默認為laster

IMAGE_ID每個鏡像都有一個字符串類型、長為64位的HashID,同容器ID一樣,用來唯一標識一個鏡像。一般取前面一部分只要在本機唯一標識一個鏡像即可,和Git的CommitID規(guī)則類似。

CREATED鏡像創(chuàng)建時間。

VIRTUAL SIZE鏡像所占用的虛擬大小,該大小包含了所有共享文件的大小。

2.2下載

docker run命令運行一個鏡像時,首先會在本地查找鏡像,如果本地不存在會繼續(xù)去Docker Hub上面搜索符合條件的鏡像并將其下載下來運行。

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é)果會顯示
鏡像的名稱(NAME)、描述(DESCRIPTION)、
鏡像評分(STARS)(越高表明質(zhì)量越好)、
是否為官方鏡像(OFFICIAL)、是否使用了自動構(gòu)建(AUTOMATED)

有時運行的鏡像本地沒有,會從Docker Hub上獲取,可以通過docker pull 命令預(yù)先下載到本地,再使用docker run命令。

docker pull ubuntu

2.3刪除

刪除的鏡像如果被容器所依賴,即便容器已停止了,也仍然需要依賴鏡像,這里不能直接刪除,如果一定要強制刪除可以使用-f參數(shù)。但是為了安全起見建議先停止容器,刪除容器后再刪除鏡像。

docker rmi 鏡像ID或名稱 //比刪除容器命令多了一個i 
docker rmi -f  鏡像ID或名稱 //強制刪除鏡像

3、創(chuàng)建本地鏡像

創(chuàng)建本地鏡像有三種方式:

1、通過鏡像導(dǎo)出成tar文件的方式,然后導(dǎo)入鏡像創(chuàng)建一個新鏡像。(這種方式在 Docker開發(fā)實踐筆記一  容器的導(dǎo)入和導(dǎo)出已說明)

2、使用commit命令保存對基礎(chǔ)鏡像的修改創(chuàng)建出新的鏡像

運行鏡像容器后,對容器進行修改,然后使用commit提交創(chuàng)建。

docker run -i -t ubuntu
修改容器,比如安裝軟件、修改配置等。

docker commit -m="Message" --author="LIU" 運行的容器ID myDOcker/redis:v1

如果需要對上面的鏡像再修改,進入容器內(nèi)更新后再使用上面的命令提交一個新版本鏡像即可。

docker commit -m="Message" --author="LIU" 運行的容器ID myDOcker/redis:v2

3、使用Dockerfile文件創(chuàng)建鏡像(推薦方式)

Dockerfile用來創(chuàng)建一個自定義的image,包含了用戶指定的軟件依賴等。

下面是一個DOckerfile文件實例,本例只是介紹語法無任何實際意義。

#version: 1.00

#指定待擴展的父級鏡像。除注釋外文件開頭必須是一個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

#對外暴露端口
EXPOSE 80 8080 1038

#添加文件 第一個是源文件,第二個是要添到的容器中的目標路徑
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è)置啟動命令,只能出現(xiàn)一次,后面的會覆蓋前面的
ENTRYPOINT ["ls"]

#設(shè)置啟動參數(shù),只能出現(xiàn)一次,后面的會覆蓋前面的
CMD ["-a","-l"]

#設(shè)置卷
VOLUME ["/data","/var/www"]

#設(shè)置子鏡像的觸發(fā)操作(當有鏡像以此鏡像為父鏡像時,會執(zhí)行下面的操作)
ONBUILD ADD ./app/src
ONBUILD RUN echo "on build excuted " >> onbuild.txt

下面是對上述指令的詳細說明:

指令不區(qū)分大小寫。但是,命名約定為全部大寫。
所有Dockerfile都必須以FROM命令開始。 FROM命令會指定鏡像基于哪個基礎(chǔ)鏡像創(chuàng)建,接下來的命令也會基于這個基礎(chǔ)鏡像(譯者注:CentOS和Ubuntu有些命令可是不一樣的)。FROM命令可以多次使用,表示會創(chuàng)建多個鏡像。具體語法如下:

FROM <image name>

1. MAINTAINER:設(shè)置該鏡像的作者。語法如下:

MAINTAINER <author name>

2. RUN:在shell或者exec的環(huán)境下執(zhí)行的命令。RUN指令會在新創(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í)行

多個命令可以用&&連接執(zhí)行
RUN apt-get update && apt-get install nginx

這里需要注意一下,因為一次RUN會增加一個新層,所有最佳實踐是減少RUN次數(shù),盡量將多個操作合并到RUN中一次執(zhí)行。

3. ADD:復(fù)制文件指令。它有兩個參數(shù)<source>和<destination>。destination是容器內(nèi)的路徑。source可以是URL或者是啟動配置上下文中的一個文件。語法如下:

ADD 《src》 《destination》

如果源文件是主機上的zip或tar形式的壓縮文件,Docker會先解壓縮,然后將文件添加到鏡像指定的位置,如果是URL指定的網(wǎng)絡(luò)壓縮文件則不解壓。

4. CMD:提供了容器啟動時默認執(zhí)行的命令。 Dockerfile只允許使用一次CMD指令。 使用多個CMD會抵消之前所有的指令,只有最后一個指令生效。 CMD有三種形式:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

5. EXPOSE:指定容器在運行時監(jiān)聽的端口。語法如下:

EXPOSE <port>; //多個端口使用空格隔開

EXPOSE 80 8080 9000

運行容器時通過參數(shù)-P(大寫)即可將EXPOSE里所指定的端口映射到主機上另外的隨機端口,其它容器或主機就可以通過映射后的端口與此容器通信。同時,我們也可以通過-p(小寫)參數(shù)將DOckerfile中EXPOSE中沒有列出的端口設(shè)置成公開的。

6. ENTRYPOINT:配置給容器一個可執(zhí)行的命令,這意味著在每次使用鏡像創(chuàng)建容器時一個特定的應(yīng)用程序可以被設(shè)置為默認程序。同時也意味著該鏡像每次被調(diào)用時僅能運行指定的應(yīng)用。類似于CMDDocker只允許一個ENTRYPOINT,多個ENTRYPOINT會抵消之前所有的指令,只執(zhí)行最后的ENTRYPOINT指令。語法如下:

ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2

7. WORKDIR:指定RUN、CMDENTRYPOINT命令的工作目錄。語法如下:

WORKDIR /path/to/workdir

8. ENV:設(shè)置環(huán)境變量。它們使用鍵值對,增加運行程序的靈活性。語法如下:

ENV <key> <value>

在運行容器的時候可以通過-e參數(shù)來設(shè)置或修改環(huán)境變量:

docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.test.com ....

9. USER:鏡像正在運行時設(shè)置一個UID。語法如下:

USER <uid> //比如:USER root

10. VOLUME:授權(quán)訪問從容器內(nèi)到主機上的目錄。語法如下:

VOLUME ["/data"]

此掛載一般是在運行容器的時候指定,因為要關(guān)聯(lián)到宿主機上,這樣分享Dockerfile就不方便了。多個容器可以通過同一個掛載點共享數(shù)據(jù),即便其中一個容器已經(jīng)停止,掛載點也仍然可以訪問,只有當掛載點的容器引用全部消失時,掛載點才會自動刪除。

11. ONBUILD: 指定的命令在構(gòu)建鏡像時并不執(zhí)行,而是在它的子鏡像中執(zhí)行。

ONBUILD中的命令會在當前鏡像的子鏡像構(gòu)建時執(zhí)行??梢园袿NBUILD命令當成父鏡像的Dockerfile傳遞給子鏡像的Dockerfile的指令。

在子鏡像的構(gòu)建過程中,Docker 會在執(zhí)行Dockerfile中的任何指令之前,先執(zhí)行父鏡像通過ONBUILD傳遞的指令。

當從給定鏡像構(gòu)建新鏡像時,ONBUILD指令很有用。例如,你可能會在一個語言棧鏡像中使用ONBUILD,語言棧鏡像用于在Dockerfile中構(gòu)建用戶使用相應(yīng)語言編寫的任意軟件,正如 Ruby 的ONBUILD變體

使用ONBUILD構(gòu)建的鏡像應(yīng)用一個單獨的標簽,例如:ruby:1.9-onbuild或ruby:2.0-onbuild。

在ONBUILD中使用ADD或COPY時要格外小心。如果新的構(gòu)建上下文中缺少對應(yīng)的資源,“onbuild”鏡像會災(zāi)難性地失敗。添加一個單獨的標簽,允許Dockerfile的作者做出選擇,將有助于緩解這種情況。

最后再重點說明一下CMD和ENTRYPOINT命令:

兩個命令都是用來指定容器啟動時默認運行的命令。

假如,我們指定的ENTRYPOINT是這樣的:

ENTRYPOINT ["ls","-l"]

并構(gòu)建出名為 jiuwu/newImage的鏡像,那么 docker run jiuwu/newImage的運行結(jié)果與docker run ubuntu ls -l是一樣,而docker run jiuwu/newImage -a 的運行結(jié)果與docker run ubuntu ls -l -a 一樣。

不然發(fā)現(xiàn),ENTRYPOINT與CMD的區(qū)別在于運行容器時添加在鏡像名之后的參數(shù),對ENTRYPOINT 是拼接,而對CMD則是覆蓋。我們可以在運行容器的時候使用--entrypoint來覆蓋Dockerfile中的指定:

docker run --entrypoint echo jiuwu/newImage "hello docker"

輸出為:hello docker

通常情況下風(fēng)們會將ENTRYPOINT 和CMD搭配起來使用。ENTRYPOINT 用于指定需要運行的命令,CMD用于指定運行命令所需要的參數(shù)(這是個知識點,記?。J纠缦拢?/p>

ENTRYPOINT  ["ls"]
CMD ["-a","-l"]

感謝各位的閱讀,以上就是“Docker怎么創(chuàng)建本地鏡像”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Docker怎么創(chuàng)建本地鏡像這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

網(wǎng)站欄目:Docker怎么創(chuàng)建本地鏡像
文章來源:http://bm7419.com/article14/pcedde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計服務(wù)器托管、網(wǎng)站排名、面包屑導(dǎo)航、網(wǎng)站制作網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)