Docker可以運行任何應用的"PaaS"雲

Docker 簡介python

Docker 是一個開源能夠將任何應用包裝在"LXC容器」中運行的工具。若是說VMware,KVM包裝的虛擬機,Docker包裝的是應用。是一個實至名歸的PaaS。mysql

當應用被打包成Docker Image後,部署和運維就變得極其簡單。可使用統一的方式 來下載,啓動,擴展,刪除,遷移。linux

Docker可以運行任何應用的「PaaS」雲

查看大圖git


Dock能夠用來:github

自動化打包和部署任何應用建立一個輕量級私有PaaS雲搭建開發測試環境部署可擴展的Web應用redis

Docker是開源的,能夠在GitHub上訪問其代碼,提供Restful接口。他的貢獻者是一個很是流行的PaaS雲提供商 https://dotcloud.com/sql

PaaS 的核心價值docker

遺失的方向 - 絕大部分應用居然不能無縫遷移到主流PaaS上shell

雲計算髮展多年,分爲IaaS,PaaS和SaaS。其中PaaS(平臺即服務)最爲不慍不火。筆者由於,最大的緣由是PaaS給人(開發,運維,老闆)帶來的價值不夠多,私有PaaS門檻高!最大的問題在於絕大部分應用居然不能無縫遷移到PaaS上。ubuntu

Heroku是最流行的公有PaaS雲。很廉價好用,但是大部分應用都沒法部署。每一個應用只能監聽一個HTTP端口,應用之間不能交互。他能夠爲你自動擴展和負載均衡,但其實沒得選擇,只要使用Heroku就必須接受限制。好歹Heroku支持絕大部分平臺如Java,Python。相比之下,GAE更甚,只支持三個平臺,不能訪問文件系統,也不能啓動子進程。

CloudFoundry是比較流行的私有PaaS雲。限制和Heroku同樣多,部署比較複雜。爲此他甚至有一個量身定製的部署工具BOSH。有多難用,用過的人都知道。這個不能怪開發人員,他定義的PaaS原本就這麼複雜。

PaaS要實現開發人和運維人的夢開發人的夢 - 自在的運行環境,無限的資源

開發人但願專一於程序邏輯。有自由自在的運行環境,有豐富的外部資源如各類中間件。至少不要爲何 端口監聽數目,通訊協議限制 這些事情所困擾。

運維人的夢 - 沒有故障和重複的事,減小等待

運維每天處理故障,若是千千萬應用都能以一樣的方式部署,運維。那麼故障的處理就簡單多了,重複的事情也會變少。下載部署,安裝依賴,這些事情都太過繁瑣耗時了。

Docker功能

Docker可讓開發和運維都變得簡單。

開發者沒必要要像使用通常PaaS同樣在充滿着限制的條件下開發應用,能夠就如同日常同樣,自由的使用各類資源。老子說「太上下知有之 ,其次譽之,其次侮之」。Dock對於開發者就是「下知有之」的狀態。

爽的人是運維。要使用Docker,須要在機器上安裝Docker Engine,

建立一個Container。其實是一個Linux Container,Docker會將網絡,存儲這些事情都配好。下載應用並安裝。好比能夠用sudo apt-get install mysql-server 來安裝一個MySQL。並配置一些參數什麼的。打包上傳Image。Docker能夠將這個Linux Container打包成Image,啓動腳本也在其中。並上傳至Image Registry中。這個Image僅僅包括你修改的增量部分,因此體積比較小。一條命令跑起來。使用Docker Run 一條命令能夠從Image Registry中下載Image 並跑起來。

Docker可以運行任何應用的「PaaS」雲

查看大圖



須要重啓的時候,只要重啓Container。須要遷移的時候,只要遷移Container。一切乾乾淨淨。

PaaS,IaaS術業有專攻

IaaS廣泛使用虛擬機,開銷較大。Docker明顯更輕量。筆者認爲IaaS和PaaS各有專攻,PaaS去專一於安全級別的隔離是沒有意義的,IaaS也不該該去感知到應用。一個公有云中,可讓每一個租戶使用不一樣的虛擬機,虛擬網絡來作到安全和資源上的隔離。再經過PaaS統一運維,管理計算資源。


Docker可以運行任何應用的「PaaS」雲

查看大圖


沒有必要讓每一個應用都專享一臺虛擬機,這樣開銷太大。但在安全敏感的環境中,每一個租戶使用不一樣的虛擬機是合理的。

使用Docker

在線嘗試

使用Docker最便捷的方式莫過於 在線嘗試http://www.docker.io/gettingstarted/#

完成了這個在線的教材,相信你對Docker已經基本玩轉了。

在Ubuntu中安裝Docker

如今Docker支持兩個Ubuntu版本:

Ubuntu Precise 12.04 (LTS) (64-bit)Ubuntu Raring 13.04 (64 bit)

有兩個依賴

Linux kernel 3.8 (read more about Kernel Requirements)AUFS 文件系統

因此須要確認下您的操做系統,安裝依賴並重啓:

# Add the PPA sources to your apt sources list.

