Docker 簡介python
Docker 是一個開源能夠將任何應用包裝在"LXC容器」中運行的工具。若是說VMware,KVM包裝的虛擬機,Docker包裝的是應用。是一個實至名歸的PaaS。mysql
當應用被打包成Docker Image後,部署和運維就變得極其簡單。可使用統一的方式 來下載,啓動,擴展,刪除,遷移。linux
查看大圖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 並跑起來。
須要重啓的時候,只要重啓Container。須要遷移的時候,只要遷移Container。一切乾乾淨淨。
PaaS,IaaS術業有專攻
IaaS廣泛使用虛擬機,開銷較大。Docker明顯更輕量。筆者認爲IaaS和PaaS各有專攻,PaaS去專一於安全級別的隔離是沒有意義的,IaaS也不該該去感知到應用。一個公有云中,可讓每一個租戶使用不一樣的虛擬機,虛擬網絡來作到安全和資源上的隔離。再經過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發行版。
當傳統Linux啓動的時候,rootfs是隻讀的,檢查完整性後會轉化成可讀寫狀態。
當Docker掛載rootfs的時候,也是隻讀的。可是他並無把它轉化爲可讀寫狀態,並且在其上使用 union mount 來加一層,建立一個可讀寫的文件系統。原理的rootfs仍是隻讀的,數據被寫入新的空間。Docker稱之爲"層",數據能夠這樣一層一層疊加起來。
最初的時候,最頂層中什麼數據也沒有,當進程建立修改文件的時候,數據就會保存在最頂層。底層的文件系統沒有絲毫改變。
當導出Image的時候,其實就是導出最頂層而已。
因爲底層的只讀的,多個Docker Container能夠共享,提升的文件系統的使用效率。
Docker生態環境
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管理界面
dokku