1. 程式人生 > >使用docker映象-如何建立、訪問和分享我自己的容器呢?

使用docker映象-如何建立、訪問和分享我自己的容器呢?

使用docker映象

我是如何建立、訪問和分享我自己的容器呢?

在前邊的安裝簡介中,我們提及到了基礎映象。在前面的部分我們已經使用了Docker映象,舉例:ubuntu映象和training/webapp映象。

我們還發現Docker主機會從儲存中心下載映象。如果一個映象不存在,他就會自動從docker映象倉庫去下載:預設的Docker Hub公共映象源。

在這一節中,我們將探討更多的關於docker映象的東西:

  • 在本地Docker主機上管理和處理映象
  • 建立基本映象
  • 上傳docker映象到docker映象源

在主機上列出映象

讓我們來列出本地主機上的映象。你可以使用docker images來完成這項任務:

    $ sudo docker images
    REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
    training/webapp  latest   fc77f57ad303  3 weeks ago  280.5 MB
    ubuntu           13.10    5e019ab7bf6d  4 weeks ago  180 MB
    ubuntu           saucy    5e019ab7bf6d  4 weeks ago  180 MB
    ubuntu           12.04    74fe38d11401  4 weeks ago  209.6 MB
    ubuntu           precise  74fe38d11401  4 weeks ago  209.6 MB
    ubuntu           12.10    a7cf8ae4e998  4 weeks ago  171.3 MB
    ubuntu           quantal  a7cf8ae4e998  4 weeks ago  171.3 MB
    ubuntu           14.04    99ec81b80c55  4 weeks ago  266 MB
    ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB
    ubuntu           trusty   99ec81b80c55  4 weeks ago  266 MB
    ubuntu           13.04    316b678ddf48  4 weeks ago  169.4 MB
    ubuntu           raring   316b678ddf48  4 weeks ago  169.4 MB
    ubuntu           10.04    3db9c44f4520  4 weeks ago  183 MB
    ubuntu           lucid    3db9c44f4520  4 weeks ago  183 MB

我們可以看到之前使用的映象。每次從Docker Hub下載一個映象就會在本地建立一個對應的容器。

我們在映象列表中看到三個至關重要的東西。

  • 來自什麼映象源,例如ubuntu
  • 每個映象都有標籤,例如14.04
  • 每個映象都有映象ID

映象源中可能有多種不同的映象。Ubuntu中我們會看到多個Ubuntu版本:10.04, 12.04, 12.10, 13.04, 13.10 and 14.04。每個容器有一個唯一的標籤,讓我們來識別不同的映象,例如:

    ubuntu:14.04

所以我們可以執行一個帶標籤映象的容器:

    $ sudo docker run -t -i ubuntu:14.04 /bin/bash

如果我們想要使用Ubuntu 12.04

的映象來構建,我們可以這樣做

    $ sudo docker run -t -i ubuntu:12.04 /bin/bash

如果你不指定一個映象的版本標籤,例如你只使用Ubuntu,Docker將預設使用Ubuntu:latest映象。

提示:我們建議使用映象時指定一個標籤,例如ubuntu:12.04。這樣你知道你使用的是一個什麼版本的映象。

獲取一個新的映象

現在如何獲取一個新的映象?當我們在本地主機上使用一個不存在的映象時Docker就會自動下載這個映象。但是這需要一段時間下載這個映象。如果我們想預先載入這個映象,我們可以使用docker pull命令來下載它。像我們所說的我們下載centos映象。

    $ sudo docker pull centos
    Pulling repository centos
    b7de3133ff98: Pulling dependent layers
    5cc9e91966f7: Pulling fs layer
    511136ea3c5a: Download complete
    ef52fb1fe610: Download complete
    . . .

我們看到每一層的映象都被下載下來了,現在我們可以直接使用這個映象,而不需要在下載這個映象了。

    $ sudo docker run -t -i centos /bin/bash
    bash-4.1#

查詢映象

Docker的特點之一是人們建立了各種各樣的docker映象。而且這些映象已經被上傳到了Docker Hub。我們可以從Docker Hub網站來搜尋映象。

我們也可以使用docker search命令來搜尋映象。譬如說我們的團隊需要一個安裝了Ruby和Sinatra的映象來做我們的web應用程式開發。我們可以通過docker search命令來搜尋所有的sinatra映象來尋找我們合適的映象

    $ sudo docker search sinatra
    NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    training/sinatra                       Sinatra training image                          0                    [OK]
    marceldegraaf/sinatra                  Sinatra test app                                0
    mattwarren/docker-sinatra-demo                                                         0                    [OK]
    luisbebop/docker-sinatra-hello-world                                                   0                    [OK]
    bmorearty/handson-sinatra              handson-ruby + Sinatra for Hands on with D...   0
    subwiz/sinatra                                                                         0
    bmorearty/sinatra                                                                      0
    . . . 

我們看到了返回了大量的sinatra映象。我們看到列表中有映象名稱、描述、Stars(衡量映象的流行程度-如果使用者喜歡這個映象他就會點選stars)和官方自動構建映象狀態。Stackbrew維護者官方倉庫源,映象源是自動構建的,您可以驗證映象的來源和內容。

我們回顧以前使用的映象,我們決定使用sinatra映象。到目前為止,我們已經看到了兩種型別的映象,像ubuntu映象,我們稱它為基礎映象或者根映象。這些映象是由docker公司提供建立、驗證和支援。這些映象都可以通過自己的名字來標示。

我們還可以看到使用者的映象,例如training/sinatra,並且我們可以使用docker pull命令來下載它。

    $ sudo docker pull training/sinatra

現在我們的團隊可以在自己的容器內使用這個映象了。

    $ sudo docker run -t -i training/sinatra /bin/bash
    [email protected]:/#

建立自己的映象

我們的團隊發現training/sinatra映象雖然有用但是不是我們需要的,我們需要針對這個映象做出更改。現在又兩種方法,我們可以更新和建立映象。

  • 1.我們可以從已經建立的容器中更新映象,並且提交這個映象。
  • 2.我們可以使用Dockerfile指令來建立一個映象。

更新並且提交映象

更新一個映象,首先我們要建立一個我們想更新的容器。

    $ sudo docker run -t -i training/sinatra /bin/bash
    [email protected]:/#

注意:建立容器ID0b2616b0e5a8,我們在後邊還需要使用它。

在我們的容器內新增json

    [email protected]:/# gem install json

當我們完成的時候,輸入exit命令來退出這個容器。

現在我們有一個根據我們需求做出改變的容器。我們可以使用docker commit來提交這個容器。

    $ sudo docker commit -m="Added json gem" -a="Kate Smith" \
    0b2616b0e5a8 ouruser/sinatra:v2
    4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

這裡我們使用了docker commit命令。我們可以指定-m-a標示。-m標示是允許我們指定提交的資訊,就像你提交一個版本控制。-a標示允許對我們的更新指定一個使用者。

我們也指定了我們想要建立的新映象來自(我們先前記錄的ID)0b2616b0e5a8和我們指定的目標映象:

    ouruser/sinatra:v2

讓我們分解這個步驟。我們先給這個映象分配了一個新使用者名稱字ouruser;接著,未修改映象名稱,保留了原映象名稱sinatra;最後為映象指定了標籤v2

我們可以使用docker images命令來檢視我們的新映象ouruser/sinatra

    $ sudo docker images
    REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
    training/sinatra    latest  5bc342fa0b91   10 hours ago  446.7 MB
    ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB
    ouruser/sinatra     latest  5db5f8471261   10 hours ago  446.7 MB

使用我們的新映象來建立一個容器:

    $ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
    [email protected]:/#

使用Dockerfile建立映象

使用docker commit命令能非常簡單的擴充套件映象,但是它有點麻煩:在一個團隊中不容易共享它的開發過程。為解決這個問題,我們可以使用一個新的命令來建立新的映象。

為此,我們建立一個Dockerfile,其中包含一組指令告訴docker如何建立我們的映象。

現在讓我們建立一個目錄,並且建立一個Dockerfile

    $ mkdir sinatra
    $ cd sinatra
    $ touch Dockerfile

每一個指令映象就會建立一個新的層,讓我們看一個簡單的例子,我們的開發團建建立一個自己的Sinatra映象:

    # This is a comment
    FROM ubuntu:14.04
    MAINTAINER Kate Smith <[email protected]>
    RUN apt-get -qq update
    RUN apt-get -qqy install ruby ruby-dev
    RUN gem install sinatra

【注意】:1)、每個指令字首都必須大寫:INSTRUCTION statement2)、可以使用#註釋;

