天天看點

Docker 建構鏡像

docker預設提供了一些鏡像,在github上我們也可以找到很多已經做好的鏡像,但是不可避免大多數情況我們需要根據自己的需求來定制建構自己需要的鏡像。

Docker可以通過從Dockerfile(包含所有指令的文本檔案)中讀取建構映像所需的指令來自動建構映像。 Dockerfiles遵循特定格式并使用一組特定的說明。很多軟體版本也提供了Dockerfile檔案。它就像一個自動化的腳本一樣,幫我們設定好所需的鏡像功能。

手工建構鏡像

為了更好的了解Dockerfile,我們先不使用Dockerfile,純手工建構一個docker 鏡像。建構鏡像就是在鏡像中安裝一種服務,當容器使用這個鏡像運作時,就可以對外提供服務。

建構一個nginx服務的鏡像:

1、建立一個容器

1

<code>docker run -it --name nginx1 centos</code>

2、進入容器,對容器進行定制

2

<code>rpm -ivh http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/epel-release-latest-7</code><code>.noarch.rpm</code>

<code>yum </code><code>install</code> <code>nginx -y</code>

3、修改nginx配置檔案,我們讓nginx預設在前台啟動,這樣才能保證我們的docker容器持續運作不退出。(像nginx這中無狀态的服務,docker 單程序運作完畢後就會自動退出)

3

4

5

6

7

8

<code>vi</code> <code>/etc/nginx/nginx</code><code>.conf</code>

<code>...</code>

<code>user nginx;</code>

<code>daemon off;</code>

<code>worker_processes auto;</code>

<code>error_log </code><code>/var/log/nginx/error</code><code>.log;</code>

<code>pid </code><code>/run/nginx</code><code>.pid;</code>

4、退出容器,送出鏡像

<code> </code><code>docker commit -m </code><code>"nginx test images"</code> <code>nginx1 trying</code><code>/nginx</code><code>:v1</code>

這裡的文法類似于git的commit 參數, nginx1表示的之前建立的容器名, trying表示使用者名稱可以任意填寫,nginx表示鏡像名稱,v1是tag标簽,這裡可以表示版本号。

檢視本地送出的鏡像:

<code># docker images</code>

<code>REPOSITORY           TAG            IMAGE ID         CREATED             SIZE</code>

<code>trying</code><code>/nginx</code>          <code>v1            984bbb4cdad8       5 minutes ago       381.9 MB</code>

<code>docker.io</code><code>/centos</code>       <code>latest          36540f359ca3       6 days ago          192.5 MB</code>

5、以定制的鏡像啟動容器,最後的nginx參數為nginx服務的啟動指令:

<code>docker run --name testnginx -d -p 81:80 trying</code><code>/nginx</code><code>:v1 nginx</code>

檢視容器運作狀态:

<code># docker ps</code>

<code>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES</code>

<code>c2f907850623        trying</code><code>/nginx</code><code>:v1     </code><code>"nginx"</code>             <code>19 seconds ago      Up 16 seconds       0.0.0.0:81-&gt;80</code><code>/tcp</code>   <code>testnginx</code>

這樣通過在外部使用ip+端口的通路方式就可以通路nginx了。

Dockerfile

Dockerfile制作容器鏡像非常簡單,隻要按照規則書寫Dockerfile檔案,然後在Dockerfile存放的路徑執行docker build . 即可。

警告:不要使用root目錄或/目錄作為build路徑,因為它将會建構硬碟驅動器的所有内容傳輸到Docker守護程式,docker的核心思想是一個容器一個程序(one process per container),是以不要在容器中安裝不必要的軟體工具包,這樣會使容器鏡像過于龐大。

確定Dockerfile在目前目錄下,如果不在也可以采用絕對路徑的方式,此外Dockerfile的首字母D必須大寫。在Dockerfile中#表示注釋資訊。

Dockerfile文法格式

<code>FROM          指定的基礎鏡像,如之前指定的centos鏡像</code>

<code>MAINTAINER    鏡像的作者資訊,維護資訊等</code>

