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

jopen 10年前發布 | 27K 次閱讀 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!