89ou 发表于 2019-2-22 06:51:53

16、《每天5分钟玩转Docker容器技术》学习--Docker-machine部署docke

  ------------------------------------重要说明------------------------------------
  本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
  原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
  https://blog.运维网.com/cloudman
  ------------------------------------重要说明------------------------------------
  前面的实验环境中只有一个 docker host所有的容器都是运行在这一个 host 上的。但在真正的环境中会有多个 host容器在这些 host 中启动、运行、停止和销毁相关容器会通过网络相互通信无论它们是否位于相同的 host。
  对于这样一个 multi-host 环境我们将如何高效地进行管理呢
  我们面临的第一个问题是为所有的 host 安装和配置 docker。
  手工安装了第一个 docker host步骤包括
  1.安装 https CA 证书
  2.添加 GPG key
  3.添加 docker apt 源
  4.安装 docker
  可见步骤还是挺多的对于多主机环境手工方式效率低且不容易保证一致性针对这个问题docker 给出的解决方案是 Docker Machine。
  用 Docker Machine 可以批量安装和配置 docker host这个 host 可以是本地的虚拟机、物理机也可以是公有云中的云主机。
  Docker Machine 支持在不同的环境下安装配置 docker host包括
  1.常规 Linux 操作系统
  2.虚拟化平台 - VirtualBox、VMWare、Hyper-V
  3.OpenStack
  4.公有云 - Amazon Web Services、Microsoft Azure、Google Compute Engine、Digital Ocean 等
  Docker Machine 为这些环境起了一个统一的名字provider。
  对于某个特定的 providerDocker Machine 使用相应的 driver 安装和配置 docker host如下图所示
https://s1.运维网.com/images/20180412/1523513377576109.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
1. Docker machine介绍
https://s1.运维网.com/images/20180412/1523513408164742.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
a) What is Docker Machine?
https://s1.运维网.com/images/20180412/1523513423404954.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
b) Why should I use it?
https://s1.运维网.com/images/20180412/1523513443829909.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513454546326.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
c) What’s the difference between Docker Engine and Docker Machine?
https://s1.运维网.com/images/20180412/1523513466183242.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513501486386.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513544187367.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513560166923.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513567232129.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
2. Docker Machine环境准备
  实验环境中有三个运行 Ubuntu 的 host。
  l Docker machine(Ubuntu01) 192.168.56.129
https://s1.运维网.com/images/20180412/1523513627222995.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  l Docker host(Ubuntu02) 192.168.56.130
https://s1.运维网.com/images/20180412/1523513637189762.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  l Docker host(Ubuntu03) 192.168.56.128
https://s1.运维网.com/images/20180412/1523513648453137.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  我们将在 192.168.56.129 上安装 Docker Machine然后通过 docker-machine 命令在其他两个 host 上部署 docker。
3. 安装 Docker Machine
  官方安装文档在 https://docs.docker.com/machine/install-machine/
https://s1.运维网.com/images/20180412/1523513704211401.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  具体参考官方文档。这里使用Linux版本
  curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
  chmod +x /tmp/docker-machine &&
  sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
  下载的执行文件被放到 /usr/local/bin 中执行docker-mahine version 验证命令是否可用
https://s1.运维网.com/images/20180412/1523513721470040.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  注当你看到这篇文章的时候Docker Machine 应该有了更新的版本可参考官方文档进行安装。
  为了得到更好的体验我们可以安装 bash completion script这样在 bash 能够通过 tab 键补全 docker-mahine 的子命令和参数。安装方法是从https://github.com/docker/machine/tree/master/contrib/completion/bash下载 completion script
https://s1.运维网.com/images/20180412/1523513738139983.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  将其放置到 /etc/bash_completion.d 目录下。
https://s1.运维网.com/images/20180412/1523513764992022.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  然后将如下代码添加到$HOME/.bashrc
  #vim ~/.bashr
  source /etc/bash_completion.d/docker-machine-wrapper.bash
  source /etc/bash_completion.d/docker-machine-prompt.bash
  source /etc/bash_completion.d/docker-machine.bash
  PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
  # source ~/.bashrc
  通过测试来验证是否可以补全
https://s1.运维网.com/images/20180412/1523513777819146.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
4. 创建 Machine
  对于 Docker Machine 来说术语 Machine 就是运行 docker daemon 的主机。“创建 Machine” 指的就是在 host 上安装和部署 docker。先执行 docker-machine ls 查看一下当前的 machine
https://s1.运维网.com/images/20180412/1523513786406924.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  如我们所料当前还没有 machine接下来我们创建第一个 machine host1 - 192.168.56.130。
  创建 machine 要求能够无密码登录远程主机(192.168.56.130和192.168.56.128),ubuntu默认没有安装ssh服务,你可以通过:apt-get install -y openssh-server,默认sshd是不允许root用户直接登录的,是root可以ssh直接登录:1、更改root用户密码 2、vi /etc/ssh/sshd_config中更改如下字段PermitRootLogin yes