讓我們看看Dockerfile做了什麼:第一個指令FROM,告訴Docker使用哪個映象源,在這個案例中我們使用了一個Ubuntu 14.04基礎映象。下一步,我們使用MAINTAINER指令指定誰是維護者。最後,我們指定三個RUN指令,一個RUN指令在映象內執行命令。例如安裝包。這裡我們在Sinatra中更新了APT快取,安裝了RubyRubyGems

注意:我們還提供了更多的Dockerfile指令引數。

現在我們使用docker build命令和Dockerfile命令來建立一個映象。

    $ sudo docker build -t="ouruser/sinatra:v2" .
    Uploading context  2.56 kB
    Uploading context
    Step 0 : FROM ubuntu:14.04
     ---> 99ec81b80c55
    Step 1 : MAINTAINER Kate Smith <[email protected]>
     ---> Running in 7c5664a8a0c1
     ---> 2fa8ca4e2a13
    Removing intermediate container 7c5664a8a0c1
    Step 2 : RUN apt-get -qq update
     ---> Running in b07cc3fb4256
     ---> 50d21070ec0c
    Removing intermediate container b07cc3fb4256
    Step 3 : RUN apt-get -qqy install ruby ruby-dev
     ---> Running in a5b038dd127e
    Selecting previously unselected package libasan0:amd64.
    (Reading database ... 11518 files and directories currently installed.)
    Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ...
    . . .
    Setting up ruby (1:1.9.3.4) ...
    Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ...
    Processing triggers for libc-bin (2.19-0ubuntu6) ...
     ---> 2acb20f17878
    Removing intermediate container a5b038dd127e
    Step 4 : RUN gem install sinatra
     ---> Running in 5e9d0065c1f7
    . . .
    Successfully installed rack-protection-1.5.3
    Successfully installed sinatra-1.4.5
    4 gems installed
     ---> 324104cde6ad
    Removing intermediate container 5e9d0065c1f7
    Successfully built 324104cde6ad

我們使用docker build命令和-t來建立我們的新映象,使用者是ouruser、倉庫源名稱sinatra、標籤是v2

如果Dockerfile在我們當前目錄下,我們可以使用.來指定Dockerfile

提示:你也可以指定Dockerfile路徑

現在我們可以看到構建過程。docker做的第一件事是通過你的上下文構建。基本上是目錄的內容構建。docker會根據本地的內容來在docker程序中去構建。

下一步,我們Dockerfile一步一步執行命令。我們可以看到,每個步驟可以建立一個新的容器,在容器內執行指令並且提交改變,就像我們早期看到的docker commit流程、當所有的指令執行完成之後,我們就會得到324104cde6ad映象(有助於標記ouruser/sinatra:v2),然後所有中間容器會被刪除乾淨。

我們可以從我們的新映象中建立一個容器:

    $ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
    [email protected]:/#

注意:這是比較簡單的建立映象方法。我們跳過了你可以使用的一大堆指令。在後面的部門我們將會看到更多的指令指南,或者你可以參考Dockerfile參考的例子和詳細描述每一個指令。

設定映象標籤

你可以給現有的映象新增標記,然後提交和構建。我們可以使用docke tag命令。讓我們給ouruser/sinatra映象新增一個新的標籤。

    $ sudo docker tag 5db5f8471261 ouruser/sinatra:devel

docker tag指令標記映象ID,這裡是5db5f8471261,設定我們的使用者名稱稱、映象源名稱和新的標籤。

讓我們使用docker images命令檢視新的標籤。

    $ sudo docker images ouruser/sinatra
    REPOSITORY          TAG     IMAGE ID      CREATED        VIRTUAL SIZE
    ouruser/sinatra     latest  5db5f8471261  11 hours ago   446.7 MB
    ouruser/sinatra     devel   5db5f8471261  11 hours ago   446.7 MB
    ouruser/sinatra     v2      5db5f8471261  11 hours ago   446.7 MB

向Docker Hub推送映象

一旦你構建或創造一個新的映象,你可以使用docker push命令推送到Docker Hub。可以對其他人公開進行分享,或把它新增到你的私人倉庫中。

    $ sudo docker push ouruser/sinatra
    The push refers to a repository [ouruser/sinatra] (len: 1)
    Sending image list
    Pushing repository ouruser/sinatra (3 tags)
    . . .

主機中移除映象

你也可以刪除你主機上的映象,某種程度上我們可以使用docker rmi命令。

讓我們刪除已經不需要的容器:training/sinatra

    $ sudo docker rmi training/sinatra
    Untagged: training/sinatra:latest
    Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
    Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
    Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

提示:在容器從主機中移除前,請確定容器沒有被使用。