1. 程式人生 > >Docker學習筆記(三)- Dockerfile建立本地映象

Docker學習筆記(三)- Dockerfile建立本地映象

Dockerfile建立本地映象

本博文將會介紹在docker中,如何建立本地映象。內容包括,編寫Dockerfile檔案,從編寫的Dockerfile建立映象,映象建立的過程解析,執行所建立的映象。

Dockerfile是用來建立自定義的image,包含了一條條指令,每條指令對應LINUX下的一條命令,Docker程式將這些指令翻譯為真正的LINUX命令。有了Dockerfile,當我們需要自定義進行其他修改的時候,直接修改Dockerfile,重新生成映象檔案,省去了敲命令的麻煩。

Step1 編寫Dockerfile檔案

1.建立一個新的路徑mydockerbuild,Ubuntu使用mkdir

, Windows使用md

root@mingchen-HP:~# mkdir mydockerbuild

2.切換到新的目錄中

root@mingchen-HP:~# cd mydockerbuild/
root@mingchen-HP:~/mydockerbuild# 

3.建立並編輯命名為Dockerfile的新檔案,Linux,Mac使用比如nano 或vi, vim等進行編輯, windows使用noteapd。

root@mingchen-HP:~/mydockerbuild# nano Dockerfile

4.新增FROM宣告,如下:

FROM docker/whalesay:latest

FROM關鍵字告訴docker將要建立映象的基礎映象。此處的基礎映象為當前最新版本的whalesay映象,此映象已經包含了cossay程式,我們將從此程式開始。

5.新增RUN宣告,將會把fortunes程式新增到映象:

RUN apt-get -y update && apt-get install -y fortunes

whalesay映象是基於Ubuntu,因此我們使用apt-get來安裝程式fortunes

6.新增CMD宣告,此宣告告訴映象當環境設定好後,最後的執行命令。下面的命令執行fortune -a

CMD /usr/games/fortune -a
| cowsay

7.檢查輸入的命令,Dockerfile應該像下面這樣

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

注意,對於初次使用nano編輯器的朋友,儲存- Ctrl+O, 退出-Ctrl+X ,輸入想要儲存的檔名後,再回車確定就會退出nano編輯器了。用 gedit, vim, vi等編輯器也可以,sudo許可權進入。

Step2 從Dockerfile檔案建立映象

當在mydockerbuild路徑下的時候,使用docker build 命令:

$ docker build -t docker-whale .

囧:本來以為會順利通過build,結果遇到了bug,期間有過各種嘗試,瀏覽了絕大部分能夠google到的問題相關的post,但就是不明白其他大部分人能夠解決,而我的解決不了,當然也看到有人回覆不能解決的, github的一個使用者就吐艚“Heartbroken, I’ve been fighting with this porblem off and on for weeks!“

如果在這一步順利通過了的話,那祝賀!
如果在這一步遇到了問題的話,報錯了,比如我,也很正常。我遇到了問題,前前後後弄了大概一週了,我主要遇到了兩個問題。解決了第一個問題後,才發現還有第二個問題出現了。

  • 第一個,上面的Dockerfile,命令執行的時候實際是進入容器裡面的,可以在終端的輸出裡看到,一連串小寫字母和數字就是容器的ID,---> Running in 21aac36e6265所以實際問題是容器內部不能連到外網,ping 外部網路不通,我把這個問題曾經發布到了Docker Community Forums, 期待大神指引,有個使用者回覆了,並沒有解決,後來我自己解決了,剛才已經把解決的辦法釋出到了問題的最下面,我的那個連結是,Communication between containers and wider world , 對於英文不是很ok的同學,我會在下一篇部落格裡面單獨的把這個問題寫出來。上面的第二條命令中有 apt-get install, 需要容器能夠連到外網,所以這會出問題;
  • 第二個,報錯Hash sum mismatch ,這個問題的解決辦法比較多,因為引起此錯誤的原因也很多,比如 apt源的設定,apt cache的清除,apt 的版本不同而導致的bug, 代理伺服器proxy的設定,伺服器與本地的時間timestamp不同,etc. 我會在接下來的部落格中都寫出來。
  • 很囧,這兩個錯誤弄的很心累。鑑於篇幅問題,我就不在這一篇部落格裡面詳細說了,這一篇的主題還是Dockerfile建立本地映象

