Docker實戰(二):製作自己的Docker映象
製作自己的Docker映象
製作自己的Docker映象主要有如下兩種方式:
1.使用docker commit 命令來建立映象
- 通過docker run命令啟動容器
- 修改docker映象內容
- docker commit提交修改的映象
- 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*虛擬介面也會被銷燬。