Vagrant是一個基於Ruby的工具,用於創建和部署虛擬化開發環境。docker 是一個開源的應用容器引擎,開發者可以打包他們的應用到一個可移植的容器中,然後發布到 Linux 上,也可以實現虛擬化。
虛擬化: 其實就是因為雲計算的催生的技術,目的是讓運行在上面的應用程序覺得自己獨占所有的資源。說白了就是資源管理/隔離和namspace的隔離.
Hypervisor: 這是虛擬化的一種,也就是操作系統上面在運行一個或者多個操作系統,這個底層的操作系統系統就是hypervisor.它來管理和分配那些創建的操作系統 所需要的資源.這種虛擬化也可以分成2種:原生(直接將虛擬的操作系統運行在裸機上,比如kvm和xen,確定是需要特定的硬件支持)和宿生(軟件層面的,比如我這裡 會用到的Virtualbox). 但是有個問題:運行了多個操作系統實例,開銷很大,而且啟動一個系統就要拿走一部分資源
LXC(LinuX Containers):是一種操作系統層面的虛擬化技術.它只運行一個內核,一個虛擬的執行環境就是一個容器。可以為容器綁定特定的cpu和memory節點, 分配特定比例的cpu時間、IO時間,限制可以使用的內存大小等.遺憾的是LXC只支持linux,不支持BSD,OSX,WINDOWS,所以我下面在我的Mac裡面是通過 Virtualbox生成容器的. 至於為什麼選擇LXC,我想除了開銷小之外,就是方便快速的部署
Docker: 是一種增加了高級API的LinuX Container(LXC)技術,來至dotcloud, 官網這樣描述:提供了能夠獨立運行Unix進程的 輕量級虛擬化解決方案。它提供了一種在安全、可重復的環境中自動部署軟件的方式.在Infoq你能找到主要特性,當然,3個月過去了,它肯定成長了很多
Vagrant: 是一個ruby語言的工具. 用於創建和部署虛擬化開發環境. 我們使用Vagrant在VirtualBox的虛擬機裡安裝docker
什麼系統來使用docker的一些想法
用OSX本來就有點…額,太繞. 其實docker已經被ubuntu官方支持,添加docker的PPA然後安裝.
還可以把安裝流程封裝成Dockfile,用git做版本控制
誰需要學習本文
我想運維同學會更需要一些.或者硬件資源缺乏的程序員們
程序員倒是可以學習把開發的應用放在虛擬機裡面做成模板,可以使用vagrant管理
為什麼這麼說?要是為了不污染開發環境,我們python已經有個virtualenv+virtualenvwrapper.
對我這種程序員來說,我不需要那麼多虛擬機,其次是我還有物理機的測試環境,並且我們線上的操作系統相當一致. 這篇文章就是為了了解docker
安裝Vagrant和Virtualbox
vagrant就是基於Virtualbox的,你可以使用gem安裝
gem install vagrant
我喜歡最新版,手動安裝的
wget https://github.com/mitchellh/vagrant/archive/v1.2.2.tar.gz
tar zxvf v1.2.2.tar.gz
cd vagrant-1.2.2
sudo gem install bundler
bundle install
rake install
從github克隆docker
git clone https://github.com/dotcloud/docker.git
cd docker
vagrant up
‘vagrant up’其實就是調用了virtualbox的終端接口打開你的虛擬機,類似下面的命令, 而不是你在界面點擊’開始’
/Applications/VirtualBox.app/Contents/MacOS/VBoxHeadless --comment docker_1373340358 --startvm 6e4ea638-77b2-400d-9fbe-3b4e8d4fba21 --vrde config
這時候你在virtualbox的界面可以看見啟動的虛擬機,名字就是上面的docker_1373340358
在docker目錄下已經有個一個Vagrantfile文件,你想想Makefile,意思很類似,其實為什麼要這個docker源, 很大原因就是要用這個文件,因為它已經配置好了默認你要是用的box文件,類似執行了下面的命令
vagrant init ubuntu http://files.vagrantup.com/http://files.vagrantup.com/precise64.box
.... #一些配置
vagrant up
首先說這裡可能會報錯,類似這個網頁粘貼的內容, 內容有類似提示
INFO interface: error: There was an error executing the following command with
VBoxManage:
["import", "C:/Users/kwladyka/Desktop/My Dropbox/Vagrant/vagrant.d/boxes/base/bo
x.ovf"]
For more information on the failure, enable detailed logging with
VAGRANT_LOG.
解決辦法是:
cd /Users/dongwm/.vagrant.d/boxes/ubuntu/virtualbox/
openssl sha1 *.vmdk *.ovf > box.mf
cd -
但是官網說這樣會自動幫我們增加docker的PPA,更新源再安裝lxc-docker,可是沒有出現,我後來都是自己去執行的,如下
為什麼用這個box?當然了其它系統都可以,你可以下載其它的虛擬機鏡像,再安裝其系統下的lxc-docker(我會准備一篇gentoo版本的文章)
登錄虛擬機
vagrant ssh
其實通過2222的端口轉發登錄了虛擬機的22端口,實際命令類似這樣:
ssh [email protected] -p 2222 -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o
IdentitiesOnly=yes -i /Users/dongwm/.vagrant.d/insecure_private_key
我自己安裝lxc-docker的方法
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:dotcloud/lxc-docker
sudo apt-get update
sudo apt-get install lxc-docker
生成容器(虛擬機)並且創建一個sshd進程,以便使用者鏈接這個虛擬機
官網說的下載dhrp/sshd這個容器,但是我費了半天勁下載後報神奇的404…後來我在換了另外一個,這個pull其實就是去下載一個已經 被別人做好的實現某種功能的虛擬機,然後你使用這個實現基本功能的虛擬機,提交你的修改就變成你定制的版本了,當然你可以自己做一個容器
docker pull base #pull基本的ubuntu鏡像
docker run -i -t base /bin/bash #-i表示進入交互模式,-t為啟動一個終端,其實就是根據base鏡像進入一個容器
root@4a61c288be0f:/# apt-get update && apt-get install openssh-server #注意前面的PS,root權限,進入了這個容器,需要先安裝sshd
root@4a61c288be0f:/# mkdir /var/run/sshd #要不然啟動不了sshd
root@4a61c288be0f:/# /usr/sbin/sshd #啟動sshd進程,不同的系統可能位置不同
root@4a61c288be0f:/# passwd #設置root密碼,以後要ssh登錄滴
root@4a61c288be0f:/# exit #退出容器 但是記住前面PS的一排隨機號碼 這裡是4a61c288be0f
docker ps -a |less #查看都有那些容器,也能看見上面的
docker commit 4a61c288be0f dongweiming/sshd #這裡的commit號碼就是剛才記住的. 這樣狀態保存到dongwm/sshd,以後就不用下載openssh-server,設置root密碼了
想要簡單的話直接這樣嘛….
docker pull johnfuller/sshd
docker run -i -t johnfuller/sshd /bin/bash
root@2fd1aabac314:/# /usr/sbin/sshd
root@2fd1aabac314:/# passwd
root@2fd1aabac314:/# exit
docker commit 2fd1aabac314 dongweiming/sshd
這裡有個STATUS列,退出碼有0,1,2,127等,驗證你的容器正常運行,後面還有PORTS列,要是sshd啟動了就會顯示的
啟動容器,用我自己的sshd容器
rst=$(docker run -d dongwm/sshd -p 22 /usr/sbin/sshd -D) #執行這個會返回類似的字符數字串
docker ps #你會發現它啟動了
port=$(docker port $rst 22) #這會顯示在實際的虛擬機的這個容器專用的端口
ssh鏈接這個容器
ifconfig #找你本機的ip
ssh [email protected] -p $port #port 好像默認從49153開始 這樣輸入root密碼就登錄進去了
OK了 就是這樣,然後當然你可以為這個虛擬機和你本機(注意三個關鍵詞:本機(我的Mac),虛擬機(vagrant創建的vbox),容器(在vbox中創建的虛擬機,虛擬機中的虛擬機))
把你的源push到docker,需要你注冊. 可以被別人用,當然了 目前來說沒啥用
docker login
docker push dongweiming/sshd #要確保這個源沒有被用,我這裡是dongweiming和 dongweiming/sshd
這樣你以後想找個sshd的源,就可以這樣
docker pull dongweiming/sshd
但是這裡面還是有很多其他的東西,往下看
端口轉發
你想,你這是在虛擬機裡面創建了一堆容器,他可以連接本機,甚至上網,但是你不能直連到它,那麼這時候就需要神奇的端口轉發, 將你本機的端口的數據轉發到這個vbox的端口,然後就可以看起來直連了,其實人家已經實現了
回到最上面的Vagrantfile,就是docker的根目錄下.最後面
if !FORWARD_DOCKER_PORTS.nil?