环境说明:

主机名 操作系统版本 IP地址 docker-machine版本 VMware版本 说明
docker01 Ubuntu 16.04.5 172.27.9.71 0.13.0 12.5.2 machine管理主机
docker02 Ubuntu 16.04.5 172.27.9.72 / 12.5.2 machine主机

本文所有测试都在Vmware虚拟机上完成。
ubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录
docker安装详见:Ubuntu16.04安装Docker

一、Docker Machine简介

1.Docker Machine概述

 Docker Machine是Docker官方三剑客项目之一,负责使用docker容器的第一步:在多种平台上快速安装和维护docker运行环境。它支持多种平台,让用户可以在很短时间内在本地或云环境中搭建一套docker主机集群。
Docker Machine用途:

  • 在Mac或Windows上安装并运行Docker
  • 配置和管理多个远程Docker主机
  • 为Docker Swarm提供支持

Docker实践(四):Docker Machine
在Mac或Windows上运行Docker
Docker实践(四):Docker Machine
管理远程docker主机

2.Docker Engine与Docker Machine

Docker Engine

Docker实践(四):Docker Machine
当人们说“docker”时,他们通常是指Docker Engine,包括Docker daemon、REST API 以及CLI命令行。Docker Engine接受来自cli的docker命令,例如docker run<image>、docker ps to list running containers、docker image ls to list images等等。

Docker Machine

Docker实践(四):Docker Machine
Docker Machine是一个工具,用于配置和管理您的Dockerized主机(主机上有Docker Engine)。通常,您在本地系统上安装Docker Machine。Docker Machine有自己的命令行客户端docker-machine和Docker Engine客户端docker。您可以使用machine在一个或多个虚拟系统上安装Docker Engine。这些虚拟系统可以是本地的(如在Mac或Windows上使用machine在VirtualBox中安装和运行Docker Engine)或远程的(如在云提供商上使用machine安装和运行Docker Engine)。

二、安装Docker Machine

安装Docker Machine前需先安装Docker,详见:Ubuntu16.04安装Docker

1.安装machine

root@docker01:~# base=https://mirrors.aliyun.com/docker-toolbox/linux/machine/0.13.0
root@docker01:~# curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 25.3M  100 25.3M    0     0   952k      0  0:00:27  0:00:27 --:--:--  989k
root@docker01:~# install /tmp/docker-machine /usr/local/bin/docker-machine

Docker实践(四):Docker Machine

2.验证Machine版本

root@docker01:~# docker-machine version
docker-machine version 0.13.0, build 9ba6da9

3.命令自动补全

下载bash completion

base=https://raw.githubusercontent.com/docker/machine/v0.16.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
  wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done

Docker实践(四):Docker Machine

编辑~/.bashrc

root@docker01:~# sed -i '$a 'PS1=\''[\\u@\\h \\W$(__docker_machine_ps1)]\\$ '\'''   ~/.bashrc

/root/.bashrc文件最后一行插入:PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

文件加载

root@docker01:~# source /etc/bash_completion.d/docker-machine.bash 
root@docker01:~# source /etc/bash_completion.d/docker-machine-prompt.bash 

加载docker-machine.bash和docker-machine-prompt.bash

验证docker-machine命令补全

root@docker01:~# docker-machine 
active            env               ip                mount             restart           ssh               stop              version           
config            help              kill              provision         rm                start             upgrade           
create            inspect           ls                regenerate-certs  scp               status            url               
root@docker01:~# docker-machine 

输入docker-machine,按tab键补全,会出现相关命令。

三、创建Machine和测试

 通过Docker Machine可以在多重平台上快速安装和维护Docker运行环境。
 Docker Machine通过多种后端驱动来管理不同的资源,包括虚拟机、本地主机和云平台等。通过--driver选项可以选择支持的驱动类型。本文介绍虚拟机和本地主机两种方式。
 对于Docker Machine来说,Machine就是运行docker daemon的主机,创建Machine即在host上安装和部署docker。

虚拟机方式

1.设置cpu

Docker实践(四):Docker Machine
由于是在Vmware上做的测试,需钩选“虚拟化Intel VT-x/EPT 或AMD-V/RVI”以支持虚拟机嵌套。

2.安装virtualbox

root@docker01:~# apt install virtualbox -y

3.创建Machine

[root@docker01 ~]# docker-machine create --driver=virtualbox test01

Docker实践(四):Docker Machine
该命令将创建一个oracle virtualbox为驱动的虚拟主机并安装Docker引擎。

4.查看machine

[root@docker01 ~]# docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
test01   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.4   
[root@docker01 ~]# docker-machine env test01
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/test01"
export DOCKER_MACHINE_NAME="test01"
# Run this command to configure your shell: 
# eval $(docker-machine env test01)

通过docker machine env可以知晓后续docker与machine交互的配置信息。

5.测试

进入machine

根据4中的提示,运行eval $(docker-machine env test01)进入machine。

[root@docker01 ~]# eval $(docker-machine env test01)
[root@docker01 ~ [test01]]# 

查看machine ip

[root@docker01 ~ [test01]]# docker-machine ip test01
192.168.99.100

ip地址为:192.168.99.100

运行apache服务

