热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

DockerMachine深入详解

这篇文章主要介绍了DockerMachine深入详解,文章总结的很详细,有感兴趣的同学可以研究下

Docker 与 Docker Machine 的区别

Docker 是一个 Client-Server 架构的应用,人家是有官称的:Docker Engine。Docker 只是大家对 Docker Engine 的昵称,当然 Docker 还有其他的意思,比如一家公司的名称。简单起见,本文中的 Docker 等同于 Docker Engine。

提到 Docker 我们必须要知道它包含了三部分内容:

  1. Docker daemon
  2. 一套与 Docker daemon 交互的 REST API
  3. 一个命令行客户端

下图很清晰的展示了它们之间的关系:

Docker Machine 则是一个安装和管理 Docker 的工具。它有自己的命令行工具:docker-machine。

Docker daemon socket

既然 Docker 客户端要和 Docker daemon 通过 REST API 通信,那就让我们看看它们可以采用的方法有哪些:

  1. Unix socket
  2. Systemd socket activation
  3. Tcp

我们可以简单的把 1 和 2 理解成一种方式,就是同一台主机上的进程间通信。至于 3 则很好理解:通过 tcp 协议进行跨网络的通信。

既然 1 和 2 用于同一台机器上的进程间通信,那么我们可以猜想:安装在同一主机上的 Docker 客户端和 Docker daemon 就是通过这种方式来通信的。事实也正是如此,我们可以查看安装 Docker 时默认添加的 Docker daemon 启动配置,打开文件 /etc/systemd/system/multi-user.target.wants/docker.service:

图中的 -H 用来指定 Docker Daemon 监听的 socket,此处指定的类型为 system socket activation。使用类型 1 和 2 进行通信需要进程具有 root 权限。这也是 Docker 安装过程中会自动创建一个具有 root 权限的用户和用户组的主要原因。新创建的用户和用户组名称为 docker,建议大家把需要操作 Docker 的用户都加入到这个组中,否则当你执行命令时就会碰到下图显示的问题:

我们还可以同时指定多个 -H 参数让 Docker daemon 同时监听不同的 socket 类型。比如要添加对 TCP 端口 2376 的监听就可以使用下面的命令行参数:

$ sudo dockerd -H fd:// -H tcp://0.0.0.0:2376

运行上面的命令,然后查看本机监听的端口:

此时我们就可以从远程主机上的 Docker 客户端访问这部主机的 2376 端口了。

DOCKER_HOST 环境变量

Docker 客户端默认的配置是访问本机的 Docker daemon,当你指定了 DOCKER_HOST 变量后,Docker 客户端会访问这个变量中指定的 Docker daemon。让我们回顾一下 docker-machine env 命令:

执行的 $ eval $(docker-machine env krdevdb) 命令就是在设置 DOCKER_HOST 环境变量。

解决安全问题

我们的 Docker daemon 监听了 tcp 端口,糟糕的是此时我们没有做任何的保护措施。因此任何 Docker 客户端都可以通过 tcp 端口与我们的 Docker daemon 交互,这显然是无法接受的。解决方案是同时启用 Docker daemon 和 Docker 客户端的 TLS 证书认证机制。这样 Docker daemon 和 Docker 客户端之间的通信会被加密,并且只有安装了特定证书的客户端才能够与对应的 Docker daemon 交互。

至此本文的铺垫部分终于结束了,接下来我们将讨论 Docker Machine 相关的内容。

Docker Machine create 命令

根据 Docker Machine 驱动的不同,create 命令执行的操作也不太一样,但其中有两步是我们在这里比较关心的:

docker-machine 会在您指定的主机上执行下面的操作:

  1. 安装 Docker,并进行配置。
  2. 生成证书保护 Docker 服务的安全。

配置 Docker daemon

Docker 的安装过程并没有什么秘密,这里不再赘述。我们重点关注 Docker daemon 的配置。仔细观察我们会发现,通过 docker-machine 安装的 Docker 在 /etc/systemd/system 目录下多出了一个 Docker 相关的目录:docker.service.d。这个目录中只有一个文件 10-machine.conf:

好吧,-H tcp://0.0.0.0:2376 出现在这里并没有让我们太吃惊。在我们做了巨多的铺垫之后,你应该觉得这是理所当然才是。--tls 开头的几个参数主要和证书相关,我们会在后面的安全设置中详细的介绍它们。让人多少有些疑惑的地方是上图中的 /usr/bin/docker。当前最新版本的 Docker Machine 还在使用旧的方式设置 Docker daemon,希望在接下来的版本中会有所更新。

这个配置文件至关重要,因为它会覆盖 Docker 默认安装时的配置文件,从而以 Docker Machine 指定的方式启动 Docker daemon。至此我们有了一个可以被远程访问的 Docker daemon。

生成证书

我们在 Docker daemon 的配置文件中看到四个以 --tls 开头的参数,分别是 --tlsverify、--tlscacert、--tlscert和 –tlskey。其中的 --tlsverify 告诉 Docker daemon 需要通过 TLS 来验证远程客户端。其它三个参数分别指定了一个 pem 格式文件的路径,按照它们指定的文件路径去查看一下:

对比一下手动安装的 Docker,会发现 /etc/docker 目录下并没有这三个文件。毫无疑问它们是 Docker Machine 生成的,主要是为了启用 Docker daemon 的 TLS 验证功能。

现在让我们回到安装了 Docker Machine 的主机上。

查看 /home/nick/.docker/machines/krdevdb 目录,发现了一些同名的文件(ca.pem、server-key.pem 和 server.pem),和主机 drdevdb 上的文件对比一下,发现它们是一样的!

让我们再来观察一下这幅图:

除了我们关注过的 DOCKER_HOST,还有另外三个环境变量。其中的 DOCKER_TLS_VERIFY 告诉 Docker 客户端需要启用 TLS 验证。DOCKER_CERT_PATH 则指定了 TLS 验证所依赖文件的目录,这个目录正是我们前面查看的 /home/nick/.docker/machines/krdevdb 目录。

行文至此,困扰我们的安全问题终于得到了解释:Docker Machine 在执行 create 命令的过程中,生成了一系列保证安全性的秘钥和数字证书(*.pem)文件。这些文件在本地和远程 Docker 主机上各存一份,本地的用于配置 Docker 客户端,远程主机上的用于配置 Docker daemon,让两边都设置 TLS 验证的标记,依此实现安全的通信。

总结

从本文的前一部分可以看到,Docker 其实把该提供的都提供了,只是配置起来比较麻烦!但是对用户来说,需要的总是更简单,更容易的配置。因此从使用者的角度来看,Docker Machine 确实很酷,一个命令下去不仅能够安装虚机和 Docker,还完成了很多手动搞起来令人生畏的配置。然后带来几个清晰、简单的命令。再然后,同学们就可以开心愉快的玩耍了!

到此这篇关于Docker Machine深入详解的文章就介绍到这了,更多相关Docker Machine内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 优化版Windows 10 LTSC 21H2企业版:适用于低内存设备
    此版本为经过优化的Windows 10 LTSC 21H2企业版,特别适合低内存配置的计算机。它基于官方版本进行了精简和性能优化,确保在资源有限的情况下依然能够稳定运行。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文探讨了如何在发布 XenApp 应用时,通过命令行参数实现启动时的参数传递。特别介绍了静态和动态参数传递的方法,并详细解释了 ICA 文件中两种参数传递方式的区别及安全检查机制。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文介绍了如何解决Docker在启动过程中遇到的‘无法删除默认桥网络:网桥具有活动端点’的问题,提供了详细的步骤和补充说明。 ... [详细]
author-avatar
可乐16311
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有