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