Docker-(11)Docker三剑客中的Docker Machine
一、什么是Docker MachineDocker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https://github.com/docker/machine。Docker Machine 是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Doc
一、什么是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 | 作用 |
---|---|---|
server1 | 172.25.63.1 | 控制器 |
server2 | 172.25.63.2 | 客户端 |
server3 | 172.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
可以看出是指定版本。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)