前文我们聊了下docker容器的资源限制,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13138725.html;今天我们来聊一聊docker machine;docker machine是docker 官方提供的工具,这个工具可以在不同主机/不同系统上快速安装、管理docker环境;docker machine 的实现原理就是通过不同的驱动来连接不同类型节点,来实现docker machine管理不同平台上的docker环境;

  docker machine 安装

  1、下载二进制程序文件到本地

[root@node1 ~]# base=https://github.com/docker/machine/releases/download/v0.16.0 &&
> curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
> sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
> chmod +x /usr/local/bin/docker-machine
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 638 100 638 0 0 590 0 0:00:01 0:00:01 --:--:-- 590
100 26.8M 100 26.8M 0 0 11911 0 0:39:24 0:39:24 --:--:-- 16907
[root@node1 ~]# ll /usr/local/bin/docker-machine
-rwxr-xr-x 1 root root 28164576 Jun 18 11:28 /usr/local/bin/docker-machine
[root@node1 ~]# docker-machine version
docker-machine version 0.16.0, build 702c267f
[root@node1 ~]#

  提示:以上命令主要就做了三件事,下载对应系统的对应系统架构的docker-machine到本地/tmp/下,并保存为docker-machine;然后把/tmp/docker-machine移动至/usr/local/bin/下,然后给/usr/local/bin/docker-machine添加执行权限;如果下载完我们可以在终端运行docker-machine version 能够看到对应的版本信息,就表示docker-machine安装好了;docker-machine程序是安装好了,现在我们还不能直接使用;我们上面说过docker-machine本质就是通过不同的驱动去连接节点,连接节点实际上就是通过ssh链到节点服务器上,然后执行安装docker;所以为了能够很好的使用docker-machine 我们需要对管理的节点做免密登录;

  2、管理节点对work节点做免密登录

