2014年9月24日

Docker 簡介

緣由

最近在看InfoQ的新聞時,常常看到一個詞不斷出現,由於出現的頻率實在是太高了,讓我對它產生好奇心,到底是在做什麼的?怎麼會如此火熱?花了點時間去找尋相關資料,並試了一下其功能,真是特別的東西!

那個詞也就是本篇要說的主題,Docker

Docker簡介

Docker其實就是新一代的VM,只是他更加簡潔,並且更加方便。之前在使用的VM,比如說很常用VMWare,要使用VMWare來執行一個Linux作業系統,比如說要執行CentOS好了,首先必須準備一個ios檔或是安裝光碟,之後掛載它,執行完整的作業系統安裝流程,安裝結束之後才能開始執行,整個過程可能需要幾十分至幾小時之久。

而Docker就不一樣了,Docker要執行一個CentOS的作業系統,要做的步驟只有幾項,首先先下載CentOS的Image檔(CentOS官方有釋出),接著使用Docker Container執行它,就可以執行CentOS了,整個過程可能不到10分鐘吧,其中大半的時間還是花在下載Image檔上面(大約200MB),非常的神奇。

Image與Container

在開始使用之前,要先介紹兩個Docker常看到的名詞,Image和Container,這邊不討論他的實作原理與技術,而是要說明他們之間的相對關係。

Image為初始環境,而Container為執行Image時的實例。比如說今天想透過Docker用CentOS執行J2EE的服務,則先下載CentOS官方釋出的CentOS Image,下載完後要執行時,Docker會用一個Container來執行此CentOS image。你可以在Container內做任何事情,比如說安裝Tomcat、JDK、Web Application等等之類的,但是一切的行為,都只會在這個Container內,它不會影響到原本的Image。

接著你需要一個單獨安裝MySQL的CentOS服務器,則你可以在將Image透過另一個Container執行,接著在上面安裝MySQL,就完成了一個CentOS上的MySQL服務。這樣一來你就會擁有兩個Container,其中一個為J2EE的伺服器,建立在CentOS上,另一個為MySQL的伺服器,也建立在CentOS上。

下圖出自於官方對Image說明時所用到的圖片,其中可以看到Debian為Image,而Container在其上方,為執行image時的實例,由此圖可以了解他們倆之間的關係。

安裝Docker

由於本人是使用MacBook Air,因此只試了在Mac上安裝的流程。在Mac上安裝Docker非常的簡單,只要安裝Boot2Docker - OS X Installer即可。安裝完在應用程式內點開它,就會看到它開啓command line,這時他會先啟動docker deamon,我們只要等他跑完,即可在本機上使用docker了。

可以參考官方文件Installing Docker on Mac OS X來安裝,基本上就是下一步下一步一直執行即可安裝完成。其他作業系統的使用者可以參考Docker Installation選擇自己所使用的作業系統,來參考如何安裝。

開始玩Docker

在Mac的應用程式裡,點開boot2docker後,它會自己去啟動Docker deamon,等它跑完之後,就可以開始下指令與docker互動。

抓取CentOS image

Docker官方有提供一個Docker Hub網站,該網站上面存放著各種不同的開發人員與公司所提供的image檔,而我們可以透過指令,很輕鬆的從Docker Hub上抓取你想要的Image檔,在這邊要執行的是抓取CentOS官方提供的Image檔。

指令輸入:
    bash-3.2$ docker pull centos

會抓取:
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    centos              centos5             5a1ebaa356ff        9 days ago          484 MB
    centos              centos7             70214e5d0a90        13 days ago         224 MB
    centos              latest              70214e5d0a90        13 days ago         224 MB
    centos              centos6             68eb857ffb51        13 days ago         212.7 MB    

也可以只抓某個TAG,例如我只想抓取CentOS 6,則我可以下此指令:
    docker pull centos:centos6

使用Container執行CentOS Image

抓取完畢之後,接著就是用Container執行image,只要透過run的指令,即可執行。

指令輸入:
    bash-3.2$ docker run -t -i centos:centos6 /bin/bash

則畫面會變成:
    bash-4.1#

就這樣,此時你已經成功開啟了一個CentOS 6的VM,並開啟bash了。 可以透過以下指令來驗證:

指令輸入:
    bash-4.1# cat /etc/issue
印出:
    Linux version 3.16.1-tinycore64 (root@5d533df6cbc4) (gcc version 4.7.2(Debian 4.7.2-5) ) #1 SMP Fri Aug 22 06:40:10 UTC 2014
    bash-4.1# cat /etc/issue
    CentOS release 6.5 (Final)
    Kernel \r on an \m

Docker官方線上教學網站

如果你還在觀望Docker,對它有點興趣但又不想安裝到自己的電腦上的話,你可以先透過Docker Online Tutorial - Try It!這個官方提供的線上教學網站,實際操作Docker一遍,裡面會教學一些基本的操作,如搜尋Docker Hub上面的Image,用Container執行Image,還有本篇沒提到的Commit與Push指令,花些玩過一遍就會對Docker有些基本的了解。