新聞中心
對(duì)應(yīng)用進(jìn)行設(shè)置可能會(huì)相當(dāng)復(fù)雜,尤其是在 Linux 系統(tǒng)上。不同應(yīng)用有不同的配置方法,它們會(huì)在不同的文件系統(tǒng)路徑下(在不同的 Linux 發(fā)行版中,由于應(yīng)用存在多種變種,這些路徑也會(huì)有所不同)保存二進(jìn)制文件和數(shù)據(jù)。一旦你把系統(tǒng)配置好了,就很難再恢復(fù)到之前的狀態(tài),尤其是你同時(shí)進(jìn)行了一些其他修改的時(shí)候(比如,安裝了一些其他應(yīng)用程序)。這也是最近諸如 Puppet、 Chef、 Ansible 和 Salt 這樣的部署工具流行的原因。但即使有了這些工具的幫助,創(chuàng)建 cookbook/recipe 也許也十分麻煩: Linux 系統(tǒng)并非以傻瓜化著稱,系統(tǒng)本身也不能讓你擺脫麻煩。

業(yè)界出現(xiàn)了一個(gè)新的工具
很幸運(yùn)的是,對(duì)于 Linux 運(yùn)維人員來說,一個(gè)新的工具產(chǎn)生了,而該工具很有可能改變游戲規(guī)則:Docker ,一個(gè)開源的平臺(tái),能夠以一種輕量級(jí)的方式打包應(yīng)用程序以及它們的依賴。
這到底意味著什么?
Docker 使你能夠在 Linux 系統(tǒng)上對(duì)不同的應(yīng)用程序進(jìn)行隔離,在不同的上下文環(huán)境中運(yùn)行這些程序(這些程序可能執(zhí)行在一臺(tái)物理機(jī)器上,也可能運(yùn)行在不同的物理機(jī)器上),請(qǐng)記住,這一點(diǎn)非常重要:
- Docker 使用了底層的內(nèi)核機(jī)制做到了資源隔離,而并不需要其他資源消耗型的虛擬化技術(shù),如果想了解更多細(xì)節(jié),請(qǐng)點(diǎn)擊這里。
- Docker 鏡像(一些保存的快照)以及 Docker 容器(運(yùn)行時(shí)隔離應(yīng)用程序的容器)與虛擬鏡像相比,使用起來快多了。
- 容器十分靈活,你可以在容器里打包很多應(yīng)用,你也可以只打包一個(gè),同時(shí)你可以盡你所愿來運(yùn)行容器。
- Docker 容器里運(yùn)行著一些鏡像,而這些鏡像之上有一個(gè)層的概念,分層使得你能夠很容易地構(gòu)造你的應(yīng)用程序(每次操作都可以很容易地回滾/前滾,你只需要簡(jiǎn)單地增加或是刪除層,卻不會(huì)對(duì)下面的層產(chǎn)生影響)。
- Docker ***地支持了“一次配置,到處運(yùn)行”的范式。
在實(shí)踐中 Docker 是如何工作的?
或者這么講,至少對(duì)于我來說,它是這么工作的:
我已經(jīng)在我的本地 Vagrant 環(huán)境中指定了 Docker 作為部署工具, Vagrant 從 1.6 版本就引入了這一功能。對(duì)于什么是 Vagrant ,以及它為什么是 X 平臺(tái)開發(fā)人員必備的工具,我認(rèn)為無需贅述。
Docker 已經(jīng)為我自動(dòng)下載了一些 Linux 發(fā)行版的鏡像(這些鏡像會(huì)被 Vagrant 使用,在 hypervisor 上運(yùn)行)。
現(xiàn)在我能夠以至少兩種方式創(chuàng)建我自己的容器(正在運(yùn)行的,實(shí)現(xiàn)資源隔離的應(yīng)用程序):
- ***種方式是制作一個(gè)用命令配置好的 Dockerfile ,這個(gè) Dockerfile 基于干凈的 Linux 鏡像來生成,同時(shí)這些命令也使用了非常簡(jiǎn)單的 DSL (領(lǐng)域特定語(yǔ)言)。這種方式是我比較喜歡的,而且確實(shí)實(shí)用。
- 第二種方式是創(chuàng)建一個(gè)運(yùn)行著終端的全新的容器,這樣的話你就可以在終端上執(zhí)行你自己的命令,來做到你自己想做的事情。
- sudo docker build
- ...
- or
- ...
- sudo docker run -i -t
/bin/bash
有些重要的事情需要記住
如果在 Dockerfile 里的命令執(zhí)行完了,或者是通過 run 這個(gè)子命令運(yùn)行的命令執(zhí)行完了(因?yàn)樗鼈儾⒉皇?daemon 程序),那么容器就會(huì)關(guān)閉并且消失!
當(dāng)容器正在運(yùn)行時(shí),你可以十分方便地:
- 查看容器中命令的輸出(docker logs)
- 掛載到運(yùn)行的容器(docker attach)
- 列出容器內(nèi)文件系統(tǒng)的實(shí)際變化(記得不同的容器并不能看到其他容器的變化?。╠ocker diff)
- 暴露并且映射容器中的端口(比如,如果你正在搭建一個(gè)應(yīng)用程序,而該應(yīng)用程序在容器內(nèi)已經(jīng)有了相應(yīng)的端口)(在 dockerfile 中的 EXPOSE 選項(xiàng),Docker 命令的 -p 選項(xiàng))
如果你想要通過手動(dòng)執(zhí)行命令的方式創(chuàng)建你自己的容器(run),你需要存儲(chǔ)你自己的鏡像 - 首先你需要在正在運(yùn)行的容器列表里找到你想要的容器,然后執(zhí)行commit命令:
- sudo docker ps
- sudo commit
通過使用以上所有的選項(xiàng)...
...我能夠:
- 使用應(yīng)用組件的任何組合來組成我的本地開發(fā)環(huán)境,添加或者刪除一個(gè)運(yùn)行時(shí)組件就如同開啟或者關(guān)閉容器那么簡(jiǎn)單。一旦我關(guān)閉了某個(gè)應(yīng)用組件,那么它也從文件系統(tǒng)中完全消失了。
- 非常方便地(回滾/前滾)創(chuàng)建出獨(dú)立的,隔離的應(yīng)用容器,同時(shí)又不像虛擬鏡像那樣會(huì)耗費(fèi)許多時(shí)間,也沒有不必要的操作系統(tǒng)開銷。
- 實(shí)驗(yàn)一系列很有意思的事情,卻幾乎不會(huì)冒重頭來過的風(fēng)險(xiǎn)(有鑒于此,Chef recipe 已經(jīng)過時(shí)了...)。
...在我做到以上所有事情的同時(shí),我的操作系統(tǒng)卻堅(jiān)如磐石:我不會(huì)破壞任何事情,我可以很簡(jiǎn)單地回滾我做的任何操作。安裝其他的容器也不會(huì)互相影響。
總之,在幾周的時(shí)間里,我已經(jīng)把 Docker 作為了我的主要的軟件開發(fā)工具?,F(xiàn)在我已經(jīng)無法想象缺少了 Docker 我該怎樣進(jìn)行基于 JVM 的開發(fā)工作了。
標(biāo)題名稱:如何使用 Docker 來協(xié)助 X 系統(tǒng)上的開發(fā)工作
當(dāng)前鏈接:http://www.dlmjj.cn/article/djseosd.html


咨詢
建站咨詢
