開發者的利器:Docker 理解與使用

困擾
寫代碼的機器不免會被咱們安裝上各類各樣的開發工具、語言運行環境和引用庫等一大堆的東西,長久以來不只機器亂七八糟,並且有些相同的軟件還有可能會安裝不一樣的版本,這樣又會致使一個項目正常運行了,卻不當心破壞了另外一個項目的運行環境。
雖然能夠安裝虛擬機,可是虛擬機不只又大又笨重,時間久了上面的問題不免仍是會遇到,有誰會在本身機器裏安裝上十幾二十幾個的虛擬機呢,就算真安裝這麼多,時間久了又怎麼記得住哪一個是哪一個呢?
在機器上運行着三五個項目的狀況下,問一下,您敢隨隨便便換一臺開發機麼?
除了這個問題,還有另外一個問題就是部署到其餘機器
在本地開發機上正常運行的項目,代碼放到另外一臺機器或者是部署到其餘服務器上這可真是一個讓人頭大的挑戰:首先操做系統可能不同(好比開發機是 Mac,服務器倒是 Linux),並且就算是一樣的操做系統,不只須要照着開發環境一個一個地安裝一堆的引用模塊,並且模塊的版本號還必定要保持一致,不然有可能會出現版本不一樣而代碼沒法執行的狀況。除此以外還有可能會出現各類各樣的問題,這但是一件比修bug還要讓人頭疼的事情!html


什麼是 Docker?
官網對它的介紹是:「Package your application into a standardized unit for software development」。即將您的應用打包進一個用於軟件開發的標準單元裏。
乍一看仍是很暈是否是?不怕,接下來慢慢理解。
Docker 裏還有一個概念是 Container,本意是集裝箱的意思,通常翻譯成容器,不過我以爲理解成集裝箱,對我來講更容易理解。
Container,即集裝箱,它裏面裝了運行某個項目所須要的全部東西:代碼、語言運行環境、工具和引用庫。
 
 
您想一想,有了這個集裝箱裝着某個項目的開發環境,您把它從一個地方搬到另外一個地方,只要裏頭的東西在運輸過程當中不被破壞,那裏頭的東西確定仍是如出一轍,在另外一個地方編譯執行固然仍是可以正常運行啦!

快速掌握 Docker
安裝步驟請按照官方的 安裝說明 進行,Windows、Mac 和 Linux 都分別有對應的詳細的安裝步驟。
本文假設您已經在機器上安裝好 Docker。
使用如下命令檢查您是否安裝成功及版本信息:
docker -v
 
Docker Hub 服務器拉取 image (鏡像)
須要用什麼就取什麼,好比 Ubuntu,或者是nodejs、Python,命令很簡單:
docker pull ubuntu
docker pull node
 
開啓 Container
docker run <image>
這行命令就能夠開啓一個Container,image 參數就是指定在這個Container裏運行哪一個鏡像。例如
docker run ubuntu /bin/echo 'Hello world'
此命令開啓一個容器,並執行 Ubuntu 鏡像(Ubuntu 鏡像沒有會自動從 Docker Hub 服務器拉取),而後在容器裏執行 /bin/echo 'Hello world’命令。

-p 參數
-p 8080:80 指的是將容器的80端口和主機的8080對應。例如
docker run -it -p 8080:80 tutum/hello-world
此命令開啓一個 hello world 的 tutum 服務,打開主機的 localhost:8080 便可訪問運行在 Container 裏的網站了。

查看 Container 列表
當您開啓了一個 Container 後,執行 docker ps 命令能夠查看 Container 列表(ps 後指定-a 參數包含非運行中的Container):
 
中止一個 Container
docker stop <container name | id>
 
刪除一個 Container
docker rm <container name | id>
 
- -name 參數
- -name 參數爲 Container 指定名字,例如剛剛的命令多加一個 —name web1 參數便可開啓一個名字爲 web1 的 容器:
docker run - -name web1 ubuntu /bin/echo 'Hello world'

能夠同時開啓並運行多個 Container,同時運行的多個 Container 也能夠同時運行同一個鏡像。

建立一個本身的 Docker 鏡像並將代碼同步到另外一臺服務器
首先咱們須要準備一個Docker Hub帳號、一個Github帳號、一個簡單的nodejs項目和一臺已安裝 Docker 的服務器。
這個nodejs項目只包含一個main.html文件和一個server.js文件,
server.js 代碼:
var connect = require('connect');
var serveStatic = require('serve-static');
connect().use(serveStatic(__dirname)).listen(8080, function(){
    console.log('Server running on 8080...');
});
這個服務很簡單,使用 node server.js 命令便可開啓一個在8080端口監聽的網站服務,訪問localhost:8080/main.html便可訪問main.html頁面。
不過運行它須要2個模塊,connect 和 serve-static。
若是像日常同樣,輸入npm install connect serve-static 便可。
不過此次咱們要將這兩個模塊安裝到集裝箱(Container 容器)裏。

首先開啓一個 Container 
docker run -t -t node /bin/bash
這條命令開啓了一個容器,/bin/bash是一個在容器裏執行的命令,它會在容器裏啓動一個 bash shell。
而後在容器中執行安裝模塊的命令
npm install connect serve-static
安裝完成後,按 Ctrl+D 退出此容器

如今您已經有了一個被修改過的 Container,記下這個 Container 的 ID,如今您可使用 docker commit 命令將此 Container 的副本提交到一個鏡像裏:
docker commit -m "Added connect and serve-static" -a "backslash112" 0b2616b0e5a8 backslash112/node:v1
 
將鏡像推送到 Docker Hub
使用 docker push <image> 命令能夠將一個鏡像推送到 Docker Hub 服務器的您的賬號下(相似 Github)。
docker push backslash112/node:v1
此時您能夠拿來和別人共享或者設置爲私有倉庫。

利用 Docker 在另外一臺機器上快速部署
經過 Github 將 nodejs 項目同步到服務器,而後在服務器中執行如下命令
docker run -it --name my-server -v $(pwd):/dev_carl -w /dev_carl -p 8080:8080 backslash112/node:v1 node server.js
雖然 nodejs 項目運行須要 connect 和 serve-static 兩個模塊,可是如今您能夠在不須要安裝它們的狀況下直接運行您的 nodejs 項目,由於 backslash112/node:v1 鏡像裏已經包含了這兩個模塊了,是否是很方便?
 
結束語
利用 Docker 技術,不只可讓你很方便得在不一樣的機器之間運行項目、在服務器部署項目,還能讓你在學習探索新技術的過程當中更加高效和簡便。 
 
參考資料

本文中用到的文件
Github - backslash112/sample-server:本例中使用的 Nodejs 項目源代碼。
Docker Hub - backslash112/node:v1: 本例中修改後的 nodejs 鏡像。node

繼續瞭解 Docker 技術,推薦您閱讀:
Docker 官方技術文檔:從各個平臺的安裝到簡單實用和深刻了解都很詳細。
Docker:帶給現代開發人員的福利:IBM技術主題文檔庫。
Docker Tutorials:YouTube 上講解 Docker 的一個很不錯的視頻系列。git

相關文章
相關標籤/搜索