[root@node1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4HrdVnoO+W/+J/ewP4A1m8HnneKWAKMKo3Ad2uExJ1k root@node1
The key's randomart image is:
+---[RSA 2048]----+
| |
| E |
| o. . |
| B... o = . |
| = B. S o + B o|
|. oo+. o . * = o.|
|... + o . * + = |
| . o . = +o+o|
| +++=B|
+----[SHA256]-----+
[root@node1 ~]# ssh-copy-id root@192.168.0.42
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.42 (192.168.0.42)' can't be established.
ECDSA key fingerprint is SHA256:EG9nua4JJuUeofheXlgQeL9hX5H53JynOqf2vf53mII.
ECDSA key fingerprint is MD5:57:83:e6:46:2c:4b:bb:33:13:56:17:f7:fd:76:71:cc.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.42's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.0.42'"
and check to make sure that only the key(s) you wanted were added. [root@node1 ~]# ssh-copy-id root@192.168.0.43
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.43 (192.168.0.43)' can't be established.
ECDSA key fingerprint is SHA256:EG9nua4JJuUeofheXlgQeL9hX5H53JynOqf2vf53mII.
ECDSA key fingerprint is MD5:57:83:e6:46:2c:4b:bb:33:13:56:17:f7:fd:76:71:cc.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.43's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.0.43'"
and check to make sure that only the key(s) you wanted were added. [root@node1 ~]

  提示:有关免密登录的详细说明可以参考本人博客https://www.cnblogs.com/qiuhom-1874/p/11783371.html;接下来我们就可以使用docker-machine来对节点主机进行操作了;

  对节点主机安装docker环境

  提示:提示:以上命令表示创建一个docker-machine主机,使用generic驱动,generic表示对linux主机,如果是windows需要用到--virtualbox;--generic-ip-address表示指定节点主机的ip地址;然后在给上一名称;从上面的信息可以看到,docker-node01这台machine已经启动,它告诉我们要查看怎么连接docker-node01这台虚拟主机,请运行docker-machine env docker-node01 查看;

  查看怎么连接docker-node01这台虚拟主机

  提示:它告诉我们运行下面的命令可以配置我们的shell

  提示:从上面的信息可以看到我们运行 eval $(docker-machine env docker-node01)这条命令就表示把环境切换到docker-node01上;接下来的操作都会发送到docker node01上;

  提示:从上面的信息可以看到,当我们使用eval $(docker-machine env docker-node01)把当前环境切换到docker-node01后,在当前终端运行的容器和下载的镜像,在退出当前终端重新登录后,本地的是没有nginx镜像的;这意味着我们切换环境后,运行容器的操作上发送给docker-node01上执行了;

  测试:我们登录到docker-node01看看是否有nginx镜像和n1容器?

  提示:用docker-machine创建虚拟主机来对节点主机管理时,我们给定虚拟主机的名称docker-machine会把该名称当作主机名,把节点主机的主机名更改为我们指定的名称;从上面的信息可以看到docker-node01这台主机上有nginx镜像和n1容器;这说明我们刚才的操作都是发送给docker-node01上了;从上面的演示可以看到,我们在docker-machine上切换环境,当前shell并不能反映我们是否切换到对应的环境了;这样一来在主机特别多的情况,很容易出错;接下来我们配置当前shell的PS1的环境变量;

  下载docker-machine-wrapper.bash、docker-machine-prompt.bash和docker-machine.bash

[root@node01 ~]# cat /etc/bash_completion.d/down.bash
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
sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
[root@node01 ~]#

  提示:以上脚本主要是循环下载上面说的三个脚本;执行该脚本直接有source命令即可;

  提示:我们用source命令来执行上面的脚本,提示我们连接拒绝;这是因为没有解析到raw.githubusercontent.com的地址造成的;解决办法在/etc/hosts文件中介入raw.githubusercontent.com的解析地址即可;https://site.ip138.com/raw.githubusercontent.com/;这个网站可以查询到raw.githubusercontent.com的地址;

  提示:更改/etc/hosts文件后,接下在用source命令执行上面的脚本就不会提示我们链接拒绝了;

  提示:可以看到/etc/bash_completion.d/目录下有我们要的脚本了;接下来我们就需要配置当前用户的PS1环境的值;

  提示:以上信息表示导入上面的三个脚本到当前登录用户的终端;配置好以上.bashrc后,我们在来切换环境,当前shell就不一样了;

  提示:导入了docker-machine-wrapper.bash、docker-machine-prompt.bash和docker-machine.bash这三个脚本配合现在新定义的PS1变量,我们切换环境就很容易的辨识,我们操作的node节点主机是那一台;退出当前环境,直接使用exit即可;

  到此docker-machine的环境就搭建好了;接下我们再来说说docker-machine的常用命令使用和说明

  docker-machine active:查看当前激活状态的docker主机

[root@node01 ~]# docker-machine active
docker-node01
[root@node01 ~]#

  提示:所谓激活状态的docker主机就是指的当前的DOCKER_HOST环境变量所指向的主机;

  docker-machine ls:列出所有管理的主机

[root@node01 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-node01 * generic Running tcp://192.168.0.42:2376 v19.03.11
docker-node02 - generic Running tcp://192.168.0.43:2376 v19.03.11
[root@node01 ~]#

  docker-machine config:查看激活的docker主机的连接信息;

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

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

[root@node01 ~]# docker-machine inspect docker-node01
{
"ConfigVersion": 3,
"Driver": {
"IPAddress": "192.168.0.42",
"MachineName": "docker-node01",
"SSHUser": "root",
"SSHPort": 22,
"SSHKeyPath": "",
"StorePath": "/root/.docker/machine",
"SwarmMaster": false,
"SwarmHost": "",
"SwarmDiscovery": "",
"EnginePort": 2376,
"SSHKey": ""
},
"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": "/root/.docker/machine/certs",
"CaCertPath": "/root/.docker/machine/certs/ca.pem",
"CaPrivateKeyPath": "/root/.docker/machine/certs/ca-key.pem",
"CaCertRemotePath": "",
"ServerCertPath": "/root/.docker/machine/machines/docker-node01/server.pem",
"ServerKeyPath": "/root/.docker/machine/machines/docker-node01/server-key.pem",
"ClientKeyPath": "/root/.docker/machine/certs/key.pem",
"ServerCertRemotePath": "",
"ServerKeyRemotePath": "",
"ClientCertPath": "/root/.docker/machine/certs/cert.pem",
"ServerCertSANs": [],
"StorePath": "/root/.docker/machine/machines/docker-node01"
}
},
"Name": "docker-node01"
}
[root@node01 ~]#

  提示:以上命令也支持-f选项来指定格式,用法同docker image/container inspect 类似;

