讓 Docker 無(wú)處不在
我已許諾會(huì)持續(xù)的寫些關(guān)于docker的文章。由于我是***一個(gè)在 CØ 中具有本地linux內(nèi)核的幸運(yùn)者, 因此我將寫一些關(guān)于怎樣在本地桌面上管理所有項(xiàng)目的文章。
為什么是docker,而不是純LXC?
幾年前,當(dāng)我還在 Adcloud 時(shí),就開始使用 LXC 來(lái)構(gòu)建所有的微型服務(wù)。 鑒于我在臺(tái)式機(jī)上使用 Archlinux系統(tǒng)并且效果還不錯(cuò),但是我們的生產(chǎn)環(huán)境是 Ubuntu系統(tǒng),并且可能會(huì)用 chef 腳本來(lái)創(chuàng)建容器,而我仍然把這些容器當(dāng)做機(jī)器來(lái)維護(hù)。它們有自己的 DNS 域名、 IP 地址、 SSH 服務(wù),和所有磁盤文件綁定。因此每當(dāng)我開始一個(gè)新項(xiàng)目時(shí),首先得通過 SSH 登錄到容器然后再開始工作。事實(shí)上我一點(diǎn)也不喜歡 Chef ,所以在離開 Adcloud 后我就放棄了 Chef 并開始使用 Babushka 。雖然后者能讓我以最簡(jiǎn)單的方式來(lái)部署一個(gè)單機(jī)環(huán)境,但是創(chuàng)建新容器十分緩慢,當(dāng)所有容器啟動(dòng)之后占據(jù)了 SSD 上的大量磁盤空間,而且我還需要手動(dòng)去配置多項(xiàng)服務(wù)。
所以當(dāng)我***次啟動(dòng) Docker 容器的時(shí)候,它的速度之快真是讓人驚訝,更棒的是分層的文件系統(tǒng)可以減少磁盤的使用。
容器不等于機(jī)器
自從有了 Docker 容器以后,你就不需要考慮機(jī)器的概念了。它們只是在不同的內(nèi)核命名空間中的進(jìn)程,你希望它們可以保持精簡(jiǎn)和干凈。它們也需要能夠運(yùn)行在不同的環(huán)境中,所以我放棄了在容器中使用 SSH 。那我又是如何來(lái)創(chuàng)建我的項(xiàng)目呢?首先我創(chuàng)建了一系列容器,在上面安裝了我項(xiàng)目中需要安裝但不應(yīng)該安裝在本地的工具。
在盒子里使用Go
我們先來(lái)看一下 github 上的 Dockerfile。
使用下面的別名在容器中啟動(dòng) go,隨后把容器移除:
- alias go="docker run --rm -t -i teemow/go"
你甚至可以使用不同的標(biāo)簽來(lái)運(yùn)行不同版本的 go( go:1.1、go:1.2 等)。不過要讓它它真正工作,還需要更多操作。你可以把你當(dāng)前的目錄綁定掛載到容器中,來(lái)做類似go get這樣的事情。
- alias go="docker run --rm -t -i -v \$(pwd):\$(pwd) -w \$(pwd) teemow/go"
如果你有一個(gè)私有 git 庫(kù)的話,你甚至可以把你當(dāng)前的 ssh 代理掛載到容器中:
- alias go="AGENT=\$(ls -1 --sort t /tmp/ssh-*/agent.* | head -1) && docker run --rm -t -i -v \$AGENT:\$AGENT -e SSH_AUTH_SOCK=\$AGENT -v \$(pwd):\$(pwd) -w \$(pwd) teemow/go"
類似 GOPATH 這樣的環(huán)境變量也可以傳入到容器中。
你可以完全用你自己的工具來(lái)完成這些事情,這樣你的主機(jī)會(huì)很干凈。別忘了給你的不同版本的鏡像打上標(biāo)簽,否則你很難跳回到之前的項(xiàng)目中。也許你可以給類似 rbenv ( dockerenv )的項(xiàng)目做記號(hào)。我已經(jīng)創(chuàng)建了一系列包含工具的鏡像 ,比如 npm 、 grunt 、 coffee-script 、 aws-cli 和 tugboat 等等。
專家提醒: 不要過度使用別名,建議盡可能使用小腳本,比如 /usr/local/bin/ 。
Docker 樂高積木
如果你想要在不只一個(gè)容器上運(yùn)行或者測(cè)試你的項(xiàng)目,那么就使用上面提到的別名來(lái)構(gòu)建你的項(xiàng)目。你不能在同一個(gè)容器中運(yùn)行你的Web服務(wù),postgres和redis。每項(xiàng)服務(wù)應(yīng)該有自己的容器,現(xiàn)在你需要做的就是把所有的“磚塊”組合起來(lái)。
Docker有一個(gè)特性稱之為“鏈接”,它可以幫助你做正在做的事情。一個(gè)被鏈接的容器通過環(huán)境變量導(dǎo)入本身。所以其他的容器能發(fā)現(xiàn)Ip地址和鏈接容器的接口。Heroku 使用了一種類似的方式來(lái)添加插件的信息。
但是你能使用fig使這一切更容易。只需要添加fig.yml文件到你的項(xiàng)目中并運(yùn)行fig up去開啟整個(gè)環(huán)境。本地目錄會(huì)被綁定到一個(gè)容器上,如果文件被修改,文件監(jiān)視器可自動(dòng)重啟你的服務(wù)。Mac/Vagrant用戶對(duì)這個(gè)比較熟悉。我已在piratesinn angellist list添加了fig.yml文件。
事實(shí)上,甚至連 fig 自身也是運(yùn)行在本機(jī)上的一個(gè)容器中。但是你需要把docker socket 服務(wù)綁定到 fig的容器中,這樣它才可以啟動(dòng)其他容器。
未完待續(xù)。
譯文來(lái)源:http://www.dockboard.org/dockerize-all-the-things/
【編輯推薦】
- Docker如何將錯(cuò)綜復(fù)雜的Linux代碼轉(zhuǎn)成開發(fā)者的魔法
- 你會(huì)用嗎?Linux五大數(shù)據(jù)可視化工具
- 深度專訪Linux Deepin郭攀 :圖標(biāo)的故事
- 送給Linux愛好者精彩有趣的高清Linux壁紙
- 極力推薦:一個(gè)Docker的maven插件
【責(zé)任編輯:林師授 TEL:(010)68476606】