Docker Machine 是 Docker 官方提供的一个工具,它能够帮助咱们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker。咱们还能够经过 docker-machine 命令来管理这些虚拟机和 Docker。下面是来自 Docker Machine 官方文档的一张图,很形象哦!git
本文将经过一系列 demo 来展现 Docker Machine 的主要使用场景。github
安装 Docker Machine 前请先在本地安装 Docker。docker
Docker Machine 的安装十分简单,在 Ubuntu 中直接把可执行文件下载到本地就能够了。服务器
$ curl -L https://github.com/docker/machine/releases/download/v0.12.0/docker-machine-`uname -s`-`uname -m` > /tmp/docker-machine $ chmod +x /tmp/docker-machine $ sudo mv /tmp/docker-machine /usr/local/bin/docker-machine
其中 v0.12.0 是最新的版本。固然 Docker Machine 是个开源项目,你能够选择安装不一样的版本,或者是自行编译。下图为笔者安装以后显示的版本信息:并发
若是咱们有多台 Ubuntu 主机都须要安装 Docker,怎么办呢?是否是一个个登陆上去经过 apt-get 命令安装呢?固然不须要,经过 docker-machine 命令咱们能够轻松的在远程主机上安装 Docker。ssh
在使用 docker-machine 进行远程安装前咱们须要作一些准备工做:
1. 在目标主机上建立一个用户并加入sudo 组
2. 为该用户设置 sudo 操做不须要输入密码
3. 把本地用户的 ssh public key 添加到目标主机上curl
好比咱们要在远程主机上添加一个名为 nick 的用户并加入 sudo 组:工具
$ sudo adduser nick $ sudo usermod -a -G sudo nick
而后设置 sudo 操做不须要输入密码:url
$ sudo visudo
把下面一行内容添加到文档的最后并保存文件:spa
nick ALL=(ALL:ALL) NOPASSWD: ALL
最后把本地用户的 ssh public key 添加到目标主机上:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub nick@xxx.xxx.xxx.xxx
这几步操做的主要目的是得到足够的权限能够远程的操做目标主机。
在本地运行下面的命令:
$ docker-machine create -d generic \ --generic-ip-address=xxx.xxx.xxx.xxx \ --generic-ssh-user=nick \ --generic-ssh-key ~/.ssh/id_rsa \ krdevdb
注意,create 命令本是要建立虚拟主机并安装 Docker,由于本例中的目标主机已经存在,因此仅安装 Docker。-d 是 --driver 的简写形式,主要用来指定使用什么驱动程序来建立目标主机。Docker Machine 支持在云服务器上建立主机,就是靠使用不一样的驱动来实现了。本例中使用 generic 就能够了。接下来以 --generic 开头的三个参数主要是指定操做的目标主机和使用的帐户。最后一个参数 krdevdb 是虚拟机的名称,Docker Machine 会用它来设置目标主机的名称。
好了,就这么简单!通过简短的等待 Docker 就在目标机器上安装成功了:
咱们能够经过 Docker Machine 的 ls 命令查看当前可管理的主机列表:
其中的 krdevdb 主机就是刚才咱们安装了 Docker 的主机,最后一列显示了安装的 Docker 版本:v17.05.0-ce。
而后执行 eval $(docker-machine env krdevdb) 命令,就能够经过本地的客户端操做远程主机上的 Docker daemon 了。执行 docker version 命令看看:
请注意上图中的 Client 和 Server 版本不同,这也说明了咱们正在使用本地的 Client 链接远程的 Server。
在实际使用中咱们通常会在物理机上安装 vSphere 等虚拟机管理软件,并称之为虚拟机 host。而后经过 vSphere 工具安装虚拟机进行使用。接下来咱们将介绍如何在本地的一台安装了 vSphere 的虚拟机 host 上安装带有 Docker 的虚拟机。直接上命令:
$ docker-machine create \ --driver vmwarevsphere \ --vmwarevsphere-vcenter=xxx.xxx.xxx.xxx \ --vmwarevsphere-username=root \ --vmwarevsphere-password=12345678 \ --vmwarevsphere-cpu-count=1 \ --vmwarevsphere-memory-size=512 \ --vmwarevsphere-disk-size=10240 \ testvm
解释一下比较重要的参数:
--driver vmwarevsphere
咱们的虚拟机 host 上安装的是 vmware 的产品 vSphere,所以须要给 Docker Machine 提供对应的驱动,这样才可以在上面安装新的虚拟机。
--vmwarevsphere-vcenter=xxx.xxx.xxx.xxx \
--vmwarevsphere-username=root \
--vmwarevsphere-password=12345678 \
上面三行分别指定了虚拟机 host 的 IP 地址、用户名和密码。
--vmwarevsphere-cpu-count=1 \
--vmwarevsphere-memory-size=512 \
--vmwarevsphere-disk-size=10240 \
上面三行则分别指定了新建立的虚拟机占用的 cpu、内存和磁盘资源。
testvm
最后一个参数则是新建虚拟机的名称。
很快虚拟机的建立就完成了。先在 vSphere 的客户端中看一下:
名为 testvm 的虚拟机已经在运行了。
再执行 docker-machine ls 命令看看:
已经能够看到 testvm了,而且它的 DRIVER 显示为 vmwarevsphere。
这就搞定了吗?
好像哪里不对呀!是的,平时咱们手动建立虚机时最重要的东西是什么?是安装虚拟机的镜像啊!但这里咱们并无指定相关的东西,那么docker-machine 究竟给咱们安装了一个什么系统?在使用 vmwarevsphere 驱动安装虚机时,咱们不能指定本身喜欢的虚机镜像(多是 Docker Machine 尚未准备好)。默认使用一个叫作 boot2docker 的虚拟机镜像,这个东西很是小,只有几十兆,所以安装会很快。
Docker 一直是以客户端和服务器的模式运行的,只不过起初的版本是经过同一个二进制文件 docker 来启动服务器端 daemon 和客户端的。在近期的版本中,服务端的可执行文件已经和客户端的可执行文件分离开了。查看 /usr/bin 目录下的可执行文件:
其中 dockerd 就是执行服务器端任务的可执行文件。而咱们平时执行本机 docker 任务则主要经过 docker 这个客户端命令给本机的服务器端发送任务。
那么本地的客户端可不能够链接并发送任务给远程的 Docker 服务器端呢?固然是能够的,只不过咱们手动设置起来稍微麻烦一些。不过不要紧,Docker Machine 都为咱们作好了!下面就让咱们看看如何经过本地的 Docker 客户端在 krdevdb 这台主机上运行容器:
$ docker-machine env krdevdb
这个命令输出的内容能够做为命令来设置一些 Docker 客户端使用的环境变量,从而让本机的 Docker 客户端能够与远程的 Docker 服务器通讯。按照上面的提示执行命令:
$ eval $( docker-machine env krdevdb)
好了,在当前的命令行终端中,接下来运行的 docker 命令操做的都是远程主机 krdevdb 上的 Docker daemon。为了区分本机的 Docker daemon 操做,咱们从新启动一个新的命令行终端,而后分别执行 docker ps 命令:
从上图中能够明显的看出本地主机和远程主机上分别运行着不一样的容器。
除了运行基本的 docker 命令,Docker Machine 还可以管理远程的 Docker 主机。好比咱们能够经过 start, stop, restart 命令分别启动、关闭和重启远程的 Docker daemon。这里的状况稍微复杂一些,只有支持这些命令的驱动才能完成相关的操做。好比,咱们分别关闭 krdevdb 和 testvm:
前一个提示 generic 驱动不支持 stop 命令。而 testvm 是经过 vmwarevsphere 驱动安装的,因此成功的执行了 stop。
对于远程管理来讲,SSH 的支持是必不可少的!Docker Machine 固然也尽职尽责的完成了任务:
$ docker-machine ssh krdevdb
执行上面的命令就能够了。注意,这个命令可不会提示你输入密码,固然更不会让你去配置 SSH 秘钥什么的,由于 Docker Machine 私下全把脏活累活干完了。
Docker Machine 的目的是简化 Docker 的安装和远程管理。从本文的内容咱们也能够看到,Docker Machine 确实为咱们使用和管理 Docker 带来了不少的便利。至于有待提升的方面,如今 Docker Machine 会安装最新版本的 Docker,笔者以为若是可以支持指定安装 Docker 的版本就行了!