• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            zhiye_wang

            向星空仰望的越深,越發(fā)現(xiàn)自己的渺小

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              31 隨筆 :: 1 文章 :: 2 評(píng)論 :: 0 Trackbacks

            第4章 使用Docker鏡像和倉(cāng)庫(kù)

            回顧:

            回顧如何使用 docker run 創(chuàng)建最基本的容器

            $sudo docker run -i -t --name another_container_mum ubuntu /bin/bash

            root@3d49f5830c81:/# 

            這條命令會(huì)啟動(dòng)一個(gè)新的名為 another_container_mum 的容器,這個(gè)容器基于ubuntu鏡

            像并且會(huì)啟動(dòng)Bash Shell

            ---------------------------------------------------------------------------------------------

            4.1 什么是 Docker 鏡像

            4.2 列出鏡像


            可以看出我這里有三個(gè)鏡像。

            其中 ubuntu 是我上午下載的 ubuntu 基礎(chǔ)鏡像,paulcos11/docker-tutorial 是下載的另外

            一個(gè)用戶上傳的鏡像。但是不知道 CREATED 這一欄的時(shí)間怎么不準(zhǔn)。

            鏡像從倉(cāng)庫(kù)下載下來(lái)。鏡像保存在倉(cāng)庫(kù)中。而倉(cāng)庫(kù)存在于Registry中。默認(rèn)的Registry是由Do

            cker公司運(yùn)營(yíng)的公共 Registry 服務(wù),即是 Dcoker Hub。

            每個(gè)鏡像庫(kù)都可以存放很多鏡像,例如我們查看一下ubuntu倉(cāng)庫(kù)中的其他鏡像,

            可是使用 docker images 查看所有的 ubuntu docker 鏡像

            sudo docker images

            可以使用docker pull下載某個(gè)基礎(chǔ)鏡像

            [#12#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull ubuntu

             

            Docker Hun 中有兩種類型倉(cāng)庫(kù):用戶倉(cāng)庫(kù)和頂層倉(cāng)庫(kù)。用戶倉(cāng)庫(kù)的鏡像都是有Docker用戶

            創(chuàng)建的,而頂層倉(cāng)庫(kù)則是由Docker內(nèi)部的人來(lái)管理的。用戶倉(cāng)庫(kù)的命名由用戶名和倉(cāng)庫(kù)名兩

            部分組成,如:paulcos11/docker-tutorial,用戶名:paulcos11,倉(cāng)庫(kù)名:docker-tutor

            ial,與其相對(duì)的頂層倉(cāng)庫(kù)只包含倉(cāng)庫(kù)名部分,例如 ubuntu,fedora。頂層倉(cāng)庫(kù)由Docker公

            司和由選定的能提供優(yōu)質(zhì)基礎(chǔ)鏡像的廠商管理。

            4.3 拉取鏡像

            使用docker images可以查看本地Docker宿主機(jī)上面的鏡像。如果希望能在鏡像列表中只看

            到某個(gè)鏡像的內(nèi)容,例如 fedora,可以通過(guò)在 docker images 命令后面跟指定的鏡像名來(lái)實(shí)

            現(xiàn),例如: 

            使用 docker pull 拉取鏡像

            [#15#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull fedora

            Using default tag: latest

            latest: Pulling from library/fedora

            6888fc827a3f: Pull complete 

            9bdb5101e5fc: Downloading [===================>                               ] 28.63 MB/74.33 MB

            4.4 查找鏡像

            我本地的鏡鏡像有:

            [#1#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker images

            [sudo] password for cloudsoar: 

            REPOSITORY                         TAG                 IMAGE ID               CREATED             VIRTUAL SIZE

            paulcos11/docker-tutorial   latest              e37931352714        8 days ago          587.8 MB

            ubuntu                                  latest              8ed581e3fa7a        11 days ago         188 MB

            此時(shí) fedora 鏡像還是沒(méi)有下載完畢的。不著急。我們先練習(xí)其他的操作,在 paulcos11/do

            cker-tutorial 鏡像中使用 docker run 命令來(lái)從 docker-tutorial 創(chuàng)建一個(gè)容器。

            [#2#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t paulcos11/docker-tutorial /bin/bash

            root@869a3b2049ad:/#

            可以看到,已經(jīng)從 paulcos11/docker-tutorial 鏡像啟動(dòng)了一個(gè)新的容器。

            4.5 構(gòu)建鏡像

            構(gòu)建 Docker 鏡像有以下兩種方法:

            使用 docker commit 命令。

            使用 docker build 命令和 Dockerfile 文件。

            4.5.1 創(chuàng)建 Docker Hub 賬號(hào)

            在 hub.docker.com 創(chuàng)建一個(gè)自己的賬號(hào),注冊(cè)之后通過(guò)收到的確認(rèn)郵件激活,下面就可以測(cè)

            試剛才注冊(cè)的賬號(hào)是否可以工作了。要登錄到 docker hub,可以使用 docker login 命令。如

            這里看到我是注冊(cè)成功了,用戶名只能是字母或者數(shù)組的組合。下面使用 docker login 來(lái)驗(yàn)證

            我的賬號(hào):

            [#4#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker login

            Username: zhiyewang

            Password: 

            Email: zhiye_wang@yeah.net           

            WARNING: login credentials saved in /home/cloudsoar/.docker/config.json

            Login Succeeded

            可以看到我的賬號(hào)登錄成功了。

            4.5.2 使用 Docker 的 commit 命令創(chuàng)建鏡像

            這里我基于前面下載的 ubuntu 鏡像來(lái)創(chuàng)建一個(gè)新鏡像。

            首先我在這個(gè)基礎(chǔ)鏡像中啟動(dòng)一個(gè)容器

            [#5#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t ubuntu /bin/bash

            root@460f5a1ac42a:/# 

            在容器中安裝個(gè) Apache 作為一個(gè) web 服務(wù)器來(lái)運(yùn)行。這樣每次使用 Apache 的時(shí)候不用再

            重新安裝 Apache 了。

            root@460f5a1ac42a:/# apt-get -y install apache2

            Reading package lists... Done

            Building dependency tree       

            root@460f5a1ac42a:/# apt-get -y install vim

            我喜歡用vim,同時(shí)又安裝了一個(gè) vim,哇咔咔。

            為了完成此項(xiàng)工作,需要先退出 exit ,然后執(zhí)行 docker commit 命令。

             

            這里需要注意的是, docker commit 提交的是創(chuàng)建容器的鏡像與容器的當(dāng)前狀態(tài)之間有差異

            的部分,這使得該更新非常輕量。這里可以看到我創(chuàng)建的結(jié)果。


            如果像從剛才創(chuàng)建的鏡像運(yùn)行一個(gè)容器,可以使用 docker run 命令

            [#16#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -t -i zhiyewang/apache2 /bin/bash

            root@bb634a313bf2:/# 

            4.5.3 使用 Dockerfile 構(gòu)建鏡像

            事實(shí)上所有資料都不推介使用 docker commit 的方法構(gòu)建鏡像,而是使用 Dockerfile 的定義

            文件和 docker build 命令來(lái)構(gòu)建鏡像。

            我們的第一個(gè) Dockerfile

            現(xiàn)在我們創(chuàng)建一個(gè)目錄,并在里面創(chuàng)建初始的 Dockerfile,我們將創(chuàng)建一個(gè)包含簡(jiǎn)單 Web 服

            服務(wù)器的 Docker 鏡像。


            這里我們創(chuàng)建了一個(gè)名為 static_web 的目錄用來(lái)保存 Dockerfile,這個(gè)目錄就是我們的構(gòu)建環(huán)

            境(build environment),Docker 則稱此環(huán)境為上下文(context)或者構(gòu)建上下文(build

             context)。Docker 會(huì)在構(gòu)建鏡像時(shí)候,將構(gòu)建上下文和該上下文中的文件和目錄上傳到 doc

             ker 守護(hù)進(jìn)程。這樣 Docker 守護(hù)進(jìn)程就能直接訪問(wèn)你想在鏡像中存儲(chǔ)的任何代碼。

            下面是一個(gè) Dockerfile 的例子,用 Dockerfile 構(gòu)建一個(gè)能作為 Web 服務(wù)器的 Docker 鏡像。

              1 # version: 0.0.1

              2 FROM ubuntu:14.04

              3 MAINTAINER zhiyewang "zhiye_wang@yeah.net"

              4 RUN apt-get update

              5 RUN apt-get install -y nginx

              6 RUN echo 'Hi, I am in your container' \

              7     >/usr/share/nginx/html/index.html

              8 EXPOSE 80                             

            命令解釋:

            Dockerfile 由一系列指令和參數(shù)組成。每條指令都是大寫,而且后面需要跟一個(gè)參數(shù)。Docker

             file 會(huì)按照順序從上往下執(zhí)行。

            Dockerfile 支持注釋,所有以井號(hào)開(kāi)頭的都是注釋。

            FROM ubuntu:14.04 指定了 ubuntu 14.04 作為基礎(chǔ)鏡像,每

            執(zhí)行一條指令,對(duì)容器做出修改。自動(dòng)會(huì)再指定類似 docker commit 的操作,提交一個(gè)新鏡像

            層,繼續(xù)執(zhí)行下一條指令。

            MAINTAINER 指令會(huì)告訴 Docker 該鏡像的作者是誰(shuí),以及作者的電子郵件地址。

            接下來(lái)我們執(zhí)行了三條 RUN 指令,RUN 指令會(huì)在當(dāng)前鏡像中運(yùn)行指定的命令。我們通過(guò)RUN明

            令更新了 APT 倉(cāng)庫(kù),安裝了 nginx 包,之后創(chuàng)建了  /usr/share/nginx/html/index.html 文件,

            默認(rèn)情況,RUN執(zhí)行會(huì)在 shell 里使用 /bin/sh -c 來(lái)執(zhí)行。如果再不支持 shell 或者不想再 shell

            中運(yùn)行,可以使用 exec 格式的 RUN

            RUN [ "apt-get", "install", "-y", "nginx" ]

            接下來(lái)的 EXPOSE 指令,告訴 Docker 該容器內(nèi)的應(yīng)用程序?qū)?huì)使用 Docker 的指定端口。但是

            Docker 并不會(huì)自動(dòng)打開(kāi)此端口,而是需要再使用 docker run 運(yùn)行容器時(shí)候指定需要打開(kāi)那些端

            口。

            4.5.4 基于 Dockerfile 構(gòu)建新鏡像

            運(yùn)行 Dockerfile 

            [#34#cloudsoar@cloudsoar-virtual-machine ~]$cd static_web/

            [#35#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker build -t="zhiyewang/static_web" .

            Sending build context to Docker daemon 2.048 kB

            Step 1 : FROM ubuntu:14.04

            14.04: Pulling from library/ubuntu

            Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

            Status: Downloaded newer image for ubuntu:14.04

             ---> 8ed581e3fa7a

            Step 2 : MAINTAINER zhiyewang "zhiye_wang@yeah.net"

             ---> Running in 7806118624b7

             ---> c5aed3a8ff95

            Removing intermediate container 7806118624b7

            ...

            Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...

             ---> ddc8935b098a

            Removing intermediate container c81405d28e41

            Step 5 : RUN echo 'Hi, I am in your container'  >/usr/share/nginx/html/index.html

             ---> Running in f0049e284208

             ---> 6a7a53f6e78a

            Removing intermediate container f0049e284208

            Step 6 : EXPOSE 80

             ---> Running in 2a0714253002

             ---> e97eb7ef0136

            Removing intermediate container 2a0714253002

            Successfully built e97eb7ef0136

             

            這里使用 -t 參數(shù)為新鏡像設(shè)置了倉(cāng)庫(kù)和名稱。倉(cāng)庫(kù)為 zhiyewang,名稱為 static_web,也可

            以構(gòu)建過(guò)程中為鏡像添加一個(gè)標(biāo)簽,方法為“鏡像名:標(biāo)簽”
            sudo docker build -t="zhiyewang/static_web:v1" .

            如果沒(méi)有定制任何標(biāo)簽,Docker 會(huì)自動(dòng)為鏡像設(shè)置一個(gè) latest 標(biāo)簽。

            上面命令最后的 . 告訴我們?nèi)ギ?dāng)前路徑去找 Dockerfile 文件。也可以指定一個(gè) Git 倉(cāng)庫(kù)的源地

            址來(lái)指定 Dockerfile 的位置。例如

            sudo docker build -t="zhiyewang/static_web:v1" \

             git@github.com:zhiyewang/docker-static_web

            這里假設(shè)的在 Git 倉(cāng)庫(kù)的目錄下存在 Dockerfile 文件。我也沒(méi)有注冊(cè) Git 賬號(hào)去執(zhí)行過(guò)。

            查看 docker build 過(guò)程發(fā)現(xiàn),構(gòu)建上下文已經(jīng)上傳到了 Docker 守護(hù)進(jìn)程:

            Sending build context to Docker daemon 2.048 kB

            之后,可以看到 Dockerfile 中的每條明令都被順序執(zhí)行,而且構(gòu)建過(guò)程的最終結(jié)果返回了新的

            鏡像的 ID,即 e97eb7ef0136 ,并且 Docker 會(huì)提交每一步的執(zhí)行結(jié)果。

            4.5.4 指令失敗時(shí)候會(huì)怎樣

            例如我們將上面的第 4 步的包名 nginx 寫成 ngin

            [#41#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker build -t="zhiyewang/static_web" .

            [sudo] password for cloudsoar: 

            Sending build context to Docker daemon 2.048 kB

            Step 1 : FROM ubuntu:14.04

             ---> 8ed581e3fa7a

            Step 2 : MAINTAINER zhiyewang "zhiye_wang@yeah.net"

             ---> Using cache

             ---> c5aed3a8ff95

            Step 3 : RUN apt-get update

             ---> Using cache

             ---> 40fa5cd1c3d2

            Step 4 : RUN apt-get install -y ngin

             ---> Running in 86e3dbaadf20

            Reading package lists...

            Building dependency tree...

            Reading state information...

            E: Unable to locate package ngin

            The command '/bin/sh -c apt-get install -y ngin' returned a non-zero code: 100

            發(fā)現(xiàn)會(huì)出錯(cuò)。我們來(lái)調(diào)試一下失敗原因。用 docker run 明令來(lái)基于這次構(gòu)建到目前為止已經(jīng)

            成功的最后一步創(chuàng)建一個(gè)容器,它的 ID 是 40fa5cd1c3d2 ,如下代碼:

            [#42#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker run -t -i 40fa5cd1c3d2 /bin/bash

            root@b978996f25f3:/#

            這時(shí)我們?cè)诖巳萜髦羞\(yùn)行第 4 步:

            root@b978996f25f3:/# apt-get install -y ngin

            Reading package lists... Done

            Building dependency tree       

            Reading state information... Done

            E: Unable to locate package ngin

            發(fā)現(xiàn)包名錯(cuò)誤。

            我們可以在這個(gè)容器中再次運(yùn)行 apt-get install -y nginx,這次輸入正確的包名,來(lái)定位問(wèn)題

            ,如果一旦解決了這個(gè)問(wèn)題,就可以退出容器,用正確的包名修改 Dockerfile 文件,之后再次

            構(gòu)建即可。

            這一篇到這里。下一篇繼續(xù)學(xué)習(xí)Dockerfile 和構(gòu)建緩存。

            posted on 2016-03-17 11:00 zhiye_wang 閱讀(444) 評(píng)論(0)  編輯 收藏 引用 所屬分類: docker
            日韩欧美亚洲综合久久影院Ds| 久久精品午夜一区二区福利| 草草久久久无码国产专区| 亚洲级αV无码毛片久久精品 | 久久国产一区二区| 99久久精品国产一区二区| 97久久精品人人做人人爽| 性高朝久久久久久久久久| 久久精品人人做人人爽电影蜜月| 国产精品福利一区二区久久| 成人国内精品久久久久一区| 26uuu久久五月天| 久久久久久久波多野结衣高潮 | 亚洲精品乱码久久久久久蜜桃不卡| 欧美一区二区三区久久综| 精品视频久久久久| 99久久精品国产高清一区二区| 国内精品久久久久久中文字幕| 亚洲AV日韩AV天堂久久| 久久国产乱子伦精品免费午夜| 国产精品一久久香蕉产线看| 亚洲中文字幕伊人久久无码| av午夜福利一片免费看久久| 思思久久99热只有频精品66| 久久精品国内一区二区三区| 久久AV高潮AV无码AV| 国产午夜精品久久久久九九电影 | 国产欧美久久一区二区| 久久人人爽人人爽人人片AV麻烦| 秋霞久久国产精品电影院| 精品乱码久久久久久久| 中文无码久久精品| 国产精品亚洲综合久久| 青青草原综合久久大伊人导航| 国产精品99久久不卡| 久久99国产乱子伦精品免费| 伊人久久大香线蕉综合Av| 国产精品美女久久福利网站| 久久无码AV中文出轨人妻| 久久无码专区国产精品发布| 一本色综合久久|