Docker多主机管理(八)--技术流ken
docker多主机管理
前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的。但在真正的环境中会有多个 host,容器在这些 host 中启动、运行、停止和销毁,相关容器会通过网络相互通信,无论它们是否位于相同的 host。
对于这样一个 multi-host 环境,我们将如何高效地进行管理呢?
我们面临的第一个问题是:为所有的 host 安装和配置 docker。
对于多主机环境手工方式效率低且不容易保证一致性,针对这个问题,docker 给出的解决方案是 Docker Machine。
用 Docker Machine 可以批量安装和配置 docker host,这个 host 可以是本地的虚拟机、物理机,也可以是公有云中的云主机。
Docker Machine 为这些环境起了一个统一的名字:provider。对于某个特定的 provider,Docker Machine 使用相应的 driver 安装和配置 docker host
安装docker machine
在172.20.10.2主机上面安装docker machine
然后通过docker-machine命令在172.20.10.7和172.20.10.9两个主机上部署docker
官方安装文档:https://docs.docker.com/machine/install-machine/
第一步:根据官方文档进行安装
[root@ken1 ~]# base=https://github.com/docker/machine/releases/download/v0.16.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
第二步:查看版本
[root@ken1 ~]# docker-machine version
docker-machine version 0.16., build 702c267f
为了得到更好的体验,我们可以安装 bash completion script,这样在 bash 能够通过 tab 键补全 docker-mahine 的子命令和参数
第一步:进入到/etc/bash_completion.d目录下
执行如下的命令
[root@ken1 ~]# cd /etc/bash_completion.d && 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@ken1 bash_completion.d]# ls
docker-machine.bash docker-machine-wrapper.bash gluster salt.bash
docker-machine-prompt.bash git iprutils yum-utils.bash
第三步:使脚本生效
[root@ken1 bash_completion.d]# source /etc/bash_completion.d/docker-machine-prompt.bash
第四步:将如下代码添加到~/.bashrc:
[root@ken ~]# source .bashrc
其作用是设置 docker-machine 的命令行提示符,不过要等到部署完其他两个 host 才能看出效果。
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
上述操作只需要根据官方文档说明进行操作即可。
Docker Machine 已经就绪
创建machine
对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机。
“创建 Machine” 指的就是在 host 上安装和部署 docker。
第一步:查看当前的machine
先执行 docker-machine ls 查看一下当前的 machine:
[root@ken1 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
当前还没有 machine,接下来我们创建第一个 machine: host1 - 172.20.10.7。
如果出现下面的错误:
[root@ken1 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
-bash: __docker_machine_ps1: command not found
执行下面的命令:
[root@ken1 ~]# source /etc/bash_completion.d/docker-machine-prompt.bash
[root@ken1 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
第二步:发送密钥
创建 machine 要求能够无密码登录远程主机,所以需要先通过如下命令将 ssh key 拷贝到 172.20.10.7:
[root@ken1 ~]# ssh-copy-id 172.20.10.7
第三步:创建machine
一切准备就绪,执行 docker-machine create 命令创建 host1:
[root@ken ~]# docker-machine create --driver generic --generic-ip-address=172.20.10.7 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 centos...
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
因为我们是往普通的 Linux 中部署 docker,所以使用 generic driver,其他 driver 可以参考文档 https://docs.docker.com/machine/drivers/。
--generic-engine-port:用于Docker守护程序的端口(注意:此标志不适用于boot2docker)。
--generic-ip-address:主机所需的 IP地址。
--generic-ssh-key:SSH用户私钥的路径。
--generic-ssh-user:用于连接的SSH用户名。
--generic-ssh-port:用于SSH的端口。
由于 Docker Engine 的官方 repo 在国内访问非常不稳定,在创建机器时可能会出现 Error Creating machine: Error running provisioning: error installing docker 之类的错误。
目前我没有找到好的解决方法,只能多次尝试。网上有人推荐使用国内源,使用--engine-registry-mirror 指定。
第四步:查看machine
[root@ken ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
host1 - generic Running tcp://172.20.10.7:2376 v18.09.0
另外machine主机的主机名已经设置为host1
第五步:使用同样的额方法创建host2
[root@ken ~]# docker-machine create --driver generic --generic-ip-address=172.20.10.9 host2
查看machine
[root@ken ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
host1 - generic Running tcp://172.20.10.7:2376 v18.09.0
host2 - generic Running tcp://172.20.10.9:2376 v18.09.1
管理machine
用 docker-machine 创建machine 的过程很简洁,非常适合多主机环境。除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理。其中最常用的就是无需登录到 machine 就能执行 docker 相关操作。
Docker Machine 则让这个过程更简单。docker-machine env host1显示访问 host1 需要的所有环境变量:
[root@ken ~]# docker-machine env host1
export DOCKER_TLS_VERIFY=""
export DOCKER_HOST="tcp://172.20.10.7: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):
[root@ken ~]# eval $(docker-machine env host1)
[root@ken ~ [host1]]#
然后,就可以看到命令行提示符已经变了,其原因是我们之前在$HOME/.bashrc 中配置了 PS1='[\u@\h \W$(__docker_machine_ps1)]\$ ',用于显示当前 docker host。
在此状态下执行的所有 docker 命令其效果都相当于在 host1 上执行,例如启动一个 busybox 容器:
[root@ken ~ [host1]]# docker run -itd busybox
9c469371692c1aa465cc59ab6c6660c966871d8f00380658476e8a5284e63130
[root@ken ~ [host1]]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c469371692c busybox "sh" seconds ago Up seconds vibrant_lamarr
e69a5bec56eb weaveworks/weave:2.5. "/home/weave/weaver …" About an hour ago Up minutes weave
执行 eval $(docker-machine env host2) 切换到 host2:
[root@ken ~ [host1]]# eval $(docker-machine env host2)
[root@ken ~ [host2]]#
docker-machine scp 可以在不同 machine 之间拷贝文件,比如:
docker-machine scp host1:/tmp/a host2:/tmp/b
Docker多主机管理(八)--技术流ken的更多相关文章
- Docker网络(五)--技术流ken
本章内容 1.dokcer默认自带的几种网络介绍 2. 自定义网络 3. 容器间通信 4. 容器与外界交互 docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网 ...
- Docker容器监控(十)--技术流ken
docker自带的监控命令 docker自带了三个监控命令即ps, top, stats ps docker ps 可以帮助我们很快的了解当前正在运行的容器 -a:会显示已经停掉的容器 [root@h ...
- Linux权限管理(week1_day5)--技术流ken
权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身 ...
- rpm和yum软件管理(week2_day5)--技术流ken
rpm简介 这是一个数据库管理工具,可以通过读取数据库,判断软件是否已经安装,如果已经安装可以读取出来所有文件的所在位置等,并可以实现删除这些文件. rpm:RPM is Redhat Package ...
- 用户及用户组管理(week1_day4)--技术流ken
本节内容 useradd userdel usermod groupadd groupdel 用户管理 为什么需要有用户? 1. linux是一个多用户系统 2. 权限管理(权限最小化) 用户:存在的 ...
- k8s集群监控(十一)--技术流ken
Weave Scope 在我之前的docker监控中<Docker容器监控(十)--技术流ken>就已经提到了weave scope. Weave Scope 是 Docker 和 K ...
- Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken
前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...
- Docker端口映射及创建镜像演示(二)--技术流ken
前言 在上一篇博客<Docker介绍及常用操作演示--技术流ken>中,已经详细介绍了docker相关内容以及有关镜像和容器的使用命令演示. 现在我们已经可以自己下载镜像,以及创建容器了. ...
- Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...
随机推荐
- xlrd模块
import xlrdbook = xlrd.open_workbook('app_student.xls')sheet = book.sheet_by_index(0)# sheet2 = book ...
- 引用Excel控件时,无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”请改用适用的接口
类型Microsoft.Office.Interop.Excel.ApplicationClass未定义构造函数 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.Ap ...
- oc中的反射机制
好久没有总结过了,一直在赶项目... 今天来总结一下OC中的反射机制,有什么不对的地方,还请多多海涵. 反射机制,简单的说就是在程序运行期间通过类的名字来动态的获取类的信息,从而实现动态的创建类,以及 ...
- linux操作命令之帮助命令
一.man命令的帮助: man 命令名 获取指定命令的帮助 例如man ls 查看ls的帮助 man man可以看到man有8个级别的man帮助命令使用场景 1.查看命令的帮助 2.查看可被内核调用的 ...
- 虚拟机桥接模式联网方法,Xshell的连接与使用
1.虚拟机的编辑中的虚拟网络编译器,新建一个VMnet0,选择桥接模式,选择上网时的网卡. 2.虚拟机 -> 设置 -> 网络适配器,选择启动时连接,桥接模式,复制物理网络连接状态. 3. ...
- python语法_模块_os_sys
os模块:提供对此操作系统进行操作的接口 os.getcwd() 获取python运行的工作目录. os.chdir(r'C:\USERs') 修改当前工作目录. os.curdir 返回当前目录 ( ...
- android利用ContentResolver访问者获取手机联系人信息
转载自:http://www.jb51.net/article/106379.htm 首先需要在AndroidManifest.xml文件中添加权限: <uses-permission andr ...
- Ooui.Wasm:浏览器中的.NET
小型.NET Web框架Ooui作为Web程序集(WASM)在浏览器中完全运行 – 不需要服务器端的交互,涉及的所有文件都直接从浏览器执行,.NET Web框架Ooui可以作为其开发人员Frank A ...
- Vue 学习笔记 -- inline-template
简书 更方便的使用私有子组件 定义一个私有子组件时,如果子组件的template过长会使得代码非常难以阅读 这时可以使用内联模版 但是如果写成这样 为毛用要子组件呢?
- [Swift]LeetCode204. 计数质数 | Count Primes
Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 E ...