Docker Machine 详解

笔者在《Docker Machine 简介》一文中简单介绍了 Docker Machine 及其基本用法,但是忽略的细节实在是太多了。比如 Docker 与 Docker Machine 的区别?又如当我们执行 docker-machine create 命令时,Docker Machine 都做了哪些重要的事情使得我们可以远程操作 Docker daemon?这样的远程操作安全吗?本文将试图解读这些问题。注:本文的演示环境为 Ubuntu16.04。

Docker 与 Docker Machine 的区别

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

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

Docker daemon

一套与 Docker daemon 交互的 REST API

一个命令行客户端

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

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

Docker daemon socket

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

Unix socket

Systemd socket activation

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 会在您指定的主机上执行下面的操作:

安装 Docker,并进行配置。

生成证书保护 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 验证功能。

关于 TLS,笔者在《局域网内部署 Docker Registry》一文中略有涉及,当时是手动配置的证书,感兴趣的朋友可以参考一下。

http://www.cnblogs.com/sparkdev/p/6890995.html

现在让我们回到安装了 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入门吐血总结

Docker 基础 : 数据管理

非常详尽的 Shiro 架构解析!

SpringBoot 应用部署于外置 Tomcat 容器

作者:sparkdev

来源:https://www.cnblogs.com/sparkdev/p/7066789.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容