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