Docker Machine(十五)
一、Docker Machine 总览
前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的。但在真正的环境中会有多个 host,容器在这些 host 中启动、运行、停止和销毁,相关容器会通过网络相互通信,无论它们是否位于相同的 host。
用 Docker Machine 可以批量安装和配置 docker host,这个 host 可以是本地的虚拟机、物理机,也可以是公有云中的云主机。
Docker Machine 支持在不同的环境下安装配置 docker host,包括:
- 常规 Linux 操作系统;
- 虚拟化平台 - VirtualBox、VMWare、Hyper-V;
- OpenStack;
- 公有云 - Amazon Web Services、Microsoft Azure、Google Compute Engine、Digital Ocean 等。
Docker Machine 为这些环境起了一个统一的名字:provider。对于某个特定的 provider,Docker Machine 使用相应的 driver 安装和配置 docker host,如下图所示:
1、Docker Engine VS Docker Machine
我们平时所说的 Docker 指的是 Docker Engine,它是由 docker CLI,REST API,docker daemon 组成。
Docker Machine是一个配置和管理我们主机的工具,管理方式如下图:
2、环境准备
我们准备三台设备,都是安装的 Ubuntu 16.04,如下:
client:192.168.1.200
host1:192.168.1.201
host2:192.168.1.203
我们将在 192.168.1.200 上安装 Docker Machine,然后通过 docker-machine 命令在其他两个 host 上部署 docker。
二、安装 Docker Machine
1、Install 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
检查安装完成。
root@ubuntu:~# docker-machine version
docker-machine version 0.14.0, build 89b8332
2、Install bash completion scripts
为了得到更好的体验,我们可以安装 bash completion script,这样在 bash 能够通过 tab 键补全 docker-mahine 的子命令和参数。
base=https://raw.githubusercontent.com/docker/machine/v0.14.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
使脚本生效。
source /etc/bash_completion.d/docker-machine-prompt.bash
然后将如下代码添加到 $HOME/.bashrc:
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
三、创建 Machine
对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机。“创建 Machine” 指的就是在 host 上安装和部署 docker。先执行 docker-machine ls 查看一下当前的 machine:
root@ubuntu:~# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
如我们所料,当前还没有 machine,接下来我们创建第一个 machine: host1---192.168.1.201。
创建 machine 要求能够无密码登录远程主机,所以需要先通过如下命令将 ssh key 拷贝到 192.168.1.201。
ssh-copy-id 192.168.1.201
一切准备就绪,执行 docker-machine create 命令创建 host1:
docker-machine create --driver generic --generic-ip-address=192.168.1.201 host1
因为我们是往普通的 Linux 中部署 docker,所以使用 generic driver。
--generic-ip-address 指定目标系统的 IP,并命名为 host1。命令执行过程如下:
root@ubuntu:~# docker-machine create --driver generic --generic-ip-address=192.168.1.201 host1
Creating CA: /root/.docker/machine/certs/ca.pem
Creating client certificate: /root/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
(host1) No SSH key specified. Assuming an existing key at the default location.
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 ubuntu(systemd)...
Installing Docker...
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 host1
① 通过 ssh 登录到远程主机。
② 安装 docker。
③ 拷贝证书。
④ 配置 docker daemon。
⑤ 启动 docker。
再次执行 docker-machine ls :
root@ubuntu:~# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
host1 - generic Running tcp://192.168.1.201:2376 v18.04.0-ce
使用同样的方法创建 host2:
docker-machine create --driver generic --generic-ip-address=192.168.1.203 host2
创建好 host1 和 host2 之后,我们也可以把自己这台机器加入,指令如下:
docker-machine create --driver generic --generic-ip-address=192.168.1.200 master
创建成功后docker-machine ls
可以看到 host1 和 host2 都已经就绪:
[root@master ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
host1 - generic Running tcp://192.168.1.201:2376 v18.04.0-ce
host2 - generic Running tcp://192.168.1.203:2376 v18.04.0-ce
master - generic Running tcp://192.168.1.200:2376 v18.04.0-ce
四、管理 Machine
用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境。除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理。其中最常用的就是无需登录到 machine 就能执行 docker 相关操作。
1、查看环境变量
Docker Machine 则让这个过程更简单。docker-machine env host1
显示访问 host1 需要的所有环境变量:
root@ubuntu:~# docker-machine env host1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.1.201:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/host1"
export DOCKER_MACHINE_NAME="host1"
# Run this command to configure your shell:
# eval $(docker-machine env host1)
根据提示,执行 eval $(docker-machine env host1)
:
2、host1 启动容器
在此状态下执行的所有 docker 命令其效果都相当于在 host1 上执行,例如启动一个 busybox 容器:
[root@ubuntu ~ [host1]]# docker run -itd busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
f70adabe43c0: Pull complete
Digest: sha256:58ac43b2cc92c687a32c8be6278e50a063579655fe3090125dcb2af0ff9e1a64
Status: Downloaded newer image for busybox:latest
13dda8965035ab88ff29541e0d1c92d9cb963063d2d9c1e118e21dea78075d09
3、docker-machine ssh
除了上面的使用方法外,我们还有更加简便的方式,就是使用docker-machine ssh
,需要我们提前配置好 /etc/hosts,比如上面的命令还可以直接通过如下指令创建。
[root@ubuntu ~]# docker-machine ssh host1 "docker run -itd busybox"
6d46a6a6f36b5ee464ff227f50a2d48e1f0db1ad9d47ce2996181436447c1a8b
[root@ubuntu ~]# docker-machine ssh host1 "docker ps -a"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13dda8965035 busybox "sh" About a minute ago Up About a minute peaceful_payne
4、host2 启动容器
执行eval $(docker-machine env host2)
切换到 host2:
[root@ubuntu ~ [host2]]# docker ps -a
WARN[0000] Unable to use system certificate pool: requires building with go 1.7 or later
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
可见,在多主机环境下 Docker Machine 可以大大提高效率,而且操作也很简单,通过使用docker-machine ssh
我们可以不用再使用eval $(docker-machine env host2)
进行切换。
Docker Machine(十五)的更多相关文章
- Docker(二十五)-Docker Machine
Docker Machine 是什么? Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在 ...
- Docker最全教程之树莓派和Docker(十五)
前言 树莓派(Raspberry Pi)是一台卡片电脑(只有信用卡大小),我们可以使用树莓派做很多事情,比如智能家居的中控.航空器.BT下载器.挖矿机.智能机器人.小型服务器(花生壳+网站)等等. 目 ...
- Docker系列(十五):Openshift 简介
1.简单了解openshift相关组件 1.openshift是基于容器技术构建的一个云平台 2.kubernetes是容器编排组件 3.docker是容器引擎驱动组件 4.openshift在Pas ...
- Docker+ Kubernetes已成为云计算的主流(二十五)
前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...
- Docker(五):Docker 三剑客之 Docker Machine
上篇文章Docker(四):Docker 三剑客之 Docker Compose介绍了 Docker Compose,这篇文章我们来了解 Docker Machine . Docker Machine ...
- [第十四篇]——Docker Machine之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker Machine 简介 Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机. Docker Mac ...
- Docker Machine 简介
Docker Machine 是什么? Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在 ...
- 用 Docker Machine 创建 Azure 虚拟主机
搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起.笔者在<Docker Machine 简介>一文中演示了使用 Do ...
- 菜鸟玩云计算之十五:在Ubuntu上创建和管理Redhat虚拟机
菜鸟玩云计算之十五:在Ubuntu上创建和管理Redhat虚拟机 chedou@hgdb.net 虚拟机给工作带来巨大的便利,不仅仅体现在资源的按需使用,而且配置的迁移特别方便.本文将使用Ubuntu ...
随机推荐
- Selenium常用API的使用java语言之6-WebDriver常用方法
前面我们已经学习了定位元素, 定位只是第一步, 定位之后需要对这个元素进行操作, 或单击(按钮) 或 输入(输入框) , 下面就来认识这些最常用的方法. 1.WebDriver 常用方法 下面先来认识 ...
- json与java bean对象转换
第一步:引入fastjson的依赖jar包 注:如果引入此版本的依赖,导致项目不能启动(报错:找不到启动类);那么可以换一个版本的fastjson即可. 给出文字版: <!-- fastjson ...
- PowerDesigner创建表 拷贝创建表语句 SQLSERVER创建数据库 使用查询 创建表 并且添加数据
PowerDesigner创建表 : 1.双击打开PowerDesigner 2.双击打开Create model 3左键点击Model types,再点击Physical Data m ...
- [HNOI2004]L语言 字典树 记忆化搜索
[HNOI2004]L语言 字典树 记忆化搜索 给出\(n\)个字符串作为字典,询问\(m\)个字符串,求每个字符串最远能匹配(字典中的字符串)到的位置 容易想到使用字典树维护字典,然后又发现不能每步 ...
- 【算法】变邻域搜索算法(Variable Neighborhood Search,VNS)超详细一看就懂的解析
更多精彩尽在微信公众号[程序猿声] 变邻域搜索算法(Variable Neighborhood Search,VNS)一看就懂的解析 00 目录 局部搜索再次科普 变邻域搜索 造轮子写代码 01 局部 ...
- python qq发消息
# 原理是先将需要发送的文本放到剪贴板中,然后将剪贴板内容发送到qq窗口 # 之后模拟按键发送enter键发送消息 import win32gui import win32con import win ...
- 5.Python3列表和元组
5.1序列 在python3中序列结构主要有列表.元组.集合.字典和字符串,对于这些序列有以下通用操作. 5.1.1 索引 序列中的每一个元素都有 一个编号,也称为索引.这个索引是从0开始递增的,即下 ...
- js的模块化之路
在ES6之前,官方没有出来import export这种模块化的语法. 为了提高代码复用.避免污染全局,民间写了很多模块化的实现: 1. 立即执行函数 (function(globalVariable ...
- cesium地下模式(地表透明)3
这篇博客主要解决“瓦片的白色网格”问题 设置skirt=0可以解决这个问题,需要设置3个地方 1.HeightmapTerrainData.js createMesh方法 this._skirtHei ...
- decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下: IF 条件=值1 THEN RETURN(翻译值1) ELSIF 条件=值2 THEN RETU ...