構建docker鏡像

來源:互聯網
上載者:User

標籤:檔案   htm   usr   locate   text   form   context   package   git   

一、通過docker commit命令構建鏡像

  docker commit 構建鏡像可以想象為是將啟動並執行鏡像進行重新命名另存一份。我們先建立一個容器,並在容器裡做出修改,就像修改代碼一樣,最後再將修改提交為一個鏡像。

# docker run -i -t ubuntu /bin/bash[email protected]:/# apt-get -yqq update[email protected]:/# apt-get -y install apache2

  以上的操作我們啟動了一個容器,並在裡面安裝了Apache。我們會將這個容器作為一個Web伺服器來運行,所以我們想把它的目前狀態儲存下來。這樣我們就不必每次都建立一個新容器並再次在裡面安裝Apache了。為了完成此項工作,需要先使用exit命令從容器裡退出,通過docker ps -a命令查詢待儲存docker的CONTAUBER ID,之後再運行docker commit命令:

# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMESb437ffe4d630        ubuntu              "/bin/bash"         45 minutes ago      Exited (0) 10 seconds ago                       clever_pare        b87f9dde62b0        devopsil/puppet     "/bin/bash"         2 days ago          Up 2 days                                       evil_archimedes     # docker commit b437ffe4d630 test/apache29c30616364f44a519571709690e3c92a5cad4ad01c007d8126eb6d63670d33f4 # docker images test/apache2REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEtest/apache2        latest              9c30616364f4        36 seconds ago      254.4 MB

  在使用docker commit命令中,指定了要提交的修改過的容器的ID(可以通過docker ps命令得到剛建立的容器ID),以及一個目標鏡像倉庫和鏡像名,這裡是test/apahce2。需要注意的是,docker commit提交的只是建立容器的鏡像與容器的目前狀態之間有差異的部分,這使得該更新非常輕量。通過docker images 可以查看新建立的鏡像資訊。也可以在提交鏡像時指定更多的資料(包括標籤)來詳細描述所做的修改。

# docker commit -m="A new custom image" --author="Bourbon Tian" b437ffe4d630 test/apache2:webserver27fc508c41d1180b1a421380d755cf00f9dfb6b0d354b9eccaec94ae58a06675

  這條命令裡,我們指定了更多的資訊選項:

  • -m 用來指定建立鏡像的提交資訊;
  • --author 用來列出該鏡像的作者資訊;
  • 最後在test/apache2後面增加了一個webserver標籤。

  通過使用docker inspect命令來查看新建立的鏡像的詳細資料:

# docker inspect test/apache2:webserver[{    "Id": "27fc508c41d1180b1a421380d755cf00f9dfb6b0d354b9eccaec94ae58a06675",    "Parent": "f5bb94a8fac47aaf15fb4e4ceb138d59ac2fcf004cd3f277cebe2174fd7a6c70",    "Comment": "A new custom image",    "Created": "2017-05-17T07:29:46.000512241Z",    "Container": "b437ffe4d63047dd34653f5256bb6eda54acfd3db99f72f2262a9b9af7f31334",...

  如果想從剛建立的鏡像運行一個容器,可以使用docker run命令:

# docker run -t -i test/apache2:webserver /bin/bash

 

二、通過docker build命令和 Dockerfile 檔案建立docker鏡像

  Dockerfile使用基本的基於DSL文法的指令來構建一個Docker鏡像,之後使用docker build命令基於該Dockerfile中的指令構建一個新的鏡像。

# mkdir /opt/static_web# cd /opt/static_web/# vim Dockerfile

  首先建立一個名為static_web的目錄用來儲存Dockerfile,這個目錄就是我們的構建環境(build environment),Docker則稱此環境為上下文(context)或者構建上下文(build context)。Docker會在構建鏡像時將構建上下文和該上下文中的檔案和目錄上傳到Docker守護進程。這樣Docker守護進程就能直接存取你想在鏡像中儲存的任何代碼、檔案或者其他資料。這裡我們還建立了一個Dockerfile檔案,我們將用它構建一個能作為Web伺服器的Docker鏡像。

