Docker是一個使用Go語言編寫的虛擬化解決方案,很是輕量、易於使用。python
###爲何要使用Docker 至於爲何要使用Docker,相信你能夠很輕鬆地在網上找到許多使用Docker的優勢。一次配置、處處運行,更高效的虛擬化,更簡單地管理等等。
可是,對於我我的來講,使用Docker,可讓個人工做環境變得整潔、乾淨。說到這裏,就要說一下工做方式了。linux
在最開始時候,我的電腦就是工做電腦,工做娛樂都是在同一臺電腦上進行的。通常狀況下,會稍微對它們作下整理,好比放到不一樣文件夾,或者放到不一樣的磁盤。可是無論怎樣,隨着軟件安裝、刪除、升級,文件的增刪,慢慢的電腦中的文件碎片就愈來愈多。常見的好比windows電腦C盤愈來愈大,裏面都是一些奇怪文件名的文件,都不知道哪些能夠刪,哪些不能夠刪,最後索性重裝系統。nginx
在瞭解過一些虛擬機以及雙系統的知識後,能夠會選擇安裝雙系統、裝虛擬機,來保證工做環境的隔離。好比我之前就用Virtualbox裝不一樣的系統作不一樣的事情。可是這類虛擬機啓動緩慢,抽象看來它就是另一臺電腦,因此只是你的一臺電腦變成兩臺或者多臺電腦而已。git
除了虛擬機啓動緩慢、效率性能比較低以外,一臺電腦仍是同一套環境,若是你想切換環境,仍是比較麻煩。好比你要作一個項目使用的是PHP5.3,可是你想試用PHP5.5的新特性時候就會比較麻煩。Docker的出現,能夠比較好地解決其中某些問題。docker
Docker是一個輕量級的虛擬化解決方案,你能夠實現秒級的虛擬機啓動、很是輕量級的虛擬化。我的使用理解看來,它能夠實現一個相似於版本管理Git同樣的輕量化的狀態保存。apache
Docker有兩個很是重要的概念: 鏡像和容器。ubuntu
鏡像是呈載容器的實體,全部容器都是運行在鏡像之上。用版本管理的角度來看,鏡像就像是某一個節點,它能夠派生出不一樣的分支,你能夠在不一樣分支上作不一樣的事情。能夠想象成一棵樹,最基本的鏡像是主樹幹,主樹幹能夠分出旁支樹幹,而旁支樹幹能夠分出更細的旁支,而樹幹上能夠生長樹枝。vim
好比,你使用Docker,從官方倉庫下載一個ubuntu鏡像,把它做爲最基礎的鏡像。而後在上面運行一個容器,這個容器裏下載Nginx,再以這個容器爲基礎生成一個新的鏡像,之後這個鏡像生成的容器就都是ubuntu+nginx爲基礎。可是你工做環境可能須要你使用Apache來工做,你也想有一個ubuntu+apache爲基礎的鏡像,因而你可使用最基礎的ubuntu鏡像運行一個容器,在裏面下載安裝Apache,而後以這個容器爲基礎,保存一個ubuntu+apache的鏡像,之後在這個鏡像基礎上運行的全部容器都擁有了一個apache環境。windows
操做流程
在安裝完Docker以後(這裏以本機ubuntu操做系統爲例):bash
# 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
這裏顯示的一些東西:
經過上面已經下載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倉庫中去,而後在生產環境再次下載運行。這樣就達到了生產和開發環境的一致性,也就是一次開發處處運行。
因爲我的電腦爲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 從入門到實踐