在FreeBSD上使用Docker

需求

FreeBSD是個好東西,由於有ZFS。Docker也是個好東西,由於很爽。docker

然而以前Docker只支持Linux,因此在其它平臺上都須要搞個Linux虛擬機才能用,麻煩得很。shell

固然如今也是同樣,只是官方出了一個docker-machine能夠更方便地管理虛擬機裏的docker。基本用法能夠參考這篇《Docker on FreeBSDbash

不過爲了折騰這個東西,我把家裏的服務器搞崩潰好屢次,最後甚至不得不重裝一遍……前先後後折騰了快一個月。服務器

如今把這個血淚教訓總結成本文。less

準備環境

docker-machine依賴虛擬機環境,這裏以最經常使用的VirtualBox爲例。測試

個人服務器上原本就跑着VBox,因此當時就直接拿來用了,結果可恥滴失敗了。fetch

首先是須要系統版本:FreeBSD 11以上才提供了docker-machine,因此必須先把個人10升級一下。升級方法之前說過(見《FreeBSD升級失敗的處理》),這裏從略。ui

升級完成以後仍是不能用,建立新machine的時候各類報錯,好比:this

Error creating machine: Error in driver during machine creation: Unable to start the VM: /usr/local/bin/VBoxManage startvm dockerhost --type headless failed:
VBoxManage: error: The VMMR0.r0 module version does not match VBoxVMM.dll/so/dylib. If you just upgraded VirtualBox, please terminate all VMs and make sure th
at neither VBoxNetDHCP nor VBoxNetNAT is running. Then try again. If this error persists, try re-installing VirtualBox. (VERR_VMM_R0_VERSION_MISMATCH)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole

Details: 00:00:00.488143 Power up failed (vrc=VERR_VMM_R0_VERSION_MISMATCH, rc=NS_ERROR_FAILURE (0X80004005))
複製代碼

看上去是某些驅動或服務沒有正常工做。因而參考VirtualBox文檔,把vboxdrv和vboxnet都啓用,而後重啓……恭喜,系統崩潰了……spa

查了好久也沒查出緣由,我甚至另外搞了一臺電腦安裝了FreeBSD11重試,仍是同樣的問題。

只要下面任意一個命令運行就崩潰:

service vboxnet onestart
kldload vboxdrv.ko
複製代碼

搜了好久也沒找到緣由,搞了好幾天,直到今天搜到有人說了一句:可能跟系統不徹底兼容。我靈光一閃——對了,個人VBox是經過pkgng安裝的,有可能不兼容。因而果斷換成多年不用的ports:

portsnap fetch
portsnap extra  # 或update,若是已經安裝了ports的話
cd /usr/ports/emulators/virtualbox-ose
make config
make
make install clean
複製代碼

然而仍然沒有那麼順利,由於舊版的還在……

pkg delete virtualbox-ose
複製代碼

刪除後再編譯,仍然會有一些衝突的依賴包,所有刪除掉改用ports的版本。VBox這東西依賴仍是至關多的,斷斷續續編譯了兩天才算完成。最後還編譯安裝了一把virtualbox-ose-kmod

爲了保險起見,docker-machinedocker-compose我也是用ports的版本。

須要注意的是,若是你想用非root用戶操做的話,須要先容許這個用戶操做虛擬機:

pw groupmod vboxusers -m yourname
複製代碼

用戶須要從新登陸一下,若是用了screen或tmux之類的,也須要新開會話(不是新開窗口)纔會生效。

另外,爲了充分利用ZFS,建立一個ZFS供machine使用:

zfs create -o mountpoint=/home/yourname/.docker tank/docker
複製代碼

這樣建立的虛擬機就會在tank/docker這個ZFS裏了。

docker-machine

重點來了,爲了使用docker,先得建立一個machine,這就須要使用前面安裝的docker-machine了:

docker-machine create --driver virtualbox \
    --virtualbox-memory 2048 \
    --virtualbox-cpu-count 1 \
    --virtualbox-disk-size 204800 \
    dockerhost
複製代碼

上面的命令建立了一個叫作dockerhost的虛擬機,內存2G,CPU一顆,硬盤200G,而且自動運行起來。

而後就能夠對這個machine進行一系列操做了。

docker-machine ls
docker-machine stop dockerhost  # 中止虛擬機
docker-machine start dockerhost  # 啓動虛擬機
docker-machine rm dockerhost  # 刪除虛擬機
複製代碼

成功建立或啓動一個machine以後,就能夠操做docker了,不過操做以前須要設置一下環境:

eval `docker-machine env dockerhost`
複製代碼

主要是就是設置幾個環境變量給docker使用。

若是使用root用戶,須要注意的是:

root用戶的默認shell是csh,並不支持這個命令,必須使用bash。

其它用戶若是也是用csh,也要注意這一點。

docker

如今終於能夠開始使用docker了:

docker images
docker ps
docker run helloworld
複製代碼

大功告成!

可是還沒完,docker-machine裏的文件路徑是映射過的,因此如今試試這個是不會成功的:

docker run -it --rm -v /home/yourname:/var/workdir alpine /bin/sh
# cd /var/workdir
# touch test
# exit
> cd /home/yourname
> ls test  # 並無這個文件
複製代碼

由於-v映射的路徑不正確,必須使用在machine裏映射過的路徑。默認的映射路徑是:

share => /home
複製代碼

因此上面那個測試能夠改成:

docker run -it --rm -v /share/yourname:/var/workdir alpine /bin/sh
複製代碼

這樣再作上面的測試就能夠成功了。

固然那個默認映射能夠本身在VirtualBox裏修改,或者在建立docker-machine的時候指定。

相關文章
相關標籤/搜索