Docker 簡明教程

發表於2015-06-26

Docker自從誕生以來就一直備受追捧,學習Docker是一件很炫酷、很有意思的事情。我希望通過這篇文章能夠讓大家快速地入門Docker,並有一些學習成果來激發自己的學習興趣。我也只是一個在Docker這條巨鯨上玩耍的小孩,全文如有不明確、不正確的地方,還請斧正。

Docker 簡明教程

Ubuntu上安裝Docker

Docker的基礎是Linux容器技術,因此學習Docker最好是使用Linux。這裡推薦64位Ubuntu系統,因為在寫此文(2015-05-28)時,Docker還不支援32位,儘管民間有些土辦法可以象徵性的解決,但還是推薦初學Docker的儘量按照標準的來。如果手邊沒有Ubuntu系統可以去DigitaloceanUcloud等雲服務商去租用一個Linux伺服器。這樣即使玩壞了也可以隨時重新開始。

在Ubuntu中只需要執行一行命令即可實現Docker的安裝:

sudo apt-get install docker.io

執行完後,可以在終端輸入docker看到下面的介面證明我們安裝成功了(注:提示許可權問題就新增sudo,下文同):

Docker 簡明教程

從上圖可以看到,Docker的命令並不多,只有三十幾個。例如我們可以輸入docker info來檢視我們安裝的Docker資訊:

Docker 簡明教程

執行容器

安裝好之後,我們就可以來開始Docker之旅了,

我們現在的Docker還是一個”裸”Docker,上面沒有容器,等一下,什麼式容器?所謂容器就是Docker中用來執行應用的,Docker的容器很輕量級,但功能卻強悍的很。也沒有映象。映象?映象簡單理解就是容器的只讀版本,用來方便儲存與交流。此時,我們可以通過官方提供給我們的映象來進行學習。比如我們想在Docker中執行一個Ubuntu系統,很簡單,Docker中得pull命令是用來獲取映象的,執行下面的命令,就會從官方倉庫裡獲取Ubuntu 14.04版本的系統:

docker pull ubuntu:14.04

images命令用來檢視本機Docker中存在哪些映象,執行 docker images就會看到我們剛才獲取的Ubuntu14.04系統:

Docker 簡明教程

現在,我們把剛剛的映象執行起來,執行起來的映象就叫做容器了,容器是可讀寫的,這樣我們就可以在容器裡做很多有意思的事情了。run 命令就是將映象執行起來的,執行:

docker run -it ubuntu:14.04

仔細看,你會發現終端互動的使用者名稱變掉了,說明我們進入到了容器的內部,效果如下:

Docker 簡明教程

現在我們所做的任何操作都是針對於目前容器而言的,不會影響到原來的系統,例如,我們在裡面安裝下nginx伺服器,執行如下命令:

sudo apt-get install -y nginx

完成後執行nginx -v就會發現我們已經將nginx安裝成功:

Docker 簡明教程

將容器轉化為映象

在上一小節中,我們已經在容器裡安裝好了nginx,接下來我們希望將這個容器內容儲存下來,這樣我們下次就無需再次安裝了。這就是Docker中將容器轉換為映象的技術。

如果您還在剛剛的安裝了nginx的終端裡,執行exit退出此終端,回到系統本身的終端:

Docker 簡明教程

ps命令可以檢視我們當前都執行了哪些容器,加上-a引數後就表示執行過哪些容器,因為我們剛剛已經退出了安裝nginx的容器,因此我現在想檢視它的話,需要使用-a引數,執行如下命令:

docker ps -a

此時,就會顯示出我們剛剛執行的容器,並且Docker會很貼心的隨機給每個容器都起個Names方便標示。效果如下:

Docker 簡明教程

commit命令用來將容器轉化為映象,執行下面的命令,我們可以講剛剛的容器轉換為映象:

sudo docker commit -m "Added nginx from ubuntu14.04"-a "saymagic"79c761f627f3 saymagic/ubuntu-nginx:v1

其中,-m引數用來來指定提交的說明資訊;-a可以指定使用者資訊的;79c761f627f3代表的時容器的id;sayMagic/ubuntu-nginx:v1指定目標映象的使用者名稱、倉庫名和 tag 資訊。建立成功後會返回這個映象的 ID 資訊。注意的是,你一定要將saymagic改為你自己的使用者名稱。因為下文還會用到此使用者名稱。

Docker 簡明教程

這是我們再次使用docker images命令就會發現此時多出了一個我們剛剛建立的映象:

Docker 簡明教程

此時,如果執行docker run -it saymagic/ubuntu-nginx:v1就會是一個已經安裝了nginx的容器:

Docker 簡明教程

儲存映象

我們剛剛已經建立了自己的第一個映象,儘管它很簡單,但這已經非常棒了,現在,我們希望它能夠被更多的人使用到,此時,我們就需要將這個映象上傳到映象倉庫,Docker的官方Docker Hub應該是目前最大的Docker映象中心,所以,我們就將我們的映象上傳到Docker Hub。

首先,我們需要成為Docker Hub的使用者,前往https://hub.docker.com/進行註冊。需要注意的是,為了方便下面的操作,你需要將你的使用者名稱設為和我剛剛在上文提到的自定義使用者名稱相同,例如我的剛剛將映象的名字命名為是saymagic/ubuntu-nginx:v2,所以我的使用者名稱為saymagic、註冊完成後記住使用者名稱、密碼、郵箱。

login預設是用來登陸Docker Hub的,因此,輸入如下命令來嘗試登陸Docker Hub:

docker login