[root@docker01 ~ [test01]]# docker run -d -p 8000:80 httpd

Docker实践(四):Docker Machine
运行apache服务,端口映射为8000

切回管理主机

[root@docker01 ~ [test01]]# eval $(docker-machine env -u)
[root@docker01 ~]# 

运行eval $(docker-machine env -u),切回管理主机。

访问web

[root@docker01 ~]# curl $(docker-machine ip test01):8000
<html><body><h1>It works!</h1></body></html>

访问正常

本地主机方式

该种方式使用generic类型的驱动,适合目标主机操作系统完成安装且machine主机可以免密访问目标主机。

1.免密访问

machine上生成秘钥

[root@docker01 ~]# ssh-keygen  -t rsa

Docker实践(四):Docker Machine

将秘钥拷贝至docker02

[root@docker01 ~]# ssh-copy-id  -i /root/.ssh/id_rsa.pub root@172.27.9.72

Docker实践(四):Docker Machine

免密登陆测试

Docker实践(四):Docker Machine

2.创建Machine

[root@docker01 ~]# docker-machine create --driver generic --generic-ip-address=172.27.9.72 --engine-registry-mirror https://v16stybc.mirror.aliyuncs.com test02

Docker实践(四):Docker Machine
参数说明

  • --driver generic #驱动为generic。
  • --generic-ip-address #指定要安装machine的目标主机IP,前提是SSH root用户免交互登录或私钥认证。
  • --engine-registry-mirror #使用阿里加速器。

3.查看machine

[root@docker01 ~]# docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
test01   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.4   
test02   -        generic      Running   tcp://172.27.9.72:2376              v18.09.4 

创建的machine为test01和test02.

4.测试

进入machine

[root@docker01 ~]# docker-machine ssh test02

除了eval $(docker-machine env test02)方式外,也可以通过ssh方式进入machine。

运行busybox

root@test02:~# docker run --name busybox01 busybox echo hello world

Docker实践(四):Docker Machine
像普通容器一样,test02正常运行busybox。同时也看到docker02的主机名也变为test02。

四、Docker Machine命令

Docker Machine提供了很多子命令,可通过docker-machine <COMMAND> -h查看详情

[root@docker01 ~]# docker-machine 
active            env               ip                mount             restart           ssh               stop              use               
config            help              kill              provision         rm                start             upgrade           version           
create            inspect           ls                regenerate-certs  scp               status            url               
[root@docker01 ~]# docker-machine ls -h
Usage: docker-machine ls [OPTIONS] [arg...]

List machines

Options:

   --quiet, -q                                  Enable quiet mode
   --filter [--filter option --filter option]   Filter output based on conditions provided
   --timeout, -t "10"                           Timeout in seconds, default to 10s
   --format, -f                                 Pretty-print machines using a Go template

1.config

查看连接信息

[root@docker01 ~]# docker-machine config test02
--tlsverify
--tlscacert="/root/.docker/machine/machines/test02/ca.pem"
--tlscert="/root/.docker/machine/machines/test02/cert.pem"
--tlskey="/root/.docker/machine/machines/test02/key.pem"
-H=tcp://172.27.9.72:2376

2.scp

在Docker主机之间复制文件

[root@docker01 ~]# ls foo.txt
ls: cannot access 'foo.txt': No such file or directory
[root@docker01 ~]# docker-machine ssh test01 pwd
/home/docker
[root@docker01 ~]# docker-machine ssh test01 'echo A file created remotely! >foo.txt'
[root@docker01 ~]# docker-machine scp test01:/home/docker/foo.txt ./
foo.txt                                                                                                                           100%   25     0.0KB/s   00:00    
[root@docker01 ~]# ls
foo.txt
[root@docker01 ~]# 
[root@docker01 ~]# more foo.txt 
A file created remotely!

在test01中新建文件foo.txt并将其scp至管理主机。

3.mount

使用sshfs将machine主机的目录挂载至管理主机的本地目录。

安装sshfs

[root@docker01 ~]# apt install  fuse-sshfs

挂载test01的目录至管理主机

Docker实践(四):Docker Machine
在管理主机新建目录foo,test01中也新建foo并将/home/docker/foo挂载至管理主机的/root/foo目录,管理主机本地新建bar文件,test01对应目录也能看见,至此实现了两个foo目录的共享。

在machine的容器中使用目录

Docker实践(四):Docker Machine
至此foo目录在“管理主机目录/root/foo”、“test01主机的/home/docker/foo目录”和“test01中容器目录/tmp/foo”实现了共享。

unmount

[root@docker01 ~]# docker-machine mount -u test01:/home/docker/foo foo

unmount命令和mount一样,只是新增参数-u

4.inspect

以json格式输出指定machine主机的详细信息。
Docker实践(四):Docker Machine

5.upgrade

更新machine的docker版本
Docker实践(四):Docker Machine
执行upgrade操作会将machine中的docker升级至最新版。

6.start/stop

启动/停止machine主机系统(针对的是操作系统不是docker daemon)
Docker实践(四):Docker Machine
stop操作不支持driver为generic类型的machine。
 
 
 
本文参考:
https://docs.docker.com/machine/overview/
https://docs.docker.com/machine/get-started/
https://docs.docker.com/machine/reference/