萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> 如何使用vagrant和docker在OSX下管理創建虛擬環境簡明教程

如何使用vagrant和docker在OSX下管理創建虛擬環境簡明教程

 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?                                                  
   

copyright © 萬盛學電腦網 all rights reserved