此時,就會輸出互動,讓我們輸入Username、Password、Email,成功輸入我們剛才註冊的資訊後就會返回Login Success提示:

Docker 簡明教程

執行命令:

docker push saymagic/ubuntu-nginx:v1

這就是我們為什麼將剛剛的映象命名為saymagic/ubuntu-nginx:v1的原因,如果你上面步驟都操作正確的正確的話,是會得到下面的內容:

Docker 簡明教程

此時,不出意外的話,我們的映象已經被上傳到Docker Hub上面了,去Docker Hub上面看看:

Docker 簡明教程

果然,我們在Docker Hub上有了我們的第一個映象,此時,其它的使用者就可以通過命令docker pull saymagic/ubuntu-nginx來直接獲取一個安裝了nginx的ubuntu系統了。不信?那就自己實踐一下吧!

Dockerfile使用

通過上面的學習,我們掌握瞭如何建立映象、獲取映象、上傳映象、執行容器等等內容。有了上面的知識,我們來次實戰。

我們剛剛使用了commit命令建立了一個安裝nginx的映象,但其實Docker建立映象的命令還有build,build命令可以通過指定一個Dockerfile檔案來實現將映象建立過程自動化。Dockerfile檔案有著特定的編寫規則,但語法都還比較容易理解。這次我們不僅使用Dockerfile檔案來建立一個像上文一樣安裝nginx的ubuntu映象,還要發揮nginx的老本行來執行一個網頁吧!DockFile可以很輕鬆的完成這個問題。首先將新建一個名字為www的資料夾,資料夾下面可以放一些HTML網頁,比如新建一個index.html檔案,隨便寫點內容:

<html>
  <head>
    Learn Docker
  </head>
  <body>
    <h1>Enjoy Docker!</h1>
  </body>
</html>

在www的同級目錄下新建一個名為Dockerfile的檔案,將DockerFile檔案改寫如下:

FROM ubuntu:14.04
MAINTAINER saymagic saymagic@163.com
RUN apt-get update
RUN apt-get install -y nginx
COPY ./www /usr/share/nginx/html
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

我來整體的解釋下這個Dockerfile檔案,第一行是用來宣告我們的映象是基於什麼構建的,這裡我們指定為ubuntu14.04 ,第二行的作用在於告訴別人你的大名。第三行和第四行的RUN命令用來在容器內部的shell裡執行命令。第五行將當前系統的www資料夾拷貝到容器的/usr/share/nginx/html目錄下,第六行宣告當前需要對外開放80埠,最後一行表示執行容器時開啟nginx。不理解沒關係,因為這都是固定的語法,感興趣可以多看相關內容。此時我們通過build命令來構建映象,執行:

docker build -t="saymagic/ubuntu-nginx:v2" .

注意,最後的.表示Dockerfile在當前目錄,也可指定其它目錄。此時,再次執行docker images就會看到剛剛生成的映象:

Docker 簡明教程

現在我們就可以執行剛剛的映象了,和前面執行稍有不同,此時我們需要對外指定80埠,該行為通過-p引數指定,執行:

docker run -p 80:80 saymagic/ubuntu-nginx:v2

此時,終端會卡住,這是正常的,因為Docker的思想是每個容器最好只開一個執行緒做一件事,此時我們開啟了nginx伺服器,所以終端卡住也沒關係(當然是有辦法來解決這個問題,但這裡不做介紹)。現在我們可以通過瀏覽器訪問localhost檢視效果,如果是虛擬主機則需輸入主機ip地址,然後就能看到了如下的頁面:

Docker 簡明教程

DaoCloud實戰

如果我們自己沒有伺服器,剛剛的網頁我們只能在本地訪問,好可惜。別急,現在我要隆重介紹一個Docker的好夥伴-DaoCloud,官網傳送門:https://www.daocloud.io/

有了DaoCloud,我們只需要負責寫Dockerfile,剩下的build、執行之類的東西都交給DaoCloud,我們只需要點一點按鈕即可。

DaoCloud會將Github、GitCafe等git服務商作為程式碼源,這裡我使用GitCafe,為了你下面的操作更加方便,你可以直接Fork我的專案,專案地址:https://gitcafe.com/saymagic/LearnDocker

接著,我們需要去Daocloud註冊一個賬號,完成後,進入個人主頁後選擇程式碼構建->建立新專案->給專案起一個響亮的名字->同步GitCafe程式碼源->選擇GitCafe下的LearnDocker專案:

Docker 簡明教程

最後,點選開始建立按鈕。Daoloud就會馬不停蹄的執行起來。如果細心的話你會發現,DaoCloud的build會比本地快很多,很迅速就會完成映象的構建:

Docker 簡明教程

僅僅是構建映象沒什麼意思, DaoCloud還可以將這個映象在雲端執行起來。我們點選綠色的檢視映象按鈕,跳轉到如下頁面:

Docker 簡明教程

在DaoCloud中映象需要執行在容器中,因為當前我們只構建了一個版本,所以選擇部署最新版本和下面的部署按鈕效果相同,點選任意一個,來到了這裡:

Docker 簡明教程

我們給容器起一個霸氣的名字`learndocker`,然後點選頁面最下面的立即部署按鈕,秒秒鐘,我們的應用就執行了起來:

Docker 簡明教程

此時,注意到你自己執行成功的url後面的連結,將其複製到瀏覽器開啟,你會發現,網頁的內容就是本篇部落格:

Docker 簡明教程

寫在最後

Docker能做的事情遠不止這些,更多有意思的事情還請讀者慢慢用心去發現。

相關文章