一、什么是Docker Machine

在这里插入图片描述

Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https://github.com/docker/machine

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

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

Docker Machine 也可以集中管理所有的docker主机。

二、为什么要使用Docker Machine

Docker Machine 使你能够在各种 Linux 上配置多个远程 Docker 宿主机。
此外,Machine 允许你在较早的 Mac 或 Windows 系统上运行 Docker,如上一主题所述。
Docker Machine 有这两个广泛的用例。

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

在这里插入图片描述

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

  • 我想在远程系统上配置 Docker 宿主机
    在这里插入图片描述

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

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

三、Docker和Docker Machine之间的区别

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

在这里插入图片描述

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”。
在这里插入图片描述

四、Docker Machine的安装部署

实验准备:

1.虚拟机准备

主机名ip作用
server1172.25.63.1控制器
server2172.25.63.2客户端
server3172.25.63.3客户端

还需要在真机(172.25.63.250)安装httpd,将安装所需资源发布出去。

2.各主机的selinux和firewalld均为关闭状态。

安装 Docker Machine

安装 Docker Machine 之前你需要先安装 Docker。

官方github项目有安装流程

[root@server1 ~]# curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
> chmod +x /tmp/docker-machine &&
> cp /tmp/docker-machine /usr/local/bin/docker-machine

等待下载完成即可。

配置客户端

这次实验准备在server3上安装docker

首先需要在server1做ssh免密:
在server1

