標籤:

Docker從入門到部署-初識Docker

專欄第一篇文章就吸引了這麼多關注是我始料未及的,所以我對文章質量的要求也變得更加嚴格,深思熟慮了一周之後,決定把我這周研究的Docker技術拿出來分享。

Docker是什麼?我不想解釋這個概念,因為網上有很詳細的介紹,所以我打算直接拿開發中實際面臨的問題來解釋Docker的作用,這也能更好的讓你明白為什麼要使用Docker,本篇文章適合對Linux命令行操作有一定基礎的人來閱讀。

想一下下面的場景你是否遇到過?

  1. 開發環境與部署環境不一致,本地正常的代碼放到線上就運行不了
  2. 比如項目需要使用Nginx做反向代理,而你平時不用,但還得去費時費力的去搭建這樣的環境
  3. 新項目打算使用最新語言版本支持新特性,但由於伺服器上運行著以前維護的老項目不敢輕易升級,你還是只能使用伺服器上的版本繼續開發

相信類似的情況大家都有遇到過,而且對此很絕望,我能怎麼辦啊。但是Docker容器化的技術正是解決上面問題的絕佳方案

以我最近開發遇到的問題來開始Docker入門之旅吧,公司給我一個新任務,讓我開發一個評論系統,所有的工作都讓我一個人完成,經過討論分析決定採用如下架構,後台採用node.js的express框架,資料庫採用MySQL,使用Redis做緩存,用Nginx做負載均衡,方案制定好後就是本地環境的搭建,發現其它環境平時有在用都有,唯獨沒有配置Nginx,考慮到部署到伺服器時我還是得再去配置一遍這些環境,身為懶癌晚期的程序員決定不想做這個重複且毫無意義的工作,這時我想到了Docker,兩年前曾經在Windows上沒配置成功,心裡想著現在應該完善了吧,於是打開了Docker官網,果然不出我所料,下面開始Docker的安裝及使用:

1.打開Docker官網,看到如下圖所示:

我們選擇Get Docker Community Edition下載社區版本,然後往下翻會看到各個平台的下載鏈接,由於我本人使用的是Mac OS 10.11.6的版本,所以選擇DOCKER CE FOR MAC,Windows用戶選擇DOCKER CE FOR WINDOWS,Linux用戶選擇自己平台的安裝教程即可,然後點擊Download from Docker Store

打開後發現如下的選項,有Stable和Edge兩個版本可以選擇,我這裡選擇穩定的Stable版本下載:

下載之後安裝即可,這時候Docker就已經安裝好了,如何使用呢,看看官方給的文檔Docker for Mac documentation:

  • 檢查Docker Engine, Compose, and Machine的版本:

$ docker --versionnDocker version 17.03.0-ce, build 60ccb22nn$ docker-compose --versionndocker-compose version 1.11.2, build dfed245nn$ docker-machine --versionndocker-machine version 0.10.0, build 76ed2a6n

  • 瀏覽應用程序並運行示例
    1. 打開一個命令行終端,運行一些Docker命令去驗證Docker是否正在運行,一些比較好的命令如docker verison去驗證是否已經安裝了最新的發行版,還有docker ps和docker run hello-world去驗證Docker是否正在運行。
    2. 啟動一個Web伺服器

      docker run -d -p 80:80 --name webserver nginx

      如果本地沒有Nginx鏡像,就會從Docker Hub上面下載一個,這個過程可能會很慢,Docker的網路訪問在國內不是很順暢,建議此處選擇掛代理或者使用國內的鏡像源DaoCloud,我們新安裝的Docker本地肯定沒有Nginx,所以去DaoCloud上搜索Nginx,找到下載命令,我們安裝最新版本可以忽略版本號,直接在終端中輸入:

      docker pull daocloud.io/library/ngi,安裝完之後運行一下

      docker images查看一下鏡像,如下圖所示:

      這時候我們來運行一下我們剛剛下載好的Nginx,docker run -d -p 80:80 --name webserver daocloud.io/library/ngi,然後打開瀏覽器輸入:localhost/ 應該就會看到下面的頁面,說明你的Nginx已經可以正常運行了,就是這麼簡單。

      現在來解釋一下剛剛命令的參數-d是指在後台運行,-p是指對埠進行映射,把Nginx容器的80埠映射到本機上的80埠,—name是對該容器進行命名,方便進行管理,daocloud.io/library/ngi就是之前列出的鏡像的名字,是不是覺得很簡單,只用了兩個命令就把一個Nginx搭建好了,有沒有感受到Docker帶來的方便,我們再來安裝一個CentOS試試:docker pull daocloud.io/library/ngi,然後用docker run啟動一個docker容器:docker run -itd --name centos daocloud.io/library/cen /bin/bash,然後通過docker attach centos進入我們剛剛創建好的centos容器中,通過exit或者Ctrl+D退出容器,用docker ps -a查看容器狀態,發現centos容器已經退出了

      有沒有什麼辦法讓centos容器不退出呢,可以使用Ctrl+P&Ctrl+Q從終端中退出來,還記得我們剛剛的Nginx嘛,我們可以通過docker attach webserver --sig-proxy=false命令去查看我們的Nginx,而且使用Ctrl+C時不會退出Nginx,而這個參數對於centos容器是不生效的,在創建centos容器中我們通過-i即使沒有被attach也打開標準輸入,-t創建一個tty(即終端設備的統稱),/bin/bash表示創建容器後第一個執行的命令,因此bash是centos容器的主進程,一旦退出就會導致整個容器的退出,而webserver容器中,nginx是跑在webserver容器中的一個服務,所以可以通過忽略信號的方式實現退出終端而不會使整個容器停止,那麼對於webserver容器我們怎麼不進入nginx服務,而是進入它的終端交互界面呢,docker為我們提供了exec命令,可以對正在運行的容器執行命令,如下圖所示:

最後再來講一下鏡像和容器的關係,對比以前我們安裝虛擬機,鏡像就是我們需要安裝的系統鏡像,而容器就是相當於我們用系統鏡像安裝好的一個虛擬機實例,而這個系統和我們裝機時使用的GHO鏡像的概念差不多,直接安裝就結束了,不需要進行太多的配置,可以看出來其實Docker就是一個更輕量級的虛擬化技術,安裝部署方便,而且都保持著單一職責原則,比如一個Nginx就是一個鏡像,一個MySQL也是一個鏡像,其實對於個人來說如果想使用一個命令行終端的Linux系統不再需要去安裝虛擬機了,Docker更加適合你,而且也更方便,這篇初識Docker的文章就寫到這裡了,更多的內容期待這個系列今後的內容吧,不定期更新。
推薦閱讀:

如何使用OpenDroneMap對航拍圖像快速建模
基於Docker、Registrator、Zookeeper實現的服務自動註冊
【技術總結】一起聊聊Kubernetes

TAG:Docker | 虚拟化 |