16boke - 一路博客

Docker系列:14、Docker Machine

Docker Machine 介绍

Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境。

Docker Machine 是一个工具,它允许你在虚拟宿主机上安装 Docker Engine ,并使用 docker-machine 命令管理这些宿主机。你可以使用 Machine 在你本地的 Mac 或 Windows box、公司网络、数据中心、或像 AWS 或 Digital Ocean 这样的云提供商上创建 Docker 宿主机。

使用 docker-machine 命令,你可以启动、审查、停止和重新启动托管的宿主机、升级 Docker 客户端和守护程序、并配置 Docker 客户端与你的宿主机通信。

为什么要使用它?

Docker Machine 使你能够在各种 Linux 上配置多个远程 Docker 宿主机。

此外,Machine 允许你在较早的 Mac 或 Windows 系统上运行 Docker,如上一主题所述。

Docker Machine 有这两个广泛的用例。

  • 我有一个较旧的桌面系统,并希望在 Mac 或 Windows 上运行 Docker

1.png

如果你主要在不符合新的 Docker for Mac 和 Docker for Windows 应用程序的旧 Mac 或 Windows 笔记本电脑或台式机上工作,则需要 Docker Machine 来在本地“运行Docker”(即Docker Engine)。在 Mac 或 Windows box 中使用 Docker Toolbox 安装程序安装 Docker Machine 将为 Docker Engine 配置一个本地的虚拟机,使你能够连接它、并运行 docker 命令。

  • 我想在远程系统上配置 Docker 宿主机

2.png

Docker Engine Linux 系统上原生地运行。如果你有一个 Linux 作为你的主系统,并且想要运行 docker 命令,所有你需要做的就是下载并安装 Docker Engine 。然而,如果你想要在网络上、云中甚至本地配置多个 Docker 宿主机有一个有效的方式,你需要 Docker Machine。

无论你的主系统是 Mac、Windows 还是 Linux,你都可以在其上安装 Docker Machine,并使用 docker-machine 命令来配置和管理大量的 Docker 宿主机。它会自动创建宿主机、在其上安装 Docker Engine 、然后配置 docker 客户端。每个被管理的宿主机(“machine”)是 Docker 宿主机和配置好的客户端的结合。

Docker Engine 和 Docker Machine 有什么区别?

当人们说“Docker”时,他们通常是指 Docker Engine,它是一个客户端 - 服务器应用程序,由 Docker 守护进程、一个REST API指定与守护进程交互的接口、和一个命令行接口(CLI)与守护进程通信(通过封装REST API)。Docker Engine 从 CLI 中接受docker 命令,例如 docker run <image>、docker ps 来列出正在运行的容器、docker images 来列出镜像,等等。

3.png

Docker Machine 是一个用于配置和管理你的宿主机(上面具有 Docker Engine 的主机)的工具。通常,你在你的本地系统上安装 Docker Machine。Docker Machine有自己的命令行客户端 docker-machine 和 Docker Engine 客户端 docker。你可以使用 Machine 在一个或多个虚拟系统上安装 Docker Engine。

这些虚拟系统可以是本地的(就像你在 Mac 或 Windows 上使用 Machine 在 VirtualBox 中安装和运行 Docker Engine 一样)或远程的(就像你使用 Machine 在云提供商上 provision Dockerized 宿主机一样)。Dockerized 宿主机本身可以认为是,且有时就称为,被管理的“machines”。

4.png

安装和使用

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

#完成后,查看版本信息。 docker-machine -v docker-machine version 0.14.0, build 89b8332

创建machine

对于docker machine来将,术语Machine就是运行docker daemon的主机,创建machine就是在host上安装docker

执行docker-macine ls查看当前的machine

5.png

当前还没有一个machine,接下来我们创建第一个machine:docker1-192.168.7.235

创建machine要求能够无密码远程登陆主机,所以需要下通过如下命令将ssh key拷贝到192.168.7.235

1.ssh-keygen -t rsa    在192.168.7.222上面生成密钥

注:这里要回车三次

6.png

2.在用户的家目录下生成一个   .ssh的 目录

7.png

3.在 .ssh下存放生成的密钥文件

8.png

id_rsa :生成的私钥文件

id_rsa.pub:生成的公钥文件

如果希望公钥生效,需满足以下两个条件:

1) .ssh目录的权限必须是700 

2) .ssh/authorized_keys文件权限必须是600

3.将密钥拷贝到192.168.7.235里面

ssh-copy-id

9.png

4.通过ssh 192.168.7.235测试是否成功

10.png

 

一切准备就绪,执行docker-machine create创建第一个docker1

docker-macine create --driver generic --generic-ip-address=192.168.7.235 docker1

因为我们用的是普通的linux部署docker,所以使用generic driver通用driver,其他driver可以参考:https://docs.docker.com/machine/drivers/

11.png

我们的docker1已经创建成功,步骤如下

1.ssh远程登录主机

2.安装docker

3.复制证书

4.配置docker

5.启动docker

 

再次执行;docker-machine ls

12.png

现在看到docker1已经运行

我们登陆到docker1查看具体配置

在/etc/systemd/system/docker.service.d下文件名是:10-machine.conf

13.png

注:-H tcp://0.0.0.0:2376 使docker daemon接受远程连接

      --tls*对远程连接启用安全认证和加密

注:主机名hostname也会被更改

 

使用同样的方法创建docker2

docker-machine create --driver generic --generic-ip-address=192.168.7.231 docker2

14.png

由于我忘记传送密钥,导致的报错

当我把密钥传进去后重新创建docker2时提示:docker2已经存在,通过docker-machine ls查看docker2已经处于运行的状态,无法识别docker版本

注:这里的docker的版本还不能指定,默认安装的是repo的版本

15.png

可以使用docker-machine rm -f删除docker2

16.png

 

   

重新传送密钥,然后重新创建docker2

17.png

在密钥传送不成功以及网络无法ping通baidu的情况下,终于将docker2建好了:

管理machine:

学习无需登录machine就可以执行docker相关的命令

1.docker-machine env docker1显示访问docker1需要的所有环境变量

18.png

 

 根据提示,执行eval $(docker-machine env docker1)

19.png

可以看到,命令提示符变成了docker1,其原因是我们之前在/root/.bashrc里面配置了 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ ',用于显示当前的docker host

注:如果我们输入eval $(docker-machine env docker1)没有显示出docker1的命令提示符,我们可以重新输入一遍 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

在此状态下执行的docker命令其效果都相当于在docker1上执行

 

docker-machine子命令:

docker-machine upgrate docker1 docker2批量更新docker host版本

20.png

docker-machine config docker1 查看host的docker daemon配置

21.png

docker-machine start/status/restart/kill  docker1是对docker host所在的系统的操作,不是对服务的操作

docker-machine scp是在docker host之间复制

22.png

docker-machine rm docker1删除一个docker host

其他请参考

23.png


Docker