[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server3

更改server3系统类型(由于安装脚本中如果监测到系统为rhel就会退出安装docker):

配置资源发布端

在真机httpd发布目录下建立以下文件:

[root@foundation63 ~]# cd /var/www/html/
[root@foundation63 html]# mkdir docker
[root@foundation63 html]# cd docker/
[root@foundation63 docker]# ls
[root@foundation63 docker]# wget -O  get-docker.sh https://get.docker.com		#下载安装脚本

[root@foundation63 docker]# vim docker-ce.repo			#建立repo文件
[root@foundation63 docker]# cat docker-ce.repo 
[docker]
baseurl=http://172.25.63.250/docker/docker-ce
gpgcheck=0


[root@foundation63 docker]# vim get-docker.sh 
398                         yum_repo="http://172.25.63.250/docker/docker-ce.repo    "			#更改为自己的repo文件地址


[root@foundation63 docker]# mkdir docker-ce			#安装包及依赖包的存放目录
[root@foundation63 docker]# cd docker-ce/
[root@foundation63 docker-ce]# ls
containerd.io-1.2.13-3.1.el7.x86_64.rpm  docker-ce-19.03.8-3.el7.x86_64.rpm
container-selinux-2.77-1.el7.noarch.rpm  docker-ce-cli-19.03.8-3.el7.x86_64.rpm
[root@foundation63 docker-ce]# createrepo -v .			#创建本地yum源
[root@foundation63 docker-ce]# ls
containerd.io-1.2.13-3.1.el7.x86_64.rpm  docker-ce-19.03.8-3.el7.x86_64.rpm      repodata
container-selinux-2.77-1.el7.noarch.rpm  docker-ce-cli-19.03.8-3.el7.x86_64.rpm

以上部分安装包的下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

配置完成后即可执行安装命令:

[root@server1 ~]# docker-machine create --driver generic --engine-install-url "http://172.25.63.250/docker/get-docker.sh" --generic-ip-address 172.25.63.3 server3

以上命令的含义:
--driver generic 指定驱动为普通驱动
--engine-install-url指定安装脚本地址,
--generic-ip-address 需要安装docker的客户端ip以及主机名

在这里插入图片描述上图显示表示安装成功。

添加节点

在server2上已经安装好了docker,我们可以使用以下命令添加这个节点进入集群:

[root@server2 ~]# vim /etc/os-release 
[root@server2 ~]# cat -n /etc/os-release |  grep 3
     3	ID="centos"

控制端添加节点:

[root@server1 ~]# ssh-copy-id server2
[root@server1 ~]# docker-machine create --driver generic --engine-install-url "http://172.25.63.250/docker/get-docker.sh" --generic-ip-address 172.25.63.2 server2

添加成功,查看节点:

[root@server1 ~]# docker-machine ls
NAME      ACTIVE   DRIVER    STATE     URL                      SWARM   DOCKER     ERRORS
server2   -        generic   Running   tcp://172.25.63.2:2376           v19.03.8   
server3   *        generic   Running   tcp://172.25.63.3:2376           v19.03.8   

五、Docker Machine管理远程主机

Docker Machine命令

命令说明
active查看当前激活状态的Docker主机
config查看当前激活状态Docker主机的连接信息
creat创建Docker主机
env显示连接到某个主机需要的环境变量
inspect以json格式输出指定Docker的详细信息
ip获取指定Docker主机的地址
kill直接杀死指定的Docker主机
ls列出所有的管理主机
provision重新配置指定主机
regenerate-certs为某个主机重新生成TLS信息
restart重启指定的主机
rm删除某台Docker主机,对应的虚拟机也会被删除
ssh通过SSH连接到主机上,执行命令
scp在Docker主机之间以及Docker主机和本地主机之间通过scp远程复制数据
mount使用SSHFS从计算机装载或卸载目录
start启动一个指定的Docker主机,如果对象是个虚拟机,该虚拟机将被启动
status获取指定Docker主机的状态(包括:Running、Paused、Saved、Stopped、Stopping、Starting、Error)等
stop停止一个指定的Docker主机
upgrade将一个指定主机的Docker版本更新为最新
url获取指定Docker主机的监听URL
version显示Docker Machine的版本或者主机Docker版本
help显示帮助信息

测试:

[root@server1 ~]# docker-machine ls

在这里插入图片描述连接远程主机:

[root@server1 ~]# docker -H  tcp://172.25.63.3:2376 ps

在这里插入图片描述

会报错,因为服务是通过https访问的,我们需要高速他key在哪里, docker-machine config server3命令作用是查看远程主机的信息,我们可以使用以下形式来对远程主机的docker进行操作:

[root@server1 ~]# docker `docker-machine config server3` images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

也可以控制远程主机拉取镜像,当然前提是远程主机可以上网且最好配置了镜像加速:

[root@server1 ~]# docker `docker-machine config server3` pull busybox
Using default tag: latest
latest: Pulling from library/busybox
0669b0daf1fb: Pull complete 
Digest: sha256:b26cd013274a657b86e706210ddd5cc1f82f50155791199d29b9e86e935ce135
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest

[root@server1 ~]# docker `docker-machine config server3` images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        4 weeks ago         1.22MB

也可以运行容器:

[root@server1 ~]# docker `docker-machine config server3` run -it --rm busybox
/ # [root@server1 ~]# 

[root@server1 ~]# docker `docker-machine config server3` ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d2aa4683ee41        busybox             "sh"                9 seconds ago       Up 8 seconds                            thirsty_noyce

但是我们也可以发现每次这么操作很繁琐,也可以将远程主机的环境变量加入到控制端实现更加简单的访问:

[root@server1 ~]# eval $(docker-machine env server3)

[root@server1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        4 weeks ago         1.22MB

添加后操作默认在server3。

[root@server1 ~]# docker-machine ls
NAME      ACTIVE   DRIVER    STATE     URL                      SWARM   DOCKER     ERRORS
server2   -        generic   Running   tcp://172.25.63.2:2376           v19.03.8   
server3   *        generic   Running   tcp://172.25.63.3:2376           v19.03.8   

*表示现在在操作哪个远程主机。

[root@server1 ~]# eval $(docker-machine env server2)		#切换到server2
[root@server1 ~]# docker-machine ls
NAME      ACTIVE   DRIVER    STATE     URL                      SWARM   DOCKER     ERRORS
server2   *        generic   Running   tcp://172.25.63.2:2376           v19.03.8   
server3   -        generic   Running   tcp://172.25.63.3:2376           v19.03.8 

优化显示

但是以上这种操作方式也有问题,有时候我们必须先查看环境变量才能确定我们操作的是哪个主机,其实可以安装一个bash脚本来优化这个问题:

脚本下载地址:
https://github.com/docker/machine/tree/master/contrib/completion/bash

将脚本下载下来放到/etc/bash_completion.d/目录中:

[root@server1 ~]# cd /etc/bash_completion.d/
[root@server1 bash_completion.d]# ls
docker-machine.bash          rct                          rhsm-debug
docker-machine-prompt.bash   redefine_filedir             rhsm-icon
docker-machine-wrapper.bash  rhn-migrate-classic-to-rhsm  subscription-manager
iprutils                     rhsmcertd

然后使脚本生效:

[root@server1 bash_completion.d]# source /etc/bash_completion.d/docker-machine-prompt.bash
[root@server1 bash_completion.d]# vim ~/.bashrc 
加入:
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

[root@server1 bash_completion.d]# source ~/.bashrc

之后切换就会显示在哪个主机:

[root@server1 ~ [server2]]# eval $(docker-machine env server3)
[root@server1 ~ [server3]]# 
[root@server1 ~ [server3]]# 
[root@server1 ~ [server3]]# eval $(docker-machine env server2)

这样显示就比较清楚。

如果想要退出到本地,可以退出这个shell再进即可。

六、Docker Machine安装指定docker版本

再不指定docker版本安装时,Docker Machine会默认安装你指定的yum源里最新的版本,我们也可以指定版本安装。

实验前将server3删除:

[root@server1 ~]# docker-machine rm server3 

在server3卸载docker:

[root@server3 ~]# systemctl stop docker
[root@server3 ~]# yum remove docker-ce -y
[root@server3 ~]# yum remove docker-ce-cli -y
[root@server3 ~]# cd /etc/systemd/system/docker.service.d/
[root@server3 docker.service.d]# ls
10-machine.conf
[root@server3 docker.service.d]# rm -f 10-machine.conf 		#删除残留文件

经指定版本的安装包docker-ce-cli-19.03.2-3.el7.x86_64.rpm,docker-ce-19.03.2-3.el7.x86_64.rpm放入yum源并再次创建yum源:

[root@foundation63 docker-ce]# ls
containerd.io-1.2.13-3.1.el7.x86_64.rpm  docker-ce-19.03.8-3.el7.x86_64.rpm      repodata
container-selinux-2.77-1.el7.noarch.rpm  docker-ce-cli-19.03.2-3.el7.x86_64.rpm
docker-ce-19.03.2-3.el7.x86_64.rpm       docker-ce-cli-19.03.8-3.el7.x86_64.rpm
[root@foundation63 docker-ce]# createrepo -v .

比如这个有两各版本 19.03.2和19.03.8,默认安装最新的版本即19.03.8,我们接下来指定安装19.03.2:
在真机修改安装脚本将指定版本号写入:

[root@foundation63 docker]# vim get-docker.sh 		#注释459-461 修改462
459                                 #if [ -n "$cli_pkg_version" ]; then
460                                 #       $sh_c "$pkg_manager install -y -q docker-ce-cli    -$cli_pkg_version"
461                                 #fi
462                                 $sh_c "$pkg_manager install -y -q docker-ce-19.03.2-3.e    l7 docker-ce-cli-19.03.2-3.el7"

安装完成后在server3查看版本:

[root@server3 ~]# rpm -qa | grep docker
docker-ce-19.03.2-3.el7.x86_64
docker-ce-cli-19.03.2-3.el7.x86_64
  • 1
  • 2
  • 3

可以看出是指定版本。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