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=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 一直是以客户端和服务器的模式运行的,只不过起初的版本是通过同一个二进制文件 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 的版本就好了!

原文地址:http://www.cnblogs.com/sparkdev/p/7044950.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#基础知识详解之【字段与属性】

讲理论知识之前,先看一段代码:public class Emp {//字段private int age;//属性public int Age{get { return age; }set { age value; }} }大家可以看到上面实例代码中,声明了一个名为age的字段,还有一个名为Age的属性&#xff0…

JavaFX UI控件教程(十二)之List View

翻译自 List View 在本章中,您将学习如何在JavaFX应用程序中创建列表。 该ListView级代表项目的滚动列表。图11-1显示了酒店预订系统中可用住宿类型的列表。 图11-1简单列表视图 您可以通过使用该setItems方法定义其项目来填充列表。您还可以通过应用setCellFact…

MyBatis中多表查询(业务代码方式)

业务代码的方式 (实现的方式,书写业务逻辑的java代码实现) ------查询学生所在班级的信息 (一对一查询) 1、先把所有学生查询出来(clazzno) select* from student 2、拿着clazzno去clazz表中查询班级的信息 select * f…

ssl1010-方格取数

这道题曾经是提高组的第四题&#xff0c;但是毕竟书上有&#xff0c;所以emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm&#xff0c;QAQ。 Description   设有N*N的方格图(N<10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示&#xff08;见样例&#xf…

《走遍中国》珍藏版(十四)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");不管你是漫…

.net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(二)

依据Partition和Consumer的Rebalance策略&#xff0c;找到Kafka.Client Rebalance代码块&#xff0c;还原本地环境&#xff0c;跟踪调试&#xff0c;发现自定义Consumer Group 的Consumer并没有分配到PartionID,如下图、 frameborder"0" scrolling"no" sty…

JavaFX UI控件教程(十三)之Table View

翻译自 Table View 在本章中&#xff0c;您将学习如何使用JavaFX应用程序中的表执行基本操作&#xff0c;例如添加表&#xff0c;使用数据填充表以及编辑表行。 JavaFX SDK API中的几个类旨在以表格形式表示数据。用于创建JavaFX应用程序表中的最重要的类是TableView&#x…

【洛谷P1108】低价购买【dp练习】

题目 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则。要想被认为是伟大的投资者&#xff0c;你必须遵循以下的问题建议:“低价购买&#xff1b;再低价购买”。每次你购买一支股票,你必须用低于你上次购买它的价格购买它。买的次数越多越好!你的目标是在遵循以上建议…

MyBatis中多表查询(N+1方式)

N1查询方式 [1]什么是N1的查询方式 如果没有N1的方式我们想要实现多表的查询&#xff0c;自己书写查询的业务逻辑代码&#xff08;java&#xff09; mybatis希望通过自己标签配置的方式来解决这个问题 [2]执行的操作 查询学生所在班级的信息&#xff08;一对一&#xff09; 查询…

Boostrap技能点整理之【bootstrap简介】

bootstrap&#xff0c;目前市面上最受欢迎HTML、CSS、JavaScript框架&#xff0c;用于开发响应式布局、移动设备优先的 WEB 项目。从今天起&#xff0c;我们就开始整理bootstrap的相关技能点。1什么是 Bootstrap呢&#xff1f;Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架&…

基于模型设计方法在机器人控制系统中的应用

基于模型的设计方法在机器人控制系统中广泛应用&#xff0c;它利用机器人的动力学模型和运动学模型进行控制系统设计和性能优化。以下是基于模型设计方法在机器人控制系统中的一些常见应用&#xff1a; 1. 控制器设计与参数调整&#xff1a; 通过建立机器人的动力学模型&#x…

asp.net core mvc中如何把二级域名绑定到特定的控制器上

由于公司的工作安排&#xff0c;一直在研究其他技术&#xff0c;所以一直没时间更新博客&#xff0c;今天终于可以停下手头的事情&#xff0c;写一些新内容了。 应用场景&#xff1a;企业门户网站会根据内容不同&#xff0c;设置不同的板块&#xff0c;如新浪有体育&#xff0c…

质数的概念

质数&#xff1a;素数&#xff0c;只能被1和它本身整除的自然数。–>从2开始&#xff0c;到这个数-1结束为止&#xff0c;都不能被这个数本身整除。 最小的质数是&#xff1a;2

ssl1203-书的复制【dp】

题目 现在要把m本有顺序的书分给k个人复制&#xff08;抄写&#xff09;&#xff0c;每个人的抄写速度都一样&#xff0c;一本书不允许分给两个或两个以上的人抄写&#xff0c;分给每个人的书&#xff0c;必须是连续的&#xff0c;比如不能把第一、第三、第四本书给同一个人抄…

Boostrap技能点整理之【网格系统】

今天我们来串串bootstrap总的网格系统&#xff0c;说到网格系统&#xff0c;依稀记得当时教程上不叫网格&#xff0c;而叫栅格&#xff0c;我总觉得这个栅(shān )读起来不得劲&#xff0c;就读他的另一个音&#xff0c;栅&#xff08;zh&#xff09;格&#xff0c;每次遇到就读…

JavaFX UI控件教程(十四)之Tree View

翻译自 Tree View 在本章中&#xff0c;您将学习如何在JavaFX应用程序中构建树结构&#xff0c;向树视图添加项&#xff0c;处理事件以及通过实现和应用单元工厂来自定义树单元。 包的TreeView类javafx.scene.control提供了层次结构的视图。在每个树中&#xff0c;层次结构…

MyBatis中多表查询(多表查询语句实现)重点

–查询所有学生所在班级的信息&#xff08;一对一&#xff09; –班级查询学生的操作&#xff08;一对多&#xff09; –遇到的问题&#xff1a; 查询的SQL语句非常的简单&#xff0c;但是如何把查询的数据接受这个就是一个问题 [1]把每一个实体中的字段拿出来组建成一个新的实…

ASP.NET Core 指定环境发布(hosting environment)

ASP.NET Core 应用程序发布命令&#xff1a; dotnet publish [<PROJECT>] [-f|--framework] [-r|--runtime] [-o|--output] [-c|--configuration] [--version-suffix] [-v|--verbosity] [-h|--help] 发布示例命令&#xff08;生成在bin/release/netcoreapp1.1/publish目…

ssl1626-花店橱窗布置【日常dp】

Description 假设你想以最美观的方式布置花店的橱窗。你有F束花&#xff0c;每束花的品种都不一样&#xff0c;同时&#xff0c;你至少有同样数量的花瓶&#xff0c;被按顺序摆成一行。花瓶的位置是固定的&#xff0c;并从左至右&#xff0c;从1至V顺序编号&#xff0c;V是花瓶…