在单台主机上安装Docker并不困难,当试图在其他主机上管理Docker安装时就比较麻烦了。

Docker Machine主要是一个便利程序。将大量配置外部宿主机的繁琐的指令包装起来,变成一些易于上手的命令。


安装Docker Machine:

[root@localhost ~]# curl -L https://github.com/docker/machine/releases/download/v0.16.1/docker-machine-`uname -s`-`uname -m` > /tmp/docker-machine
    其他操作系统,可以参考:https://github.com/docker/machine/releases
[root@localhost ~]# chmod +x /tmp/docker-machine
[root@localhost ~]# cp /tmp/docker-machine /usr/local/bin/docker-machine


为了演示Docker Machine的用法,可以创建一个上面运行着Docker守护进程的虚拟机。假定选用VirtualBox虚拟机管理器。

安装VirtualBox:

[root@localhost ~]# wget https://download.virtualbox.org/virtualbox/6.0.4/VirtualBox-6.0-6.0.4_128413_el7-1.x86_64.rpm
[root@localhost ~]# yum -y install VirtualBox-6.0-6.0.4_128413_el7-1.x86_64.rpm
[root@localhost ~]# yum -y install gcc make perl kernel kernel-devel
[root@localhost ~]# /sbin/vboxconfig
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.


Docker Machine创建虚拟机需要用到boot2docker.iso文件,首次下载时速度较慢,可以通过其他途径下载:

可以使用迅雷快速下载:https://github.com/boot2docker/boot2docker/releases/download/v18.09.2/boot2docker.iso
下载完成后,将文件添加到/root/.docker/machine/cache/目录下


如果是在VMWare虚拟机里使用docker-machine,需要设置VMWare虚拟机虚拟化引擎(在虚拟机关机状态才能设置),否则创建虚拟机过程会报错:

Error with pre-create check: "This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory"

设置方法如下图,选中“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(V)”复选框:


创建一个正常运行着Docker守护进程的虚拟机,通过--driver参数来指定虚拟机类型:

[root@localhost ~]# docker-machine create --driver virtualbox host1
Running pre-create checks...
Creating machine...
(host1) Copying /root/.docker/machine/cache/boot2docker.iso to /root/.docker/machine/machines/host1/boot2docker.iso...
(host1) Creating VirtualBox VM...
(host1) Creating SSH key...
(host1) Starting the VM...
(host1) Check network to re-create if needed...
(host1) Found a new host-only adapter: "vboxnet0"
(host1) Waiting for an IP...
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 boot2docker...
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 host1


如果想为创建的虚拟机指定其他参数,可以通过以下命令获取帮助:

[root@localhost ~]# docker-machine create --driver virtualbox --help


通过以下命令,获取新创建的虚拟机的相关信息:

[root@localhost ~]# docker-machine env host1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/host1"
export DOCKER_MACHINE_NAME="host1"
# Run this command to configure your shell:
# eval $(docker-machine env host1)


通过eval $(docker-machine env host1)命令可以获取到docker-machine env host1命令的输出,然后将它应用到当前bash环境。运行该命令之后,Docker命令将会指向到创建好的虚拟机上,而不再是之前使用的宿主机。

[root@localhost ~]# eval $(docker-machine env host1)
[root@localhost ~]# env | grep DOCKER
DOCKER_HOST=tcp://192.168.99.100:2376
DOCKER_MACHINE_NAME=host1
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/root/.docker/machine/machines/host1
[root@localohst ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES


也可以通过ssh的方式直接连接到新的虚拟机上:

[root@localhost ~]# docker-machine ssh host1


Docker Machine为通过一个客户端机管理多台Docker宿主机提供了管理命令,如下表:

子命令

作用

create

创建一台新的虚拟机

ls

列出Docker宿主机,当前活跃的机器旁边标有一个星号

stop

停止机器

start

启动机器

restart

重启机器

rm

销毁一台机器

kill

杀掉一台机器

inspect

JSON格式返回机器的元数据

config

返回连接机器所需的配置信息

ip

返回一台机器的IP地址

url

返回一台机器上Docker守护进程的URL

upgrade

将宿主机上的Docker升级到最新版本


如何切换回原来宿主机上的Docker实例?

第一种,可以使用docker-machine rm命令删除所有虚拟机;
第二种,通过unset DOCKER_HOST DOCKER_MACHINE_NAME DOCKER_TLS_VERIFY DOCKER_CERT_PATH命令删除之前设置的环境变量。


以上,通过虚拟机了解了如何使用Docker Machine,如何在远程主机使用呢?

[root@localhost ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.102 --generic-ssh-user=root --generic-ssh-key=/root/.ssh/id_rsa host2