sudo apt-get install python-software-properties && sudo add-apt-repository ppa:dotcloud/lxc-docker

 

# Update your sources

sudo apt-get update

 

# Install, you will see another warning that the package cannot be authenticated. Confirm install.

sudo apt-get install lxc-docker

安裝Docker並重啓:

# Add the PPA sources to your apt sources list.

sudo apt-get install python-software-properties && sudo add-apt-repository ppa:dotcloud/lxc-docker

 

# Update your sources

sudo apt-get update

 

# Install, you will see another warning that the package cannot be authenticated. Confirm install.

sudo apt-get install lxc-docker

使用Docker,下載一個Ubuntu Image,並建立一個Container,在其中運行Bash

# download the base 'ubuntu' container and run bash inside it while setting up an interactive shell

sudo docker run -i -t ubuntu /bin/bash

 

# type 'exit' to exit

成功,你已經玩轉Docker了!!

Docker Run的時候發生了什麼?

當用戶執行Docker run的時候,發生了這些事情:

Docker CLI 調用 Docker Engine的Restful API。默認狀況下,Docker  Engine是監聽在一個Unix Socket上的,固然也能夠監聽在TCP端口上。從docker index下載一個Ubuntu Image。docker index是一個薈萃Docker Image的地方,就像一個Repository.你也能夠構建本身的私有Repository。分配文件系統。文件系統是AUFS,這是一種「增量文件系統」,你作的修改均可以以增量的方式保存。所以Docker Image能夠很小。Mount文件系統建立網絡端口。Docker使用Linux Bridge和Linux Network NameSpace來配置網絡。配置IP地址。給剛剛建立的虛擬網卡配一個內部IP。這個IP不重要,由於Docker是經過靜態NAT來對外保留TCP/UDP端口的。在LXC中執行命令,這個例子中命令就是 "/bin/bash"截取「/bin/bash」的輸入輸出流到Terminal,和你交互Dock詳解在Docker中運行Redis

建立一個Docker Container

sudo docker run -i -t ubuntu /bin/bash

安裝Redis .

apt-get update

apt-get install redis-server

exit

拍個快照,建立你本身的Docker Redis Image

docker ps -a  # grab the container id (this will be the first one in the list)

docker commit <container_id> <your username>/redis

運行Redis。-d 是指後臺運行,使用你剛剛建立的Image。

sudo docker run -d -p 6379 <your username>/redis /usr/bin/redis-server

使用redis-cli訪問

sudo docker ps  # grab the new container id

sudo docker inspect <container_id>    # grab the ipaddress of the container

redis-cli -h <ipaddress> -p 6379

redis 10.0.3.32:6379> set docker awesome

OK

redis 10.0.3.32:6379> get docker

"awesome"

redis 10.0.3.32:6379> exit

 

 文件系統

通常來講,要Linux須要兩種文件系統

boot file system (bootfs)root file system (rootfs)

bootfs包含有bootloader。用戶歷來不會更改bootfs。事實上,當機器啓動結束後,kernel會卸載掉這個bootfs。

rootfs就是咱們一般看到了Linux文件目錄,包括 /dev, /proc, /bin, /etc,/lib, /usr, 和/tmp等等。不一樣的Linux發行版的rootfs是不同的,軟件包結構也是不一樣的。Docker經過管理rootfs,能夠在同時運行多個Linux發行版。

Docker可以運行任何應用的「PaaS」雲

查看大圖


當傳統Linux啓動的時候,rootfs是隻讀的,檢查完整性後會轉化成可讀寫狀態。

當Docker掛載rootfs的時候,也是隻讀的。可是他並無把它轉化爲可讀寫狀態,並且在其上使用 union mount 來加一層,建立一個可讀寫的文件系統。原理的rootfs仍是隻讀的,數據被寫入新的空間。Docker稱之爲"層",數據能夠這樣一層一層疊加起來。


最初的時候,最頂層中什麼數據也沒有,當進程建立修改文件的時候,數據就會保存在最頂層。底層的文件系統沒有絲毫改變。

當導出Image的時候,其實就是導出最頂層而已。

因爲底層的只讀的,多個Docker Container能夠共享,提升的文件系統的使用效率。

Docker生態環境

Docker可以運行任何應用的「PaaS」雲

查看大圖

Docker是開源的,提供完善的Restful接口,設計簡潔,直戳痛點。可是所以比較簡單,沒有華麗的功能。鳳棲梧桐,以Docker爲樹幹,衍生出許多優秀的項目。

dokku 100行BASH的微Heroku。包含了一個PaaS的基本功能shipyard Docker管理界面,提供多Host,建立Container,查看Image等功能openstack-docker Docker和OpenStack集成,可使用Nova和Glance來控制jiffylab教學用Python和Unix Shell平臺BYO SAAS Memcached as a ServiceDockerui Docker管理界面

Docker可以運行任何應用的「PaaS」雲

查看大圖


dokku

Docker可以運行任何應用的「PaaS」雲

查看大圖

相關文章
相關標籤/搜索