Normally, 終端的輸出應該如下:

[email protected]:~/mydockerbuild$ sudo docker build -t docler-whale .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM docker/whalesay:latest
 ---> 6b362a9f73eb
Step 2 : ENV DEBIAN_FRONTEND noninteractive
 ---> Running in f251aa390321
 ---> daa3f0eb1eff
Removing intermediate container f251aa390321
Step 3 : RUN sed -i "s|http://archive.ubuntu.com|http://mirrors.163.com|g" /etc/apt/sources.list && rm -Rf /var/lib/apt/lists/* && apt-get -y update && apt-get install -y fortunes
 ---> Running in 84874f888414
Ign http://mirrors.163.com trusty InRelease
Get:1 http://mirrors.163.com trusty-updates InRelease [65.9 kB]
Get:2 http://mirrors.163.com trusty-security InRelease [65.9 kB]
Get:3 http://mirrors.163.com trusty Release.gpg [933 B]
Get:4 http://mirrors.163.com trusty-updates/main Sources [480 kB]
Get:5 http://mirrors.163.com trusty-updates/restricted Sources [5921 B]
Get:6 http://mirrors.163.com trusty-updates/universe Sources [216 kB]
Get:7 http://mirrors.163.com trusty-updates/main amd64 Packages [1172 kB]
Get:8 http://mirrors.163.com trusty-updates/restricted amd64 Packages [20.4 kB]
Get:9 http://mirrors.163.com trusty-updates/universe amd64 Packages [507 kB]
Get:10 http://mirrors.163.com trusty Release [58.5 kB]
Get:11 http://mirrors.163.com trusty-security/main Sources [157 kB]
Get:12 http://mirrors.163.com trusty-security/restricted Sources [4621 B]
Get:13 http://mirrors.163.com trusty-security/universe Sources [55.9 kB]
Get:14 http://mirrors.163.com trusty-security/main amd64 Packages [711 kB]
Get:15 http://mirrors.163.com trusty-security/restricted amd64 Packages [17.0 kB]
Get:16 http://mirrors.163.com trusty-security/universe amd64 Packages [193 kB]
Get:17 http://mirrors.163.com trusty/main Sources [1335 kB]
Get:18 http://mirrors.163.com trusty/restricted Sources [5335 B]
Get:19 http://mirrors.163.com trusty/universe Sources [7926 kB]
Get:20 http://mirrors.163.com trusty/main amd64 Packages [1743 kB]
Get:21 http://mirrors.163.com trusty/restricted amd64 Packages [16.0 kB]
Get:22 http://mirrors.163.com trusty/universe amd64 Packages [7589 kB]
Fetched 22.3 MB in 1min 35s (234 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  fortune-mod fortunes-min librecode0
Suggested packages:
  x11-utils bsdmainutils
The following NEW packages will be installed:
  fortune-mod fortunes fortunes-min librecode0
0 upgraded, 4 newly installed, 0 to remove and 92 not upgraded.
Need to get 1961 kB of archives.
After this operation, 4817 kB of additional disk space will be used.
Get:1 http://mirrors.163.com/ubuntu/ trusty/main librecode0 amd64 3.6-21 [771 kB]
Get:2 http://mirrors.163.com/ubuntu/ trusty/universe fortune-mod amd64 1:1.99.1-7 [39.5 kB]
Get:3 http://mirrors.163.com/ubuntu/ trusty/universe fortunes-min all 1:1.99.1-7 [61.8 kB]
Get:4 http://mirrors.163.com/ubuntu/ trusty/universe fortunes all 1:1.99.1-7 [1089 kB]
Fetched 1961 kB in 13s (148 kB/s)
Selecting previously unselected package librecode0:amd64.
(Reading database ... 13116 files and directories currently installed.)
Preparing to unpack .../librecode0_3.6-21_amd64.deb ...
Unpacking librecode0:amd64 (3.6-21) ...
Selecting previously unselected package fortune-mod.
Preparing to unpack .../fortune-mod_1%3a1.99.1-7_amd64.deb ...
Unpacking fortune-mod (1:1.99.1-7) ...
Selecting previously unselected package fortunes-min.
Preparing to unpack .../fortunes-min_1%3a1.99.1-7_all.deb ...
Unpacking fortunes-min (1:1.99.1-7) ...
Selecting previously unselected package fortunes.
Preparing to unpack .../fortunes_1%3a1.99.1-7_all.deb ...
Unpacking fortunes (1:1.99.1-7) ...
Setting up librecode0:amd64 (3.6-21) ...
Setting up fortune-mod (1:1.99.1-7) ...
Setting up fortunes-min (1:1.99.1-7) ...
Setting up fortunes (1:1.99.1-7) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
 ---> 746e8b0e3ebb
Removing intermediate container 84874f888414
Step 4 : CMD /usr/games/fortune -a | cowsay
 ---> Running in bcf0fb436960
 ---> 4506ff33e5ba
Removing intermediate container bcf0fb436960
Successfully built 4506ff33e5ba

看到最後一句 Successfully built , 應該會感到世界還是美好的!官網的文件,雖然基本不會有神馬問題,但是真的只是參考。-_-||

Step3 解讀映象的build過程

  • docker確認build過程中所必須的程式碼,也就是最最基礎的能夠撐起一個build過程的code。終端則會輸出如下
    Sending build context to Docker daemon 2.048 kB
  • docker檢查我們將要使用的基礎映象是否存在於本地,如果有的話,直接使用,如果沒有的話,則 pulls it from Docker
    hub。這裡使用的映象是前文已經下載好的。
    Step 1 : FROM docker/whalesay:latest --->
    6b362a9f73eb

    這裡的這一串字元就是當前容器的這一層的ID,每次執行命令後,不同層的ID不一樣。類比千層餅,大家理解容器的基礎映象就是經過每一步的修改後就是一層層疊加的,不同層的ID不同。
  • 接下來,設定容器的執行環境,並且執行RUN的命令:

    Step 2 : ENV DEBIAN_FRONTEND noninteractive ---> Running in
    f251aa390321 ---> daa3f0eb1eff Removing intermediate container
    f251aa390321 Step 3 : RUN sed -i
    "s|http://archive.ubuntu.com|http://mirrors.163.com|g"
    /etc/apt/sources.list && rm -Rf /var/lib/apt/lists/* && apt-get -y
    update && apt-get install -y fortunes ---> Running in 84874f888414
    Ign http://mirrors.163.com trusty InRelease Get:1
    http://mirrors.163.com trusty-updates InRelease [65.9 kB] Get:2
    http://mirrors.163.com trusty-security InRelease [65.9 kB] Get:3
    http://mirrors.163.com trusty Release.gpg [933 B]
    …… (中間太長,省略了。完整的見上面的Step2)
    Setting up
    fortunes-min (1:1.99.1-7) ... Setting up fortunes (1:1.99.1-7) ...
    Processing triggers for libc-bin (2.19-0ubuntu6.6) ... --->
    746e8b0e3ebb Removing intermediate container 84874f888414

  • 最後,通過Dockerfile建立的一個新的容器(映象的執行例項)生成:

    bcf0fb436960  ---> 4506ff33e5ba Removing intermediate container
    bcf0fb436960 Successfully built 4506ff33e5ba
    

Step4 執行新生成的Dockerfile

  • 通過sudo docker images 檢視所有的映象:

這裡寫圖片描述

  • 執行剛才生成的映象 docker-whale:
    這裡寫圖片描述
    Bravo! 如果顯示了這樣的docker logo以及文字,則說明通過Dockerfile新建的本地映象成功了。
  • 執行多次RUN命令,會得到相同的文案和不同的文字。如下:
    這裡寫圖片描述
    這裡寫圖片描述