<code>RUN           建構的時候所要執行的指令</code>

<code>ADD           需要增加的檔案,軟體包等,如果是壓縮檔案則會進行自動解壓,可以使用多次</code>

<code>WORKDIR       設定目前工作目錄</code>

<code>VOLUME        設定目錄挂載</code>

<code>EXPOSE        開放一個端口</code>

<code>CMD           容器啟動時執行的指令,一個dockerfile中隻能有一個CMD指令,如果命名複雜,可以使用 command1 &amp;&amp; command2 &amp;&amp; command3 的方式</code>

我們使用Dockerfile對上面手工制作的鏡像重新定制一次:

建立Dockerfile目錄/docker/dockerfile/,編輯一個index.html的網頁檔案:

<code>echo</code> <code>"Stay Hungry.Stay Foolish."</code> <code>&gt; index.html</code>

編寫Dockerfile:

<code># vim /docker/dockerfile/Dockerfile</code>

<code>#build nginx image docker file</code>

<code>FROM centos</code>

<code>MAINTAINER trying [email protected]</code>

<code>RUN rpm -ivh http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/epel-release-latest-7</code><code>.noarch.rpm</code>

<code>RUN yum </code><code>install</code> <code>nginx -y</code>

<code>ADD index.html </code><code>/usr/share/nginx/html/index</code><code>.html</code>

<code>EXPOSE 80</code>

<code>CMD [</code><code>"nginx"</code><code>]</code>

使用build指令建構鏡像:

<code># docker build -t trying/nginx_dockerfile:v1 /docker/dockerfile/</code>

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<code>Sending build context to Docker daemon 3.072 kB</code>

<code>Step 1 : FROM centos</code>

<code> </code><code>---&gt; 36540f359ca3</code>

<code>Step 2 : MAINTAINER trying [email protected]</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>719632447d38</code>

<code> </code><code>---&gt; 720fb072144a</code>

<code>Removing intermediate container 719632447d38</code>

<code>Step 3 : RUN rpm -ivh http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/epel-release-latest-7</code><code>.noarch.rpm</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>eadff91a88c6</code>

<code>Step 4 : RUN yum </code><code>install</code> <code>nginx -y</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>d76ae111324c</code>

<code>Step 5 : ADD index.html </code><code>/usr/share/nginx/html/index</code><code>.html</code>

<code> </code><code>---&gt; 587a9f14a14d</code>

<code>Removing intermediate container 31055a385b89</code>

<code>Step 6 : EXPOSE 80</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>8be900e770b6</code>

<code> </code><code>---&gt; 83ef87f3d178</code>

<code>Removing intermediate container 8be900e770b6</code>

<code>Step 7 : CMD nginx</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>c6a67d852704</code>

<code> </code><code>---&gt; 676b792ab10e</code>

<code>Removing intermediate container c6a67d852704</code>

<code>Successfully built 676b792ab10e</code>

這裡-t參數指定了倉庫名稱和版本号,後面的路徑是Dockerfile檔案和添加的檔案所在的路徑。

檢視生成的鏡像:

<code>REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE</code>

<code>trying</code><code>/nginx_dockerfile</code>   <code>v1                  676b792ab10e        37 seconds ago      400.7 MB</code>

使用此鏡像啟動一個容器:

<code>docker run -d -p 80:80 --name nginx-dockerfile3 trying</code><code>/nginx_dockerfile</code><code>:v1 nginx -g </code><code>'daemon off;'</code>

由于在容器中沒有配置nginx前台運作,是以在啟動的時候指定前台啟動,在實際生産中,這些配置檔案都需要通過ADD去添加。

在其他機器上通路docker主控端:

<code># curl 192.168.1.33</code>

<code>Stay Hungry.Stay Foolish.</code>

在實際的生産中,對于無法解耦的複雜應用就不适合使用docker,docker 更多是提供微服務架構解決方案,對于一般的業務平台可以将虛拟機和容器混合使用。

 本文轉自 酥心糖 51CTO部落格,原文連結:http://blog.51cto.com/tryingstuff/1946990

繼續閱讀