[root@node01 ~]# docker-machine inspect -f {{.HostOptions.AuthOptions.StorePath}} docker-node01
/root/.docker/machine/machines/docker-node01
[root@node01 ~]# docker-machine inspect -f {{.DriverName}} docker-node01
generic
[root@node01 ~]#

  docker-machine ip :获取指定docker主机的ip地址

[root@node01 ~]# docker-machine ip docker-node01
192.168.0.42
[root@node01 ~]# docker-machine ip docker-node02
192.168.0.43
[root@node01 ~]#

  docker-machine ssh :连接指定docker执行命令

[root@node01 ~]# docker-machine ssh docker-node01 "ip a"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:91:99:30 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.42/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe91:9930/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:0f:e1:e0:f7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:fff:fee1:e0f7/64 scope link
valid_lft forever preferred_lft forever
[root@node01 ~]#

  docker-machine scp:在docker主机间以及docker主机和本地之间通过scp命令来远程复制文件

[root@node01 ~]# echo "this is test file" > /tmp/test.txt
[root@node01 ~]# cat /tmp/test.txt
this is test file
[root@node01 ~]# docker-machine scp /tmp/test.txt docker-node01:/root/
test.txt 100% 18 5.4KB/s 00:00
[root@node01 ~]# docker-machine ssh docker-node01 "ls -l /root/"
total 4
-rw-r--r-- 1 root root 18 Jun 19 11:26 test.txt
[root@node01 ~]# docker-machine ssh docker-node01 "cat /root/test.txt"
this is test file
[root@node01 ~]#

  提示:同scp命令用法类似;

  docker-machine rm:删除指定名称的docker主机对应的虚拟主机;

