本文发自 http://www.binss.me/blog/review-of-docker-for-mac-beta/,转载请注明出处。

今早正睡得迷迷糊糊,突然手机一震,抓起一看,立马就激动得坐了起来,申请了一个多月的Docker for Mac终于获得邀请码,立刻打开电脑装起。

什么是Docker for Mac

我们知道,Docker需要运行在Linux上,因此Mac和Windows这对难兄难弟只能现在机器上跑一个VirtualBox的Linux虚拟机,然后在这个虚拟机中跑Docker。为了方便,通常直接采用Docker Toolbox来安装Docker全家桶,Toolbox会给我们安装上VirtualBox,然后在里面创建名为default的虚拟机,用来跑名为boot2docker的Linux发行版。安装完成后,为了能够与运行在VirtualBox虚拟机中的Docker进行通信,需要执行eval $(docker-machine env default)来设置以下环境变量:

set -gx DOCKER_TLS_VERIFY "1";
set -gx DOCKER_HOST "tcp://192.168.99.100:2376";
set -gx DOCKER_CERT_PATH "/Users/binss/.docker/machine/machines/default";
set -gx DOCKER_MACHINE_NAME "default";

这些环境变量告诉docker和docker-compose如何和虚拟机内的Docker进行通信:监听的端口、证书存放的位置、虚拟机的名称,还有最重要的——虚拟机的ip:

架构如下:

这种非常曲折的方式带来了种种坑爹的问题,将在后文提到。

Docker for Mac是怎么做的呢?

根据官方描述:

No more VirtualBox! On Mac, the Docker Engine runs in an xhyve Virtual Machine (VM) on top of an Alpine Linux distribution. The VM is managed by the native Docker application. On Windows, the Docker Engine is running in a Hyper-V VM.

换掉了坑爹的VirtualBox!Docker for Mac换用了基于Hypervisor.framework的虚拟机xhyve。Docker官方对xhyve进行了修改以更好地适配Docker。最终的架构为:在xhyve内创建一个Alpine Linux发行版的虚拟机,然后Docker跑在上面。据官方讲,新架构更加原生,速度更快,更加可靠!

不同于原来需要通过ip连接虚拟机的方式,Docker for Mac通过提供一个socket来和虚拟机内的Docker进行通信,架构如下:

Docker Toolbox和Docker for Mac能够很好地共存,当环境变量设定了docker-machine env default,则使用Docker Toolbox那一套来启动。如果没设置,则使用Docker for Mac那一套:

安装

Docker for Mac到底好不好,试过才知道。

  1. 挂载安装包,直接将Docker.app拖到Applications中

  2. 运行Docker.app,在输入邀请码后,输入用户密码进行授权就完成了Docker的安装。此时系统任务栏出现Docker图标

  3. 可以看到Docker已经成功安装

    注意安装了Docker Toolbox的用户需要将之间提到的环境变量unset才会切换到Docker for Mac,并会提示是否将原有docker的容器和镜像迁移过来,我选了是,于是硬盘瞬间少了20G(泪崩)。

  4. Over

对比

试用了一天,说说Docker for Mac好处都有啥:

  1. 安装包小,只有100MB,是Docker Toolbox的一半

  2. 安装快速,全程只需一分钟,比起Docker Toolbox快太多

  3. 集成了升级功能

    以往Docker Toolbox的升级非常坑爹,每次都要下载200MB的安装包不说,升级完后往往还不能平滑迁移。被各种找不到docker machine,不能连接到docker搞得痛不欲生。

  4. 虚拟机启动更快

    这里吐槽一下VirtualBox,这货除了免费貌似就没什么优点了,Parallels Desktop和Vmware Fusion不知道比它高到哪里去了。

  5. docker指令响应更快(不知道是不是我的错觉)

  6. 可以像本机程序一样访问容器暴露出来的端口

    Docker Toolbox是192.168.99.100,而如今直接访问localhost就好了。

  7. 挂载这个大坑终于被填了

    之前在跟我一起学Docker——Volume中提到过,Docker Toolbox在挂载一些容器目录时会出现各种问题,比如MongoDB,如果将数据目录/data/db挂载到Mac上,会悲催地发现MongoDB直接挂掉了,而Docker for Mac解决了这个问题,挂载无压力:

  8. Kitematic的DOCKER CLI终于是在iTerm2而不是Terminal中打开了

    这里需要注意的是原来的Kitematic指向的还是Docker Toolbox那一套,Docker for Mac版的Kitematic需要点击图标-Dashboard-Download Kitematic下载。当然下载下来名字也和原来的相同,为了避免混淆,可以改个名字再拖到Applications里。

总结

Docker for Mac真的给了我一个大惊喜。希望该产品能够早日上线公测。

需要申请内测的同学可以登陆https://beta.docker.com/,使用Docker Hub账户登陆后填写申请表单即可。官方会在N天后将激活码发送到你的邮箱。

参考

https://beta.docker.com/docs/mac/docker-toolbox/