Docker Machine是什么

是Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装Docker,或者在虚拟机host 上直接安装虚拟机并在虚拟机中安装Docker。 

我们还可以通过docker-machine 命令来管理这些虚拟机和Docker


安装docker-machine命令

base=https://github.com/docker/machine/releases/download/v0.14.0 &&  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&  sudo install /tmp/docker-machine /usr/local/bin/docker-machine

官网地址:https://docs.docker.com/machine/install-machine/#install-machine-directly


查看版本

# ll /usr/local/bin/docker-machine 
-rwxr-xr-x 1 root root 28034848 6月  26 12:07 /usr/local/bin/docker-machine

# docker-machine -version
docker-machine version 0.14.0, build 89b8332


使用docker machine

docker machine可以通过多种后端驱动来管理不同的资源,包括虚拟机,本机主机和平台等。

管理本地主机:看下官网给的例子:

docker-machine create \
  --driver generic \
  --generic-ip-address=203.0.113.81 \
  --generic-ssh-key ~/.ssh/id_rsa \
  vm


参数

  • --generic-engine-port: Port to use for Docker Daemon (Note: This flag does not work with boot2docker).  docker引擎的端口,默认是2376

  • --generic-ip-addressrequired IP Address of host.   docker宿主机的IP地址

  • --generic-ssh-key: Path to the SSH user private key.  SSH私钥文件路径

  • --generic-ssh-user: SSH username used to connect.  SSH连接的用户名,该用户必须在目标宿主机上已经创建,且具有免密码的sudo权限

  • --generic-ssh-port: Port to use for SSH.  SSH端口,默认是22


使用docker machine的前提:

  • 在目标主机上创建一个用户并加入sudo 组

  • 为该用户设置 sudo 操作不需要输入密码

  • 把本地用户的 ssh public key 添加到目标主机上

例如:我在测试环境中有两台机器,host1(172.16.2.14)、host2(172.16.2.3)。host1安装了docker和docker-machine。现在hosts2是一台centos7.2的云主机。

现在我要通过docker machine在host2上安装docker引擎。

host1 和 host2上都有ansible用户,且都有sudo权限,host1 ansible用户可以直接ssh 到host2

$ docker-machine create -d generic --generic-ssh-key ~/.ssh/id_rsa  --generic-ip-address=172.16.2.3 --generic-ssh-user=ansible test
Running pre-create checks...
Creating machine...
(test) Importing SSH key...
(test) Couldn't copy SSH public key : unable to copy ssh key: open /home/ansible/.ssh/id_rsa.pub: no such file or directory
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 test
[ansible@OPS01-LINTEST02 .ssh]$ docker-machine ls
NAME   ACTIVE   DRIVER    STATE     URL                     SWARM   DOCKER        ERRORS
test   -        generic   Running   tcp://172.16.2.3:2376           v18.05.0-ce



docker-machina 命令

active:查看当前激活状态的Docker主机

$ docker-machine active
No active host found


config:查看到激活Docker主机的连接信息

$ docker-machine config test
--tlsverify
--tlscacert="/home/ansible/.docker/machine/machines/test/ca.pem"
--tlscert="/home/ansible/.docker/machine/machines/test/cert.pem"
--tlskey="/home/ansible/.docker/machine/machines/test/key.pem"
-H=tcp://172.16.2.3:2376


create:创建一个Docker主机

格式:

docker-machine create [options] [arg...]
--driver, -d "none" :指定驱动类型
--engine-install-url “https://get.docker.com”:配置Docker主机时候的安装URL 
--engine-insecure-registry option :以键值对格式指定所创建Docker引擎的参数
--engine-registry-mirror option:指定使用注册仓库镜像
--engine-lable option:为所创建的Docker引擎添加标签
--engine-storage-driver:存储后端驱动类型
--engine-env option:指定环境变量
--swarm:指定使用Swarm
--swarm-image “swarm:latest”: 使用Swarm时采用的镜像
--swarm-discovery:Swarm 集群的服务发现机制参数
--swarm-strategy “spread”: Swarm默认调度策略
--swarm-opt option:任意传递给Swarm的参数
--swarm-host "tcp://0.0.0.0:3376" :指定地址将监听Swarm master节点请求
--swarm-addr:从指定地址发送广播加入Swarm集群服务

例如:

docker-machine create -d virtualbox \
--engine-strorage-driver overlay \
--engine-lable name=testmachine \
--engine-lable year=2018 \
--engine-opt dns=8.8.8.8 \
--engine-env HTTP_PROXY=http://proxy.com:3128 \
--engine-insecure-registry registry.private.cpm \
mydocermachine

解释:

使用overlay类型的存储驱动

带有name=testmachine 和 year=2018两个标签

引擎采用8.8.8.8作为默认DNS

环境变量中指定http代理服务http://proxy.com:3128

允许使用不带验证的注册仓库服务registry.private.com


env

显示连接到某个主机时需要的环境变量

$ docker-machine env test
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.16.2.3:2376"
export DOCKER_CERT_PATH="/home/ansible/.docker/machine/machines/test"
export DOCKER_MACHINE_NAME="test"
# Run this command to configure your shell: 
# eval $(docker-machine env test)


inspect:以json格式输出指定Docker主机的详细信息

$ docker-machine inspect test
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "172.16.2.3",
        "MachineName": "test",
        "SSHUser": "ansible",
        "SSHPort": 22,
        "SSHKeyPath": "/home/ansible/.docker/machine/machines/test/id_rsa",
        "StorePath": "/home/ansible/.docker/machine",
        "SwarmMaster": false,
        "SwarmHost": "",
        "SwarmDiscovery": "",
        "EnginePort": 2376,
        "SSHKey": "/home/ansible/.ssh/id_rsa"
    },
    "DriverName": "generic",
    "HostOptions": {
        "Driver": "",
        "Memory": 0,
        "Disk": 0,
        "EngineOptions": {
            "ArbitraryFlags": [],
            "Dns": null,
            "GraphDir": "",
            "Env": [],
            "Ipv6": false,
            "InsecureRegistry": [],
            "Labels": [],
            "LogLevel": "",
            "StorageDriver": "",
            "SelinuxEnabled": false,
            "TlsVerify": true,
            "RegistryMirror": [],
            "InstallURL": "https://get.docker.com"
        },
        "SwarmOptions": {
            "IsSwarm": false,
            "Address": "",
            "Discovery": "",
            "Agent": false,
            "Master": false,
            "Host": "tcp://0.0.0.0:3376",
            "Image": "swarm:latest",
            "Strategy": "spread",
            "Heartbeat": 0,
            "Overcommit": 0,
            "ArbitraryFlags": [],
            "ArbitraryJoinFlags": [],
            "Env": null,
            "IsExperimental": false
        },
        "AuthOptions": {
            "CertDir": "/home/ansible/.docker/machine/certs",
            "CaCertPath": "/home/ansible/.docker/machine/certs/ca.pem",
            "CaPrivateKeyPath": "/home/ansible/.docker/machine/certs/ca-key.pem",
            "CaCertRemotePath": "",
            "ServerCertPath": "/home/ansible/.docker/machine/machines/test/server.pem",
            "ServerKeyPath": "/home/ansible/.docker/machine/machines/test/server-key.pem",
            "ClientKeyPath": "/home/ansible/.docker/machine/certs/key.pem",
            "ServerCertRemotePath": "",
            "ServerKeyRemotePath": "",
            "ClientCertPath": "/home/ansible/.docker/machine/certs/cert.pem",
            "ServerCertSANs": [],
            "StorePath": "/home/ansible/.docker/machine/machines/test"
        }
    },
    "Name": "test"
}



ip: 获取指定Docker主机IP

$ docker-machine ip test
172.16.2.3


kill:直接杀死指定的Docker主机,generic类型的docker主机不支持,虚拟化平台的支持

$ docker-machine kill test
Killing "test"...
generic driver does not support kill


例如:virtualbox创建的docker机器支持kill命令

 ~ docker-machine kill machine-test
Killing "machine-test"...
Machine "machine-test" was killed.


ls:列出所有管理的主机,支持通过--filter来过滤, 支持的过滤器包括:名称正则表达式、驱动类型、Swarm管理节点名称、状态等

$ docker-machine ls
NAME         ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER        ERRORS
aliyun-ecs   -        generic   Running   tcp://47.52.229.25:2376           v18.05.0-ce   
test         -        generic   Running   tcp://172.16.2.3:2376             v18.05.0-ce


$ docker-machine ls --filter state=Running
NAME         ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER        ERRORS
aliyun-ecs   -        generic   Running   tcp://47.52.229.25:2376           v18.05.0-ce   
test         -        generic   Running   tcp://172.16.2.3:2376             v18.05.0-ce