您好,登录后才能下订单哦!
今天小编给大家分享一下Docker Machine怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
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》一文中略有涉及,当时是手动配置的证书,感兴趣的朋友可以参考一下。
现在让我们回到安装了 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 Machine怎么应用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。