伴随着 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 目录,
之后可在 Launchpad 找到 Docker, 或通过 Spotlight Search 找到它并启动, 第一次启动时会要求授权进行一些初始化设置:
创建如下面的执行文件链接
1 2 3 4 |
/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 的链接指向是下面那样子的
1 2 |
/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 的命令和以前也差不多. 虽然提供了 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 端口上
1 |
docker -run -d -p 80:80 nginx |
直接访问本地的 HTTP 80 端口就是 Docker 容器 nginx 提供的服务了
这个困扰我许久的麻烦事终于得到了解决, 这是坚定我开发环境下使用 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
来看看它相关的进程信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
➜ ~ 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, 需要执行命令
1 |
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/yanbin/.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/yanbin/.docker/machine/cache/boot2docker.iso to /Users/yanbin/.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
本文链接 https://yanbin.blog/docker-for-mac-public-beta/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。