1. 程式人生 > >Docker實戰(二):製作自己的Docker映象

Docker實戰(二):製作自己的Docker映象

製作自己的Docker映象

製作自己的Docker映象主要有如下兩種方式:

1.使用docker commit 命令來建立映象

  1. 通過docker run命令啟動容器
  2. 修改docker映象內容
  3. docker commit提交修改的映象
  4. docker run新的映象

2.使用 Dockerfile 來建立映象

使用 docker commit 來擴充套件一個映象比較簡單,但是不方便在一個團隊中分享。我們可以使用 docker build 來建立一個新的映象。為此,首先需要建立一個 Dockerfile,包含一些如何建立映象的指令。

Dockerfile 基本的語法

  • 使用#來註釋
  • FROM 指令告訴 Docker 使用哪個映象作為基礎
  • 接著是維護者的資訊
  • RUN開頭的指令會在建立中執行,比如安裝一個軟體包,在這裡使用 apt-get 來安裝了一些軟體

構建映象的步驟

1.新建一個目錄和一個 Dockerfile

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>mkdir new_folder
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>cd new_folder
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>touch <span class="hljs-constant" style="box-sizing: border-box;">Dockerfile</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

2.編寫Dockerfile,Dockerfile中每一條指令都建立映象的一層,例如:

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 這裡是註釋</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 設定繼承自哪個映象</span>
FROM ubuntu:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14.04</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 下面是一些建立者的基本資訊</span>
MAINTAINER birdben (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">191654006</span>@<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">163.</span>com)
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 在終端需要執行的命令</span>
RUN apt-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">get</span> install -y openssh-server
RUN mkdir -p /<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span>/run/sshd</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

3.編寫完成 Dockerfile 後可以使用 docker build 來生成映象。

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">$ sudo docker build -t=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"birdben/ubuntu:v1"</span> .
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 下面是一堆構建日誌資訊</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">############</span>
我是日誌
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">############</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 引數:</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># -t 標記來新增 tag,指定新的映象的使用者和映象名稱資訊。 </span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># “.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換為一個具體的 Dockerfile 的路徑。</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 以互動方式執行docker</span>
$ docker run -it birdben/ubuntu:v1 /bin/bash

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 執行docker時指定配置</span>
$ sudo docker run -d -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10.211</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.55</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.4</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9999</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">22</span> ubuntu:tools <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/usr/sbin/sshd'</span> -D

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 引數:</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># -i:表示以“互動模式”執行容器,-i 則讓容器的標準輸入保持開啟</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># -t:表示容器啟動後會進入其命令列,-t 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># -v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>,-v 標記來建立一個數據卷並掛載到容器裡。在一次 run 中多次使用可以掛載多個數據卷。</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># -p:指定對外80埠</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 不一定要使用“映象 ID”,也可以使用“倉庫名:標籤名”</span>
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul>

Docker網路

Docker的網路功能相對簡單,沒有過多複雜的配置,Docker預設使用birdge橋接方式與容器通訊,啟動Docker後,宿主機上會產生docker0這樣一個虛擬網路介面, docker0不是一個普通的網路介面, 它是一個虛擬的乙太網橋,可以為繫結到docker0上面的網路介面自動轉發資料包,這樣可以使容器與宿主機之間相互通訊。每次Docker建立一個容器,會產生一對虛擬介面,在宿主機上執行ifconfig,會發現多了一個類似veth****這樣的網路介面,它會繫結到docker0上,由於所有容器都繫結到docker0上,容器之間也就可以通訊。

在宿主機上執行ifconfig,會看到docker0這個網路介面, 啟動一個Container,再次執行ifconfig, 會有一個類似veth****的interface,每個container的預設路由是宿主機上docker0的ip,在container中執行netstat -r可以看到如下圖所示內容: 
container路由

在容器中使用netstat -r命令檢視容器的IP地址

容器中的預設閘道器跟docker0的地址是一樣的:

在宿主機中使用ifconfig檢視docker0的IP地址

docker0 
當容器退出之後,veth*虛擬介面也會被銷燬。

參考文章: