开发者的利器:Docker 理解与使用
困擾
寫代碼的機器難免會被我們安裝上各種各樣的開發工具、語言運行環境和引用庫等一大堆的東西,長久以來不僅機器亂七八糟,而且有些相同的軟件還有可能會安裝不同的版本,這樣又會導致一個項目正常運行了,卻不小心破壞了另一個項目的運行環境。
雖然可以安裝虛擬機,但是虛擬機不僅又大又笨重,時間久了上面的問題難免還是會遇到,有誰會在自己機器里安裝上十幾二十幾個的虛擬機呢,就算真安裝這么多,時間久了又怎么記得住哪個是哪個呢?
在機器上運行著三五個項目的情況下,問一下,您敢隨隨便便換一臺開發機么?
除了這個問題,還有另一個問題就是部署到其他機器。
在本地開發機上正常運行的項目,代碼放到另一臺機器或者是部署到其他服務器上這可真是一個讓人頭大的挑戰:首先操作系統可能不一樣(比如開發機是 Mac,服務器卻是 Linux),而且就算是同樣的操作系統,不僅需要照著開發環境一個一個地安裝一堆的引用模塊,而且模塊的版本號還一定要保持一致,否則有可能會出現版本不同而代碼無法執行的情況。除此之外還有可能會出現各種各樣的問題,這可是一件比修bug還要讓人頭疼的事情!
什么是 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 技術,不僅可以讓你很方便得在不同的機器之間運行項目、在服務器部署項目,還能讓你在學習探索新技術的過程中更加高效和簡便。?
?
參考資料
本文中用到的文件:
Nodejs 項目源代碼:https://github.com/backslash112/sample-server
backslash112/node:v1:https://hub.docker.com/r/backslash112/node/
原文地址:http://www.cnblogs.com/sirkevin/p/5901874.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的开发者的利器:Docker 理解与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何测试微信应用号
- 下一篇: 一位跨平台开发者的自白