https://s1.运维网.com/images/20180412/1523513800784230.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513811153210.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513819946979.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
a) Docker machine创建docker02
  一切准备就绪执行 docker-machine create 命令创建 docker02
  docker-machine create --driver generic --generic-ip-address=192.168.56.130 docker02
  --drive 表示部署docker的主机是什么类型
https://s1.运维网.com/images/20180412/1523513829499577.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  因为我们是在普通的 Linux 中部署 docker所以使用 generic driver其他 driver 可以参考文档 https://docs.docker.com/machine/drivers/。
  --generic-ip-address 指定目标系统的 IP并且系统名为 docker02。
https://s1.运维网.com/images/20180412/1523513840660497.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  注意:可以看到如下报错,会一直刷新,报错说明sudo docker version找不到命令,不要关闭次窗口!!!如果你结束了此进程,按照如下操作进行:
  Docker-machine ls
https://s1.运维网.com/images/20180412/1523513849856706.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  Docker-machein rm docker02
https://s1.运维网.com/images/20180412/1523513858143339.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  再去执行创建machine的设备命令!!!应该又会回到无限循环报错的情况,按照如下操作进行
  去docker02这台设备运行docker version命令看看有什么报错
https://s1.运维网.com/images/20180412/1523513867152663.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513873651507.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  安装完成之后再去docker machine设备上查看。
https://s1.运维网.com/images/20180412/1523513882254165.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  可以看到操作正常了。
  ① 通过 ssh 登录到远程主机。
  ② 安装 docker。
  ③ 拷贝证书。
  ④ 配置 docker daemon。
  ⑤ 启动 docker。
  再次执行 docker-machine ls
https://s1.运维网.com/images/20180412/1523513894981331.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  已经能看到 docker02 了。 我们可以登录到 docker02 查看 docker daemon 的具体配置 :
  cat /etc/systemd/system/docker.service没有这个目录
  cat /etc/systemd/system/docker.service.d/10-machine.conf
https://s1.运维网.com/images/20180412/1523513902910295.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  -H tcp://0.0.0.0:2376 使 docker daemon 接受远程连接。
  --tls* 对远程连接启用安全认证和加密。
b) 使用同样的方法创建 docker03
https://s1.运维网.com/images/20180412/1523513914493104.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  创建成功后 docker-machine ls 可以看到 docker02 和 docker03 都已经就绪.
https://s1.运维网.com/images/20180412/1523513925497929.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境。除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理。其中最常用的就是无需登录到 machine 就能执行 docker 相关操作。
  我们前面学过,要执行远程 docker 命令我们需要通过 -H 指定目标主机的连接字符串,比如:
  docker -H tcp://192.168.56.105:2376 ps
5. Docker-machine操作
a) docker-machine env
  Docker Machine 则让这个过程更简单。docker-machine env docker02显示访问 docker02 需要的所有环境变量:
https://s1.运维网.com/images/20180412/1523513934876458.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  根据提示,执行 eval $(docker-machine env docker02):
https://s1.运维网.com/images/20180412/1523513942406133.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  然后,就可以看到命令行提示符已经变了,其原因是我们之前在$HOME/.bashrc 中配置了 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ ',用于显示当前 docker host。
  在此状态下执行的所有 docker 命令其效果都相当于在 docker02 上执行,例如启动一个 busybox 容器:
https://s1.运维网.com/images/20180412/1523513951847318.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  发现docker命令无法使用,提示需要安装docker.io
https://s1.运维网.com/images/20180412/1523513960327643.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  再次执行docker命令
https://s1.运维网.com/images/20180412/1523513980130895.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513987695472.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523513994440351.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523514005547326.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  l 在docker02上验证是否正常
https://s1.运维网.com/images/20180412/1523514015126363.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523514021713517.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
b) docker-machine upgrade
  docker-machine upgrade 更新 machine 的 docker 到最新版本,可以批量执行:
https://s1.运维网.com/images/20180412/1523514037412772.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
c) docker-machine config
  docker-machine config 查看 machine 的 docker daemon 配置
https://s1.运维网.com/images/20180412/1523514045920971.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  stop/start/restart 是对 machine 的操作系统操作,而 不是 stop/start/restart docker daemon。
  docker-machine scp 可以在不同 machine 之间拷贝文件,比如:
  docker-machine scp docker02:/tmp/a docker03:/tmp/b
  可见,在多主机环境下 Docker Machine 可以大大提高效率,而且操作也很简单,希望大家都能掌握。
  ------------------------------------重要说明------------------------------------
  本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
  原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
  https://blog.运维网.com/cloudman
  ------------------------------------重要说明------------------------------------
  书籍:
  1.《每天5分钟玩转Kubernetes》
  https://item.jd.com/26225745440.html
  2.《每天5分钟玩转Docker容器技术》
  https://item.jd.com/16936307278.html
  3.《每天5分钟玩转OpenStack》
  https://item.jd.com/12086376.html
https://i.imgsafe.org/68/68da21ce15.png

页: [1]
查看完整版本: 16、《每天5分钟玩转Docker容器技术》学习--Docker-machine部署docke