[root@node01 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-node01 * generic Running tcp://192.168.0.42:2376 v19.03.11
docker-node02 - generic Running tcp://192.168.0.43:2376 v19.03.11
[root@node01 ~]# docker-machine rm docker-node02
About to remove docker-node02
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed docker-node02
[root@node01 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-node01 * generic Running tcp://192.168.0.42:2376 v19.03.11
[root@node01 ~]#

  提示:docker-machine rm 只是删除docker-machine上的虚拟主机,对于真正的物理节点上的docker环境并没有删除;实际上就切断对指定docker主机的管控;

  docker-machine upgrade:将指定主机的docker版本更新为最新

[root@node01 ~]# docker-machine upgrade docker-node01
Waiting for SSH to be available...
Detecting the provisioner...
Upgrading docker...
Restarting docker...
[root@node01 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-node01 * generic Running tcp://192.168.0.42:2376 v19.03.11
[root@node01 ~]#

  提示:如果指定docker主机的版本已经是最新的版本,那么它将不会再更新;

  docker-machine url:获取指定主机监听URL

[root@node01 ~]# docker-machine url docker-node01
tcp://192.168.0.42:2376
[root@node01 ~]#

  提示:通过docker-machine安装的docker环境,实际上就是把yum安装的docker环境,客户端和服务端分离了,各个节点就是各个服务端,而docker-machine就是同一的客户端,因为客户端和服务端不再同一主机,所以它会把docker监听在一个TCP端口上,方便客户端的来连接管理;

容器技术之Docker Machine的更多相关文章

  1. linux容器技术和Docker

    linux容器技术和Docker 概述 Docker在一定程度上是LXC的增强版,早期的Docker使用LXC作为容器引擎,所以也可以说Docker是LXC的二次封装发行版,目前docker使用的容器 ...

  2. 容器技术|Docker三剑客之docker-machine

    docker-machine是什么? ocker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术,甚至可以通过指定driver来定制虚拟机的实 ...

  3. 容器技术|Docker三剑客之docker-compose

    三剑客简介 docker-machine docker技术是基于Linux内核的cgroup技术实现的,那么问题来了,在非Linux平台上是否就不能使用docker技术了呢?答案是可以的,不过显然需要 ...

  4. 容器技术与docker

    名词介绍 IaaS:基础设施即服务,要搭建上层数据应用,先得通过互联网获得基础性设施服务 PaaS:平台即服务,搭建平台,集成应用产品,整合起来提供服务 SaaS:软件即服务,通过网络提供程序应用类服 ...

  5. 容器技术之Docker镜像

    前文我们聊了下docker的基础使用方法,大概介绍了下docker的架构,管理镜像.运行容器.管理容器的一些相关命令说明:回顾请参考https://www.cnblogs.com/qiuhom-187 ...

  6. Docker容器技术-优化Docker镜像

    一.优化Docker镜像 1.降低部署时间 一个大的Docker应用是如何影响在新Docker宿主机上的部署时间. (1)编写Dockerfile创建一个大Docker镜像 [root@bogon ~ ...

  7. 容器技术之Docker基础入门

    前文我们了解了下LXC的基础用法以及图形管理工具LXC WEB Panel的简单使用,有兴趣的朋友可以参考https://www.cnblogs.com/qiuhom-1874/p/12904188. ...

  8. 容器技术之Docker网络

    上一篇博客我们主要聊了下docker镜像相关的说明以及怎样基于现有镜像制作镜像.分发镜像到docker仓库中的相关测试:回顾请参考https://www.cnblogs.com/qiuhom-1874 ...

  9. 容器技术之Docker数据卷

    前一篇随笔中我们了解了docker的网络相关说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12952616.html:今天我们来聊一聊docker的数据管 ...

随机推荐

  1. Java-第15章图形用户界面设计例题

    Example15_1.java JFrame常用方法 import javax.swing.*; import static javax.swing.JFrame.*; public class E ...

  2. python2.7入门 01

    进入python官网  http://www.python.org/download/ 下载python2.7.x  版 下载安装后配置环境变量    在path中——>>>把安装路 ...

  3. parrot os安装vmware pro

    转载https://www.linuxtechi.com/install-vmware-workstation-14-debian-9/ Open the terminal and execute t ...

  4. VNC下载,Windows系统下VNC如何下载和安装!

    IIS7服务器管理工具是一款VNC viewer的客户端,能够操作VNC,进行日常的功能实现:同时还可进行FTP的日常操作,能够高效地利用FTP的传输功能:也可以批量操作Windows.Linux系统 ...

  5. 【HBase】与关系型数据库区别、行式/列式存储

    [HBase]与关系型数据库区别 1.本质区别 mysql:关系型数据库,行式存储,ACID,SQL,只能存储结构化数据 事务的原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就 ...

  6. Java实现蓝桥杯 九宫幻方

    九宫幻方 D: 今天做一道题目 九宫幻方 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分. 三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对 ...

  7. Java实现 LeetCode 630 课程表 III(大小堆)

    630. 课程表 III 这里有 n 门不同的在线课程,他们按从 1 到 n 编号.每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天.一门课要持续学习 t 天直到第 d 天时要完成 ...

  8. Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)

    583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...

  9. Java实现 LeetCode 354 俄罗斯套娃信封问题

    354. 俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一 ...

  10. java实现迷宫走法

    ** 迷宫走法** 迷宫问题 对于走迷宫,人们提出过很多计算机上的解法.深度优先搜索.广度优先搜索是使用最广的方法.生活中,人们更愿意使用"紧贴墙壁,靠右行走"的简单规则. 下面的 ...