FreeBSD是個好東西,由於有ZFS。Docker也是個好東西,由於很爽。docker
然而以前Docker只支持Linux,因此在其它平臺上都須要搞個Linux虛擬機才能用,麻煩得很。shell
固然如今也是同樣,只是官方出了一個docker-machine能夠更方便地管理虛擬機裏的docker。基本用法能夠參考這篇《Docker on FreeBSD》bash
不過爲了折騰這個東西,我把家裏的服務器搞崩潰好屢次,最後甚至不得不重裝一遍……前先後後折騰了快一個月。服務器
如今把這個血淚教訓總結成本文。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-machine
和docker-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 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 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的時候指定。