Docker Machine 简介
Docker Machine 是什么?
Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker。我们还可以通过 docker-machine 命令来管理这些虚拟机和 Docker。下面是来自 Docker Machine 官方文档的一张图,很形象哦!

本文将通过一系列 demo 来展示 Docker Machine 的主要使用场景。
安装 Docker Machine
安装 Docker Machine 前请先在本地安装 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 是个开源项目,你可以选择安装不同的版本,或者是自行编译。下图为笔者安装之后显示的版本信息:

在远程主机上安装 Docker
如果我们有多台 Ubuntu 主机都需要安装 Docker,怎么办呢?是不是一个个登录上去通过 apt-get 命令安装呢?当然不需要,通过 docker-machine 命令我们可以轻松的在远程主机上安装 Docker。
前提条件
在使用 docker-machine 进行远程安装前我们需要做一些准备工作:
1. 在目标主机上创建一个用户并加入sudo 组
2. 为该用户设置 sudo 操作不需要输入密码
3. 把本地用户的 ssh public key 添加到目标主机上
比如我们要在远程主机上添加一个名为 nick 的用户并加入 sudo 组:
$ sudo adduser nick
$ sudo usermod -a -G sudo nick
然后设置 sudo 操作不需要输入密码:
$ sudo visudo
把下面一行内容添加到文档的最后并保存文件:
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。
在本地主机上安装带有 Docker 的虚机
在实际使用中我们一般会在物理机上安装 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= \
--vmwarevsphere-memory-size= \
--vmwarevsphere-disk-size= \
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 一直是以客户端和服务器的模式运行的,只不过起初的版本是通过同一个二进制文件 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 daemon
除了运行基本的 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 的版本就好了!
Docker Machine 简介的更多相关文章
- Docker Machine 详解
笔者在<Docker Machine 简介>一文中简单介绍了 Docker Machine 及其基本用法,但是忽略的细节实在是太多了.比如 Docker 与 Docker Machine ...
- 用 Docker Machine 创建 Azure 虚拟主机
搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起.笔者在<Docker Machine 简介>一文中演示了使用 Do ...
- Docker Machine的使用
前面两篇文章(<Asp.Net Core 发布到 Docker(Linux Centos 虚拟机,使用Dockerfile)> <Docker Compose的使用>),简单介 ...
- [第十四篇]——Docker Machine之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker Machine 简介 Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机. Docker Mac ...
- Docker Machine v1.11.2安装与使用
官方文档:Docker Machine 官方文档:Docker Toolbox boot2docker安装包官网下载链接:Docker Toolbox-1.11.1b.exe 此安装包包含的“boot ...
- Docker Machine, Compose, and Swarm: How They Work Together
The three tools are now neatly packaged into what’s called the Docker Toolbox. Docker Machine1/ crea ...
- Docker Machine
Docker Machine http://dockone.io/article/1485?utm_source=tuicool&utm_medium=referral 本地安装与使用 Doc ...
- [Docker] Docker Machine intro
List all the docker machine: docker-machine ls Can check 'ip' and 'status': docker-machine ip defaul ...
- 安装 Docker Machine - 每天5分钟玩转 Docker 容器技术(45)
前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的.但在真正的环境中会有多个 host,容器在这些 host 中启动.运行.停止和销毁,相关容器会通过网络 ...
随机推荐
- 如何在 ASP.NET Core 中发送邮件
前言 我们知道目前 .NET Core 还不支持 SMTP 协议,当我么在使用到发送邮件功能的时候,需要借助于一些第三方组件来达到目的,今天给大家介绍两款开源的邮件发送组件,它们分别是 MailKit ...
- 查询表达式和LINQ to Objects
查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据 ...
- Java学习记录第一章
学习Java第一章的记录,这一章主要记录的是Java的最基础部分的了解知识,了解Java的特性和开发环境还有Java语言的优缺点. 计算机语言的发展大概过程:机器语言--->汇编语言---> ...
- linux 内核的rt_mutex (realtime互斥体)
linux 内核有实时互斥体(锁),名为rt_mutex即realtime mutex.说到realtime一定离不开priority(优先级).所谓实时,就是根据优先级的不同对任务作出不同速度的响应 ...
- O(nlogn)实现LCS与LIS
序: LIS与LCS分别是求一个序列的最长不下降序列序列与两个序列的最长公共子序列. 朴素法都可以以O(n^2)实现. LCS借助LIS实现O(nlogn)的复杂度,而LIS则是通过二分搜索将复杂度从 ...
- 如何将angular-ui的图片轮播组件封装成一个指令
在项目开发中我们经常会遇到图片轮播的功能点: 如果我们开发人员自己原生手写,将会花费很多的时间,最终得不偿失. 接下来就详细说说如何使用angular-ui发热图片轮播模块,并且将它写成一个指令(便于 ...
- Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法
DELIMITER $$ USE `qrsoft_dyj_db`$$ DROP PROCEDURE IF EXISTS `proc_withdraw_approve`$$ CREATE PROCEDU ...
- php的文件引用
最近研究公司代码时发现了set_include_path(dirname(__FILE__));这样一行代码,在网上查了些资料,才把这个方法的作用弄清楚. 首先,dirname(__FILE__)这个 ...
- 并发容器之CopyOnWriteArrayList(转载)
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这 个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改 ...
- 1.各个浏览器内核?经常遇到的浏览器兼容性有哪些?解决办法?常用的hack技巧?
IE: trident内核 Firefox(火狐):gecko内核 Safari(苹果):webkit内核 Opera(欧鹏):以前是presto内核,现在是Blink内核 Chrome:Blink ...