1. 程式人生 > >Docker簡介與搭建

Docker簡介與搭建

使用 system run idt 進入容器 ges 成功 困難 mnt

Docker定義

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

Docker的作用主要在於:讓程序的運行環境得到充分虛擬與隔離的同時, 輕巧化.

  我是不推崇過分詳細闡述如何安裝某一個軟件的.首先版本不同,安裝的命令,參數,方式本就不同,其次,不同的操作系統,不同的系統現有設置也會有影響..安裝這種事兒,是非常容易過期的,再詳盡的介紹也不一定適合自己.我只推薦一個地方:官網. 只需要選對自己的操作系統,基本都會很順利

在這裏梳理幾個官網安裝鏈接:

  1. Mac
  2. Ubuntu
  3. Windows
  4. CentOS

Docker的其他信息:

Docker(左)和傳統虛擬化(右)的體系架構有這樣2張經典的圖解釋:

技術分享技術分享

  顯然,同樣是為了虛擬化,解耦,第二種方式需要支撐起不同的操作系統運行,消耗較大.而docker僅僅是在Docker服務(由Docker引擎支撐)之下,使得程序在虛擬化環境中運行.

Docker產生的目的:

  • 環境管理復雜,有各種各樣的OS,中間件,App,一款產品能夠成功發布,開發者需要關註過多瑣碎的細節,管理困難,部署麻煩.
  • 雲計算時代的到來:(如AWS BPM的成功),引導開發者將應用轉移到雲上,這個雖然能大部分的解決硬件管理問題,然而軟件配置和管理問題依然存在,Docker可以嘗試新的軟件管理辦法解決這個問題.
  • 虛擬化手段變化:雲時代為了解決上述問題,采用標配硬件降低成本,采用虛擬化手段滿足用戶按需分配的資源需求和保證可用性和隔離性.但是這種虛擬化,往往用的是OS,GuestOS,對於Docker來說,這些虛擬化手段對資源的浪費是不小的.

Docker的4個性質:

  • 隔離性: 每個用戶實例時間相互隔離,互不影響. 一般的硬件虛擬化給出的方法是VM,而LXC給出的方法是container,更細一些講就是kernel namespace.其中pid、net、ipc、mnt、uts、user等namespace將container的進程、網絡、消息、文件系統、UTS("UNIX Time-sharing System")和用戶空間隔離開。
  • 可配額/可度量: 提供類似文件的接口,在文件夾中新建task文件,寫入相關配置可以實現對進程的資源控制.
  • 便攜性:支持將不同目錄掛在到同一個虛擬文件系統下. 例如將宿主機器的硬盤掛載到容器上,使得在不改變image的基礎上,允許用戶進行讀寫操作.
  • 安全性:實現的Linux系統固有的安全標準, Docker Deamon的安全接口,

比較傳統虛擬化和docker,兩種方式還有2個比較大的不同:

  1. 傳統虛擬化方式並沒有嚴格要求在一個虛擬操作系統中只運行一個程序,是相對自由的一整個生態系統,裏面不嚴格地有許多程序在運行.
  2. Docker在啟動鏡像的時候,無論是在命令的設置上,還是其根本的理念上,都希望用戶使得一個容器只運行一個應用程序,可以形象理解成,一個魚缸裏只養一條魚.因此,大家也可以參考這裏十項Docker不該做的事兒

但是這2種虛擬化方式其實還是有些類似的地方的,比如:都是以鏡像(images)為啟動基礎的,不同的鏡像保存不同的系統/狀態. 需要的時候,只需要讀取某個鏡像即可.

鏡像和容器是2個很關鍵的概念.鏡像可以理解為某種用以加載的資源,而容器,是運行著的鏡像的實例.一個鏡像可以有多個容器.

參考:[鏡像(image)是動態的容器的靜態表示(specification),包括容器所要運行的應用代碼以及運行時的配置。Docker 鏡像包括一個或者多個只讀層( read-only layers ),因此,鏡像一旦被創建就再也不能被修改了。一個運行著的Docker 容器是一個鏡像的實例( instantiation )。]

我們可以在利用docker的commit命令將容器固化,將動態的鏡像實例變成該瞬間的一個新的鏡像.

生成鏡像的兩種方法:

  1. 利用一個已有的(來自本地/hub的)鏡像創建一個容器,進入容器運行一些命令,利用docker commit生成新鏡像.
  2. 在某個自己的目錄,創建Dockerfile,在其中指揮一系列動作,直接用docker build利用已有的(來自本地/hubd)鏡像創建一個鏡像. // 這是更被推崇的方式

生成鏡像的2種方法可以參考這篇文章

  • 可以得到從一個基礎鏡像,最終生成自己想要的鏡像: 或者是對元數據的修改,或者是對文件系統的修改.
  • Docker在執行指令之後會創建臨時鏡像存儲在cache中
  • Docker鏡像是基於基礎鏡像的多層疊加. 當Docker創建一個容器時,它會在基礎鏡像的容器層上添加一層可寫容器層,接下來對容器的話是在這個層是進行的.

附10件使用容器時應避免的做法:

  • 不要在容器中保存數據(Don’t store data in containers
  • 將應用打包到鏡像再部署而不是更新到已有容器(Don’t ship your application in two pieces
  • 不要產生過大的鏡像 (Don’t create large images
  • 不要使用單層鏡像 (Don’t use a single layer image
  • 不要從運行著的容器上產生鏡像 (Don’t create images from running containers
  • 不要只是使用 “latest”標簽 (Don’t use only the “latest” tag
  • 不要在容器內運行超過一個的進程 (Don’t run more than one process in a single container
  • 不要在容器內保存 credentials,而是要從外面通過環境變量傳入 ( Don’t store credentials in the image. Use environment variables
  • 不要使用 root 用戶跑容器進程(Don’t run processes as a root user
  • 不要依賴於IP地址,而是要從外面通過環境變量傳入 (Don’t rely on IP addresses

參考資料:

Docker 命令大全

http://www.cnblogs.com/yudar/p/4391556.html

http://www.cnblogs.com/sammyliu/p/5877964.html 劉世民

Docker簡介與搭建