[Docker]保持屋子整潔,開始使用docker

關於Docker

Docker是一個使用Go語言編寫的虛擬化解決方案,很是輕量、易於使用。python


###爲何要使用Docker 至於爲何要使用Docker,相信你能夠很輕鬆地在網上找到許多使用Docker的優勢。一次配置、處處運行,更高效的虛擬化,更簡單地管理等等。
可是,對於我我的來講,使用Docker,可讓個人工做環境變得整潔、乾淨。說到這裏,就要說一下工做方式了。linux

1. 石器時代

在最開始時候,我的電腦就是工做電腦,工做娛樂都是在同一臺電腦上進行的。通常狀況下,會稍微對它們作下整理,好比放到不一樣文件夾,或者放到不一樣的磁盤。可是無論怎樣,隨着軟件安裝、刪除、升級,文件的增刪,慢慢的電腦中的文件碎片就愈來愈多。常見的好比windows電腦C盤愈來愈大,裏面都是一些奇怪文件名的文件,都不知道哪些能夠刪,哪些不能夠刪,最後索性重裝系統。nginx

2. 青銅時代

在瞭解過一些虛擬機以及雙系統的知識後,能夠會選擇安裝雙系統、裝虛擬機,來保證工做環境的隔離。好比我之前就用Virtualbox裝不一樣的系統作不一樣的事情。可是這類虛擬機啓動緩慢,抽象看來它就是另一臺電腦,因此只是你的一臺電腦變成兩臺或者多臺電腦而已。git

3. 工業時代

除了虛擬機啓動緩慢、效率性能比較低以外,一臺電腦仍是同一套環境,若是你想切換環境,仍是比較麻煩。好比你要作一個項目使用的是PHP5.3,可是你想試用PHP5.5的新特性時候就會比較麻煩。Docker的出現,能夠比較好地解決其中某些問題。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

這裏顯示的一些東西:

  • CONTAINER ID: 容器的ID
  • IMAGE: 容器所使用的鏡像
  • COMMAND: 創建容器時候使用的命令
  • CREATED: 建立時間
  • STATUS: 當前狀態
  • PORTS: 端口映射(默認爲無)
  • NAMES: 容器的名字

經過上面已經下載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 從入門到實踐

相關文章
相關標籤/搜索