Docker for Mac 公测版试用

伴随着 2016 年 Docker Conference 的进行, Docker for Mac 和 Windows 的版本终于完全公测开始了. 之前阅读 Docker for Mac Windows Beta: the simple way to use Docker on your laptop 里的介绍, 想要安装的必须在 https://beta.docker.com/  收到获准才能下载.

Docker for Mac and Windows 可能让我们在 Mac 或 Windows 下脱离 Virtual Box 虚拟机, 像在 Linux 下一样跑 Docker. 因为不存在了 Virtual Box 这一中间层, 端口重定向就变成了一件很简单的事情了. 再也不用像原来那样 Localhost:80 -> VirtualBox-Default:1080 -> Container:80, 而直接就是 Localhost:80 -> Container:80.

也不再需要用 eval $(docker-machine env default) 来设置 DOCKER_HOST 等环境变量了.

目前的 Beta 版是 Version 1.12.0-rc2-beta16 (build: 9493) f615be9fb245904fbdf1aa0cad251d418c869428

本人趁手的是 Mac, 所以大概讲述如何安装 Docker for Mac. 首先我们可以尽情的卸载掉已安装的 Virtual Box, Docker-Machine 和 Docker 了, 然后从 https://docs.docker.com/docker-for-mac/ 下载 Docker for Mac. 它是一个 dmg 文件, 想安装普通的 Mac 应用那样拖拽到 /Applications 目录, 

docker-for-mac-install

之后可在 Launchpad 找到 Docker, 或通过 Spotlight Search 找到它并启动, 第一次启动时会要求授权进行一些初始化设置:

创建如下面的执行文件链接

/usr/local/bin/docker -> ~/Library/Group Containers/group.com.docker/bin/docker
/usr/local/bin/docker-machine -> ~/Library/Group Containers/group.com.docker/bin/docker-machine
/usr/local/bin/docker-compose -> ~/Library/Group Containers/group.com.docker/bin/docker-compose
/usr/local/bin/notary -> ~/Library/Group Containers/group.com.docker/bin/notary

由此可知这个 Docker dmg 安装包含有 docker, docker-machine, docker-compose, docker-diagnose, 和 notary 工具.

如果之前有 docker-machine 的 default Vitual Box 虚拟机, 初始的时候还会询问你是否拷贝它到新的 vhyve 虚拟机中, vhyve 是构建于 OS X 10.10 Yosemite 的 Hypervisor.framework 之上的轻量级虚拟化技术. 而 Docker for Windows 也像 Docker for Mac 一样摒弃了 Virtual Box 而转而采用了  Hyper-V 虚拟化技术.

原来用 brew 安装的 docker, docker-machine 的链接指向是下面那样子的

/usr/local/bin/docker -> ../Cellar/docker/1.11.2/bin/docker
/usr/local/bin/docker-machine -> ../Cellar/docker-machine/0.7.0/bin/docker-machine

初始完之后会在系统栏上显示一个  Docker 图标

docker-for-mac-tray

 

现在开始, 使用 Docker 的命令和以前也差不多. 虽然提供了 docker-machine 命令, 但不再通过它来管理虚拟机了, 使用 docker-machine ls 什么都看不到, 不知道保留 docker-machine 这个命令有何用处.

Docker for Mac 不再通过 TCP 端口通信, 而是用 /var/tmp/com.docker.vmnetd.socket 套接字文件通信

我们现在来测试一下 Docker 便捷的端口重定向方式, 运行官方的 nginx 镜像, 该镜像暴露了 80 和  443 端口号, 我们可以用下面的命令直接把 Mac 的 80 映射到 nginx 容器的 80 端口上

docker -run -d -p 80:80 nginx

直接访问本地的 HTTP 80 端口就是 Docker 容器 nginx 提供的服务了

docker-for-mac-ports

这个困扰我许久的麻烦事终于得到了解决, 这是坚定我开发环境下使用 Docker 的一块基石.

docker ps  查看一下容器

CONTAINER ID    IMAGE      COMMAND                        CREATED           STATUS             PORTS                                              NAMES
e52398c5de91        nginx         "nginx -g 'daemon off"      7 minutes ago     Up 7 minutes     0.0.0.0:80->80/tcp, 443/tcp     serene_jones

对于现在的 Docker for Mac, 我们可以用 ps -ef|grep docker 来看看它相关的进程信息

