[Docker]保持屋子整潔,開始使用docker
關于Docker
Docker是一個使用Go語言編寫的虛擬化解決方案,非常輕量、易于使用。
為什么要使用Docker
至于為什么要使用Docker,相信你可以很輕松地在網上找到許多使用Docker的優點。一次配置、到處運行,更高效的虛擬化,更簡單地管理等等。
但是,對于我個人來說,使用Docker,可以讓我的工作環境變得整潔、干凈。說到這里,就要說一下工作方式了。
1. 石器時代
在最開始時候,個人電腦就是工作電腦,工作娛樂都是在同一臺電腦上進行的。一般情況下,會稍微對它們做下整理,比如放到不同文件夾,或者放到不同的磁盤。但是不管怎樣,隨著軟件安裝、刪除、升級,文件的增刪,慢慢的電腦中的文件碎片就越來越多。常見的比如windows電腦C盤越來越大,里面都是一些奇怪文件名的文件,都不知道哪些可以刪,哪些不可以刪,最后索性重裝系統。
2. 青銅時代
在了解過一些虛擬機以及雙系統的知識后,可以會選擇安裝雙系統、裝虛擬機,來保證工作環境的隔離。比如我以前就用Virtualbox裝不同的系統做不同的事情。但是這類虛擬機啟動緩慢,抽象看來它就是另外一臺電腦,所以只是你的一臺電腦變成兩臺或者多臺電腦而已。
3. 工業時代
除了虛擬機啟動緩慢、效率性能比較低之外,一臺電腦還是同一套環境,如果你想切換環境,還是比較麻煩。比如你要做一個項目使用的是PHP5.3,但是你想試用PHP5.5的新特性時候就會比較麻煩。Docker的出現,可以比較好地解決其中某些問題。
Docker的使用
Docker是一個輕量級的虛擬化解決方案,你可以實現秒級的虛擬機啟動、非常輕量級的虛擬化。個人使用理解看來,它可以實現一個類似于版本管理Git一樣的輕量化的狀態保存。
Docker有兩個非常重要的概念: 鏡像和容器。
鏡像是呈載容器的實體,所有容器都是運行在鏡像之上。用版本管理的角度來看,鏡像就像是某一個節點,它可以派生出不同的分支,你可以在不同分支上做不同的事情。可以想象成一棵樹,最基本的鏡像是主樹干,主樹干可以分出旁支樹干,而旁支樹干可以分出更細的旁支,而樹干上可以生長樹枝。
比如,你使用Docker,從官方倉庫下載一個ubuntu鏡像,把它作為最基礎的鏡像。然后在上面運行一個容器,這個容器里下載Nginx,再以這個容器為基礎生成一個新的鏡像,以后這個鏡像生成的容器就都是ubuntu+nginx為基礎。但是你工作環境可能需要你使用Apache來工作,你也想有一個ubuntu+apache為基礎的鏡像,于是你可以使用最基礎的ubuntu鏡像運行一個容器,在里面下載安裝Apache,然后以這個容器為基礎,保存一個ubuntu+apache的鏡像,以后在這個鏡像基礎上運行的所有容器都擁有了一個apache環境。
操作流程
在安裝完Docker之后(這里以本機ubuntu操作系統為例):
# docker pull ubuntu
這樣通過pull會從官方倉庫下載一個最新構建的ubuntu鏡像下來:
root@docker:~# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest 9cbaf023786c 7 days ago 192.8 MB
然后,你可以在這個鏡像為基礎,執行某些操作。如下:
root@docker:~# docker run -it ubuntu /bin/bash root@ead6f34e1f8e:/#
這樣,你就進入了一個容器。新容器并不需要單獨創建,只需要以某個鏡像為基礎,執行某些命令就可以。
注意,新容器就像一個全新安裝的精簡系統,里面很多指令和程序都默認沒有安裝,如python, wget, vim等。
下面,在容器里下載nginx:
root@ead6f34e1f8e:/# apt-get update root@ead6f34e1f8e:/# apt-get install nginx root@ead6f34e1f8e:/# which nginx /usr/sbin/nginx root@ead6f34e1f8e:/# nginx -v nginx version: nginx/1.4.6 (Ubuntu) root@ead6f34e1f8e:/# exit
在退出容器之后,使用docker ps -a
可以看到停止了的容器:
root@docker:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ead6f34e1f8e ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 44 seconds ago suspicious_rosalind
這里顯示的一些東西:
- CONTAINER ID: 容器的ID
- IMAGE: 容器所使用的鏡像
- COMMAND: 建立容器時候使用的命令
- CREATED: 創建時間
- STATUS: 當前狀態
- PORTS: 端口映射(默認為無)
- NAMES: 容器的名字 </ul>
通過上面已經下載Nginx的容器,我們可以創建一個新的鏡像:
root@docker:~# docker commit -m 'add nginx' ead6f34e1f8e ubuntu/nginx 6d61d587b283fd163a30eff8ec1928b503e1d05de24cb815bc3acc5bc4b4d1ed root@docker:~# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu/nginx latest 6d61d587b283 3 seconds ago 231.3 MB ubuntu latest 9cbaf023786c 7 days ago 192.8 MB
這樣我們就創建了一個新的鏡像,里面默認包含了Nginx,以后所有需要nginx運行環境的容器都可以以這個鏡像為基礎,而不需要重新下載。當然,這里的鏡像名字比較隨意,此處僅為實驗。
root@docker:~# docker run -it ubuntu/nginx /bin/bash root@3364e69c4654:/# which nginx /usr/sbin/nginx root@3364e69c4654:/# nginx -v nginx version: nginx/1.4.6 (Ubuntu)
進入后可以看到,默認就是上面那個環境。現在退出后,再查看容器:
root@docker:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3364e69c4654 ubuntu/nginx:latest "/bin/bash" 3 minutes ago Exited (0) 3 seconds ago happy_curie ead6f34e1f8e ubuntu:latest "/bin/bash" 23 minutes ago Exited (0) 14 minutes ago suspicious_rosalind
這里就可以看到,有了兩個停止的容器。另外,容器ID就是容器的主機名。
你可以創建很多容器,僅消耗很少一部份資源,就可以擁了很多隔離的環境。而且,你可以把這樣的環境保存起來,推送到某一個docker倉庫中去,然后在生產環境再次下載運行。這樣就達到了生產和開發環境的一致性,也就是一次開發到處運行。
使用docker遇到的問題
由于個人電腦為OS X,所以運行docker需要同時安裝boot2docker這個程序,而且需要virtualbox的配合,具體可以參見Mac OS X系統安裝說明。如果使用了Homebrew,可以直接使用brew install docker boot2docker
來安裝。但是如果以前安裝過,或者更新,可能會有一些問題,很常見的如:
Error response from daemon: client and server don't have same version (client : 1.15, server: 1.13)
這個問題說明服務端和客戶端版本不一致(在linux系統上應該不會出現這樣的問題),主要是boot2docker引起的。如果遇到這樣的問題,更新下boot2docker就可以了。注意,這里不是重新下載安裝boot2docker:
boot2docker download boot2docker restart
或
boot2docker upgrade
后記
這篇文章只是大概地講述了一下Docker使用的最基本流程,里面有很多概念包括涉及到的概念(如鏡像標簽)并沒有展開來講,所以總體是比較粗略的。深入了解可以期待本人后續文章或者直接參看下面的開源圖書,這本書很適合想入門的朋友。
資料參考:Docker 從入門到實踐
來自:http://my.oschina.net/dmdgeeker/blog/336005