Docker整理之Docker映象相關(三)
阿新 • • 發佈:2019-02-19
在主機上列出映象 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 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
root@a8cb6ce02d85:/#
建立自己的映象
我們發現training/sinatra映象雖然有用但是不是我們需要的,我們需要針對這個映象做出更改。現在又兩種方法,我們可以更新和建立映象。
1.我們可以從已經建立的容器中更新映象,並且提交這個映象。
2.我們可以使用Dockerfile指令來建立一個映象。
更新並且提交映象
更新一個映象,首先我們要建立一個我們想更新的容器。
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
注意:建立容器ID0b2616b0e5a8,我們在後邊還需要使用它。
在我們的容器內新增json
root@0b2616b0e5a8:/# 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
root@78e82f680994:/#
使用Dockerfile建立映象
我們還可以自動化構建新的映象。
為此,我們建立一個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 statement 2)、可以使用#註釋;
讓我們看看Dockerfile做了什麼: 第一個指令FROM,告訴Docker使用哪個映象源,在這個案例中我們使用了一個Ubuntu 14.04基礎映象。 下一步,我們使用MAINTAINER指令指定誰是維護者。 最後,我們指定三個RUN指令,一個RUN指令在映象內執行命令。例如安裝包。這裡我們在Sinatra中更新了APT快取,安裝了Ruby和RubyGems。
注意:我們還提供了更多的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
root@8196968dac35:/#
注意:這是比較簡單的建立映象方法。我們跳過了你可以使用的一大堆指令。在後面的部門我們將會看到更多的指令指南,或者你可以參考Dockerfile參考的例子和詳細描述每一個指令。
Dockerfile詳解
FROM
格式為 FROM <image>或FROM <image>:<tag>。
第一條指令必須為 FROM 指令。並且,如果在同一個Dockerfile中建立多個映象時,可以使用多個 FROM 指令(每個映象一次)。
MAINTAINER
格式為 MAINTAINER <name>,指定維護者資訊。
RUN
格式為 RUN <command> 或 RUN ["executable", "param1", "param2"]。
前者將在 shell 終端中執行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條 RUN 指令將在當前映象基礎上執行指定命令,並提交為新的映象。當命令較長時可以使用 \ 來換行。
CMD
支援三種格式
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給需要互動的應用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的預設引數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。
如果使用者啟動容器時候指定了執行的命令,則會覆蓋掉 CMD 指定的命令。
EXPOSE
格式為 EXPOSE <port> [<port>...]。
告訴 Docker 服務端容器暴露的埠號,供互聯絡統使用。在啟動容器時需要通過 -P,Docker 主機會自動分配一個埠轉發到指定的埠。
ENV
格式為 ENV <key> <value>。 指定一個環境變數,會被後續 RUN 指令使用,並在容器執行時保持。
例如
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
格式為 ADD <src> <dest>。
該命令將複製指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 檔案(自動解壓為目錄)。
COPY
格式為 COPY <src> <dest>。
複製本地主機的 <src>(為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。
當使用本地目錄為源目錄時,推薦使用 COPY。
ADD可以操作遠端主機檔案,COPY不可以
ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
RUN構建映象時執行,CMD啟動容器時執行,可以使用docker run 後面加命令覆蓋。
ENTRYPOINT不可被覆蓋,除非指定docker run --entypoint
VOLUME
格式為 VOLUME ["/data"]。
建立一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的資料等。
USER
格式為 USER daemon。
指定執行容器時的使用者名稱或 UID,後續的 RUN 也會使用指定使用者。
當服務不需要管理員許可權時,可以通過該命令指定執行使用者。並且可以在之前建立所需要的使用者,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員許可權可以使用 gosu,而不推薦 sudo。
WORKDIR
格式為 WORKDIR /path/to/workdir。
為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c。
ONBUILD
格式為 ONBUILD [INSTRUCTION]。
配置當所建立的映象作為其它新建立映象的基礎映象時,所執行的操作指令。
例如,Dockerfile 使用如下的內容建立了映象 image-A。
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基於 image-A 建立新的映象時,新的Dockerfile中使用 FROM image-A指定基礎映象時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的映象,推薦在標籤中註明,例如 ruby:1.9-onbuild。
設定映象標籤
你可以給現有的映象新增標記,然後提交和構建。我們可以使用docke tag命令。讓我們給ouruser/sinatra映象新增一個新的標籤。
$ sudo doc ker 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命令。
$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
$ 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 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
root@a8cb6ce02d85:/#
建立自己的映象
我們發現training/sinatra映象雖然有用但是不是我們需要的,我們需要針對這個映象做出更改。現在又兩種方法,我們可以更新和建立映象。
1.我們可以從已經建立的容器中更新映象,並且提交這個映象。
2.我們可以使用Dockerfile指令來建立一個映象。
更新並且提交映象
更新一個映象,首先我們要建立一個我們想更新的容器。
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
注意:建立容器ID0b2616b0e5a8,我們在後邊還需要使用它。
在我們的容器內新增json
root@0b2616b0e5a8:/# 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
root@78e82f680994:/#
使用Dockerfile建立映象
我們還可以自動化構建新的映象。
為此,我們建立一個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 statement 2)、可以使用#註釋;
讓我們看看Dockerfile做了什麼: 第一個指令FROM,告訴Docker使用哪個映象源,在這個案例中我們使用了一個Ubuntu 14.04基礎映象。 下一步,我們使用MAINTAINER指令指定誰是維護者。 最後,我們指定三個RUN指令,一個RUN指令在映象內執行命令。例如安裝包。這裡我們在Sinatra中更新了APT快取,安裝了Ruby和RubyGems。
注意:我們還提供了更多的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
root@8196968dac35:/#
注意:這是比較簡單的建立映象方法。我們跳過了你可以使用的一大堆指令。在後面的部門我們將會看到更多的指令指南,或者你可以參考Dockerfile參考的例子和詳細描述每一個指令。
Dockerfile詳解
FROM
格式為 FROM <image>或FROM <image>:<tag>。
第一條指令必須為 FROM 指令。並且,如果在同一個Dockerfile中建立多個映象時,可以使用多個 FROM 指令(每個映象一次)。
MAINTAINER
格式為 MAINTAINER <name>,指定維護者資訊。
RUN
格式為 RUN <command> 或 RUN ["executable", "param1", "param2"]。
前者將在 shell 終端中執行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條 RUN 指令將在當前映象基礎上執行指定命令,並提交為新的映象。當命令較長時可以使用 \ 來換行。
CMD
支援三種格式
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給需要互動的應用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的預設引數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。
如果使用者啟動容器時候指定了執行的命令,則會覆蓋掉 CMD 指定的命令。
EXPOSE
格式為 EXPOSE <port> [<port>...]。
告訴 Docker 服務端容器暴露的埠號,供互聯絡統使用。在啟動容器時需要通過 -P,Docker 主機會自動分配一個埠轉發到指定的埠。
ENV
格式為 ENV <key> <value>。 指定一個環境變數,會被後續 RUN 指令使用,並在容器執行時保持。
例如
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
格式為 ADD <src> <dest>。
該命令將複製指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 檔案(自動解壓為目錄)。
COPY
格式為 COPY <src> <dest>。
複製本地主機的 <src>(為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。
當使用本地目錄為源目錄時,推薦使用 COPY。
ADD可以操作遠端主機檔案,COPY不可以
ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
RUN構建映象時執行,CMD啟動容器時執行,可以使用docker run 後面加命令覆蓋。
ENTRYPOINT不可被覆蓋,除非指定docker run --entypoint
VOLUME
格式為 VOLUME ["/data"]。
建立一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的資料等。
USER
格式為 USER daemon。
指定執行容器時的使用者名稱或 UID,後續的 RUN 也會使用指定使用者。
當服務不需要管理員許可權時,可以通過該命令指定執行使用者。並且可以在之前建立所需要的使用者,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員許可權可以使用 gosu,而不推薦 sudo。
WORKDIR
格式為 WORKDIR /path/to/workdir。
為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c。
ONBUILD
格式為 ONBUILD [INSTRUCTION]。
配置當所建立的映象作為其它新建立映象的基礎映象時,所執行的操作指令。
例如,Dockerfile 使用如下的內容建立了映象 image-A。
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基於 image-A 建立新的映象時,新的Dockerfile中使用 FROM image-A指定基礎映象時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的映象,推薦在標籤中註明,例如 ruby:1.9-onbuild。
設定映象標籤
你可以給現有的映象新增標記,然後提交和構建。我們可以使用docke tag命令。讓我們給ouruser/sinatra映象新增一個新的標籤。
$ sudo doc ker 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命令。
$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0