➜ ~ ps -ef|grep docker
 0 3524 1 0 11:25PM ?? 0:00.01 /Library/PrivilegedHelperTools/com.docker.vmnetd
 501 3529 3512 0 11:25PM ?? 0:00.08 /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0
 501 3532 3529 0 11:25PM ?? 0:00.09 /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0
 501 3533 3529 0 11:25PM ?? 0:04.75 com.docker.db --url=file:///Users/Yanbin/Library/Containers/com.docker.docker/Data/s40 --git /Users/Yanbin/Library/Containers/com.docker.docker/Data/database
 501 3545 3529 0 11:25PM ?? 0:00.42 com.docker.osxfs --address fd:3 --connect /Users/Yanbin/Library/Containers/com.docker.docker/Data/@connect --volume-control fd:4 --path /
 501 3546 3529 0 11:25PM ?? 0:05.18 com.docker.slirp --db /Users/Yanbin/Library/Containers/com.docker.docker/Data/s40 --socket fd:3 --port-control fd:4 --vsock-path /Users/Yanbin/Library/Containers/com.docker.docker/Data/@connect
 501 3547 3529 0 11:25PM ?? 0:02.03 com.docker.backend
 501 3548 3529 0 11:25PM ?? 0:00.78 com.docker.driver.amd64-linux -db /Users/Yanbin/Library/Containers/com.docker.docker/Data/s40 -osxfs-volume /Users/Yanbin/Library/Containers/com.docker.docker/Data/s30 -slirp /Users/Yanbin/Library/Containers/com.docker.docker/Data/s50 -vmnet /var/tmp/com.docker.vmnetd.socket -port /Users/Yanbin/Library/Containers/com.docker.docker/Data/s51 -vsock /Users/Yanbin/Library/Containers/com.docker.docker/Data -docker /Users/Yanbin/Library/Containers/com.docker.docker/Data/s60 -addr fd:3 -debug
 501 3549 3547 0 11:25PM ?? 0:00.02 /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux
 501 3550 3548 0 11:25PM ?? 0:00.08 /Applications/Docker.app/Contents/MacOS/com.docker.driver.amd64-linux -db /Users/Yanbin/Library/Containers/com.docker.docker/Data/s40 -osxfs-volume /Users/Yanbin/Library/Containers/com.docker.docker/Data/s30 -slirp /Users/Yanbin/Library/Containers/com.docker.docker/Data/s50 -vmnet /var/tmp/com.docker.vmnetd.socket -port /Users/Yanbin/Library/Containers/com.docker.docker/Data/s51 -vsock /Users/Yanbin/Library/Containers/com.docker.docker/Data -docker /Users/Yanbin/Library/Containers/com.docker.docker/Data/s60 -addr fd:3 -debug
 501 3551 3548 0 11:25PM ?? 1:38.56 /Applications/Docker.app/Contents/MacOS/com.docker.hyperkit -A -m 2G -c 2 -u -s 0:0,hostbridge -s 31,lpc -s 2:0,virtio-vpnkit,uuid=53d7e408-aef2-4b2b-bc4c-0431075e14b7,path=/Users/Yanbin/Library/Containers/com.docker.docker/Data/s50,macfile=/Users/Yanbin/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/mac.0 -s 3,virtio-blk,file:///Users/Yanbin/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2,format=qcow -s 4,virtio-9p,path=/Users/Yanbin/Library/Containers/com.docker.docker/Data/s40,tag=db -s 5,virtio-rnd -s 6,virtio-9p,path=/Users/Yanbin/Library/Containers/com.docker.docker/Data/s51,tag=port -s 7,virtio-sock,guest_cid=3,path=/Users/Yanbin/Library/Containers/com.docker.docker/Data,guest_forwards=2376;1525 -l com1,autopty=/Users/Yanbin/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty,log=/Users/Yanbin/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/console-ring -f kexec,/Applications/Docker.app/Contents/Resources/moby/vmlinuz64,/Applications/Docker.app/Contents/Resources/moby/initrd.img,earlyprintk=serial console=ttyS0 com.docker.driverDir="/Users/Yanbin/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux", com.docker.database="com.docker.driver.amd64-linux" ntp=gateway -F /Users/Yanbin/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/hypervisor.pid
 501 8416 3512 0 1:06AM ?? 0:00.01 /Applications/Docker.app/Contents/Resources/bin/com.docker.frontend {"action":"vmstateevent","args":{"vmstate":"running"}}
 501 8417 8416 0 1:06AM ?? 0:00.01 /Applications/Docker.app/Contents/Resources/bin/com.docker.frontend {"action":"vmstateevent","args":{"vmstate":"running"}}
 501 5807 3788 0 12:30AM ttys004 0:00.15 docker run -it -p 80:80 nginx sh
 501 8425 8138 0 1:06AM ttys006 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn docker

"docker-machine" 的信息暗含在进程参数中了.


我是卸载了原来的 docker, docker-machine 后安装的 Docker for Mac, 运行命令 docker 命令出现如下错误

Client:
 Version:      1.12.0-rc2
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   906eacd
 Built:        Fri Jun 17 20:35:33 2016
 OS/Arch:      darwin/amd64
 Experimental: true
Error response from daemon: client is newer than server (client API version: 1.24, server API version: 1.22)

检查了新安装的 docker, docker-machine 都是链接到 ~/Library/Group Containers/group.com.docker/bin 下的 docker, docker-machine 的, 并不是原来 brew 安装的 docker, docker-machine.

解决办法是升级 docker-machine, 需要执行命令

docker-machine upgrade

Waiting for SSH to be available...
Detecting the provisioner...
Upgrading docker...
Stopping machine to do the upgrade...
Upgrading machine "default"...
Default Boot2Docker ISO is out-of-date, downloading the latest release...
Latest release for github.com/boot2docker/boot2docker is v1.12.0-rc2
Downloading /Users/uqiu/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v1.12.0-rc2/boot2docker.iso...
0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Copying /Users/uqiu/.docker/machine/cache/boot2docker.iso to /Users/uqiu/.docker/machine/machines/default/boot2docker.iso...
Starting machine back up...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
Restarting docker...

我觉得应该是安装 Docker for Mac  时选择了拷贝原来的 boot2docker 的原因, Boot2Docker ISO is out-of-date.

参考: 1. Docker for Mac 初体验
          2. Mac OS X 上基于 FreeBSD/bhyve 的虚拟技术  xhyve
          3. Inside Docker for OS X i/ii

类别: Linux/Unix. 标签: . 阅读(137). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz