将主机纳入Docker-Machine的管理

目录

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上创建主机,比如VirtualBox、 Digital Ocean、Microsoft Azure,然后在创建的主机上安装Docker。

Docker Machine通过不同的driver,可以在不同的平台上创建主机,包括各种公有云、私有云及虚拟机等。本文主要是通过Docker Machine提供的Generic driver,来将已有的主机通过ssh纳入其管理,这在使用某个Docker Machine并不支持的云供应商时非常有用。
另外,也可以通过Docker Machine Generic driver提供的功能,来将Docker的远程API进行TLS加密。在文章使用TLS加密Docker的API中,我们通过OpenSSL软件包,来生成TLS通讯所需的证书、秘钥等文件,然后在启动docker daemon时通过指定tls相关的启动参数,来将docker daemon安全地开放到网络上。Docker Machine将此过程全部自动化,简化了操作过程。

这个过程是怎样实现的呢?

  • 首先,Docker Machine通过ssh连接到主机上;探测主机使用的操作系统(是Ubuntu还是CentOS)及进程管理器(是init、upstart或systemd)。
  • 其次,在该主机上检查是否已经安装了Docker引擎。如果没有安装则进行安装,如果已经安装则检查是否需要进行版本升级。
  • 最后,它生成TLS通信所需的各种证书,并配置Docker引擎使用这些证书,并重启Docker引擎。

下面实践一下这个过程,使用的环境如下:
centos7 192.168.71.131 Docker-machine所在主机
centos7-A 192.168.71.167
centos7-B 192.168.71.168

我们想要在centos7主机上通过docker-machine命令连接到另外两台主机的docker引擎上。

  1. 需要配置centos7到两台主机的无密码ssh登录。可以通过ssh-keygen、ssh-copy-id等命令实现,可以参考这里
  2. 如果配置无密码登录的用户不是root用户的话,还需要在A、B主机上实现普通用户的无密码sudo权限。只要在/etc/sudoers文件中加入一行yangdong ALL=(ALL) NOPASSWD: ALL即可(用你自己的用户名替换最前面的yangdong)。
  3. 在centos7主机上执行如下两条命令:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    [yangdong@centos7 ~]$ docker-machine create \
    > --driver generic \
    > --generic-ip-address=192.168.71.167 \
    > --generic-ssh-user yangdong \
    > --generic-ssh-key ~/.ssh/id_rsa \
    > centos7-A
    Running pre-create checks...
    Creating machine...
    (centos7-B) Importing SSH key...
    Waiting for machine to be running, this may take a few minutes...
    Detecting operating system of created instance...
    Waiting for SSH to be available...
    Detecting the provisioner...
    Provisioning with centos...
    Copying certs to the local machine directory...
    Copying certs to the remote machine...
    Setting Docker configuration on the remote daemon...
    Checking connection to Docker...
    Docker is up and running!
    To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env centos7-A
    [yangdong@centos7 ~]$ docker-machine create \
    > --driver generic \
    > --generic-ip-address=192.168.71.168 \
    > --generic-ssh-user yangdong \
    > --generic-ssh-key ~/.ssh/id_rsa \
    > centos7-B
    ...

在执行上述命令时,最后docker-machine会通过netstat检查docker所打开的端口,如果缺少这个命令会报错,不过并不影响使用。通过如下命令检查安装是否成功:

[yangdong@centos7 ~]$ docker-machine ls
NAME        ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER    ERRORS
centos7-A   -        generic   Running   tcp://192.168.71.167:2376           v1.12.6   
centos7-B   -        generic   Running   tcp://192.168.71.168:2376           v1.12.6   

这样,两台主机便纳入了docker-machine的管理了,可以通过docker-machine提供的各种命令操作远程的docker引擎了。
关于Generic driver的更详细信息可以参考官方文档