共计 2110 个字符,预计需要花费 6 分钟才能阅读完成。
解决的问题
- 想要在多台物理实体机或虚拟机,而不是一台机器上构建集群。
- 由于使用 windows10 + VirtualBox,并在 VirtualBox 中安装 linux 系列系统,并卡在文档 ”docker-machine create –driver virtualbox myvm1″ 的读者
搭建环境
搭建时间:2019.8.16
设备系统:windows10
虚拟软件:VirtualBox
虚拟系统:Ubuntu 18.04 LTS
参考博客
感谢以下博客在问题解决中提供的帮助
JerryWangSAP — 错误消息 This computer doesn’t have VT-X/AMD-v enabled
向上的路 — docker 跨主机通信方式四 docker-machine
背景
为什么我会想到要在多台物理实体主机或虚拟机搭建来搭建集群呢?原因有两个:单台设备性能极限以及灾备。第一条原因很好理解,单台设备的算力是有限的。而灾备的考虑点并不是容器内的服务宕机,而是物理范畴的灾备。国内可靠性达到 99.99% 的云服务供应商不时出事的新闻时常会听到,但两个或以上云服务上同时出事的情况呢?
理论分析一下,以 99.99% 作为标准,这个数字乍一看却是有种万无一失的感觉,但实际算下来,一年的宕机时间是:52.56 分钟. 如果将服务同时放在两个供应商上呢?一年里两家云服务供应商同时宕机导致的理论宕机时间为:0.31 秒。当然这只是个理论分析,只是在这种理论下,相同预算时,购买分布在 2 个或多个云服务提供商的主机会不会是一种更好的选择呢?
思路
Docker 文档在 Swarms 部分通过 ”docker-machine create –driver virtualbox myvm1″ 命令宿主系统内创建虚拟节点,但该命令在本就已经是由虚拟机创建的 ubuntu 系统内是无法执行成功的,参见 JerryWang 的 Blog。解决这个问题的方法有很多,更换虚拟机软件、双系统、Mac 等都可行,但受限于某些客观原因,并且想要尝试跨主机构建集群,因此采用了一下解决方案:在 VirtualBox 虚拟出 3 套 ubuntu 系统:A、B、C。其中将 A 等价为教程中的数组操作系统,B、C 等价为教程中宿主操作系统中的两个节点。通过联通 A、B、C 来达到与教程在该处相同的效果,同时也是实现了跨主机集群的搭建。
具体步骤
- 在主机 A 中预先装好 docker(参见官网教程!), B、C 虚拟机只需要安装 ssh 服务器即可。(此处 B、C 可以为云服务供应商的虚拟主机)
-
使用以下指令获取 B、C 虚拟机的 IP 地址。
ifconfig // 若信息过长使用 ifconfig >> output 输出大文件里使用 vim 打开查看
-
B、C 主机配置 ssh 允许直接使用 root 帐号登录:在 /etc/ssh/sshd_config 文件内,添加
PermitRootLogin yes
-
在 A 中执行以下命令生成密钥文件(此步骤开始的所有操作都只需在 A 中完成)
ssh-keygen
-
将公钥复制到 B、C
ssh-copy-id IP
// 执行两次,分别将 IP 替换为 B、C 的 IP
-
使用一下指令验证是否配置成功
ssh IP // 成功后使用 logout 推出登录
-
使用以下指令在 A 中给 B、C 安装 docker。(同时也将建立起 A 与 B、C 的链接)
// docker 文档到此处前并没有要求安装 docker-machine,常见官方文档安装
// 此命令需要执行两次,分别使用 B、C 的 IP,NodeName 官方文档分别命名为了:myvm1、myvm2,此处我命名为 docker1、docker2
docker-machine create -d generic –generic-ip-address=IP NodeName
-
使用以下指令检查连接是否建立完成
docker-machine ls
解释说明
- 以上步骤实现的效果就可以将独立的多台物理主机或位于不同平台的虚拟机实现连接, 同时也等效官方文档以下两条指令,后续可以无缝衔接后续教程内容
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
- 关于 IP,若是同我一样的场景 (拥有固定 IP 的主机和云服务器除外),不推荐去花费时间在局域网内配置静态 IP,因为还需要在 /etv/netplan(ubuntu17.04 以后启用的) 下的配置文件里配置子网掩码、网关以及 DNS 服务器等,很容易出错。花费时间的性价比不高,IP 有可能会发生变化,但从我实际操作来说,晚间完全足够完成练习。
- 为什么需要在 B、C 中修改 ssh 配置文件?由于 ssh 默认不可使用 root 帐号登录,常规流程我们都属使用自己创建的帐号如:ubuntu 登录,再使用 sudo su 切换到 root 帐号,但在该场景下需要需要将此登录方式开启。(毕竟这样我们没有必要再去繁琐的操作节点主机)
后记
最终的效果如下
完成 docker 文档所有 get-star 教程的效果如下
最后推荐一篇 k8s 与 Docker Swarms 对比的文章 Ankit Kumar — Kubernetes vs. Docker Swarm: A Complete Comparison Guide