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的时候指定。