# Version: 0.0.1FROM ubuntu:latest  #Docker從基礎鏡像運行一個容器。MAINTAINER Bourbon Tian "[email protected]"  #設定鏡像資訊。RUN apt-get update  #更新RUN apt-get install -y nginx #安裝nginx RUN echo ‘Hi, I am in your container‘ > /usr/share/nginx/html/index.html   #修改檔案EXPOSE 80 #指定80連接埠開放

  Dockerfile由一系列指令和參數組成。每條指令都必須為大寫字母,切後面要跟隨一個參數。Dockerfile中的指令會按照順序從上到下執行,所以應該根據需要合理安排指令的順序。每條指令都會建立一個新的鏡像層並對鏡像進行提交。Docker大體上按照如下流程執行Dockerfile中的指令。

從上面可以看出,如果你的Dockerfile由於某些原因(如某條指令失敗了)沒有正常結束,那你也可以得到一個可以使用的鏡像。這對調試非常有協助:可以基於該鏡像運行一個具備互動功能的容器,使用最後建立的鏡像對為什麼你的指令會失敗進行調試。

Dockerfile也支援注釋。以#開頭的行都會被認為是注釋,# Version: 0.0.1這就是個注釋

 

  FROM:

  每個Dockerfile的第一條指令都應該是FROM。FROM指令指定一個已經存在的鏡像,後續指令都是將基於該鏡像進行,這個鏡像被稱為基礎鏡像(base iamge)。在這裡ubuntu:latest就是作為新鏡像的基礎鏡像。也就是說Dockerfile構建的新鏡像將以ubuntu:latest作業系統為基礎。在運行一個容器時,必須要指明是基於哪個基礎鏡像在進行構建。

  MAINTAINER:

  MAINTAINER指令,這條指令會告訴Docker該鏡像的作者是誰,以及作者的郵箱地址。這有助於表示鏡像的所有者和連絡方式

  RUN:

  在這些命令之後,我們指定了三條RUN指令。RUN指令會在當前鏡像中運行指定的命令。這裡我們通過RUN指令更新了APT倉庫,安裝nginx包,並建立了一個index.html檔案。像前面說的那樣,每條RUN指令都會建立一個新的鏡像層,如果該指令執行成功,就會將此鏡像層提交,之後繼續執行Dockerfile中的下一個指令。

  EXPOSE:

  EXPOSE指令是告訴Docker該容器內的應用程式將會使用容器的指定連接埠。這並不意味著可以自動訪問任意容器運行中服務的連接埠。出於安全的原因,Docker並不會自動開啟該連接埠,而是需要你在使用docker run運行容器時來指定需要開啟哪些連接埠。

  執行docker build命令時,Dockerfile中的所有指令都會被執行並且提交,並且在該命令成功結束後返回一個新鏡像。

# cd static_web# docker build -t="test/static_web" .Sending build context to Docker daemon 2.048 kBSending build context to Docker daemon...Successfully built 94728651ce15

  上面命令中最後的“.”告訴Docker到目前的目錄中去找Dockerfile檔案。也可以指定一個Git倉庫地址來指定Dockerfile的位置,這裡Docker假設在Git倉庫的根目錄下存在Dockerfile檔案:

# docker build -t="test/static_web:v1" [email protected]:test/static_web

 

  構建出錯:

# docker build -t="test/static_web" .Sending build context to Docker daemon 2.048 kBSending build context to Docker daemonStep 0 : FROM ubuntu:latest ---> f5bb94a8fac4Step 1 : MAINTAINER Bourbon Tian "[email protected]" ---> Using cache ---> ce64f2e75a74Step 2 : RUN apt-get update ---> Using cache ---> e98d2c152d1dStep 3 : RUN apt-get install -y ngin ---> Running in 2f16c5f11250Reading package lists...Building dependency tree...Reading state information...E: Unable to locate package nginThe command ‘/bin/sh -c apt-get install -y ngin‘ returned a non-zero code: 100

 

  在構建鏡像時,由於RUN語句錯誤或者其他錯誤導致構建失敗時,可以我們需要調試一下這次失敗,我們可以通過docker run命令來基於這次構建到目前為止已經成功的最後一步建立一個容器,這裡它的ID是e98d2c152d1d:

# docker run -t -i e98d2c152d1d /bin/bash[email protected]:/# apt-get install -y nginReading package lists... DoneBuilding dependency tree      Reading state information... DoneE: Unable to locate package ngin

 

構建docker鏡像

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.