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.0, 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="1"
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" 4 seconds ago Up 2 seconds vibrant_lamarr
e69a5bec56eb weaveworks/weave:2.5.1 "/home/weave/weaver …" About an hour ago Up 14 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多主机管理(八)的更多相关文章

  1. Docker多主机管理(八)--技术流ken

    docker多主机管理 前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的.但在真正的环境中会有多个 host,容器在这些 host 中启动.运行.停止和 ...

  2. Docker容器的管理

    创建容器的工作原理: 当利用docker run来创建容器时,Docker在后台运行的标准操作包括:检查本地是否存在指定的镜像,不存在就从公有仓库下载,利用镜像创建并启动一个容器分配一个文件系统,并在 ...

  3. centos7下安装docker(16.docker跨主机存储)

    从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器. 无状态:是指容器在运行的过程中不需要保存数据,每次访问的结果不依赖上一次的访问,比如提供静态页 ...

  4. 6、Docker图形化管理(Portainer)

    一.Portainer简介 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控 ...

  5. docker之镜像管理命令

    一.docker image 镜像管理命令 指令 描述ls 列出本机镜像build 构建镜像来自Dockerfilehistory 查看镜像历史inspect 显示一个或多个镜像详细信息pull 从镜 ...

  6. Docker集群管理(一)—— 基础docker+swarm+shipyard

    目的 学习docker的集群管理,摸索出高可用的docker微服务架构方案.本篇文章只初步的了解下swarm(docker新版已集成了swarm)的使用,了解docker的发现服务的基础方法(dock ...

  7. Docker多主机网络 OpenvSwitch

    一.Open vSwitch    Open vSwitch(以下简称为OVS),英文全称:OpenVirtual Switch,顾名思义,Open vSwitch就是开放虚拟交换.我们可以把他理解成 ...

  8. 基于zookeeper+mesos+marathon的docker集群管理平台

    参考文档: mesos:http://mesos.apache.org/ mesosphere社区版:https://github.com/mesosphere/open-docs mesospher ...

  9. docker集群管理

    docker集群管理 ps:docker machine     docker swarm       docker compose  在Docker Machine发布之前,你可能会遇到以下问题: ...

随机推荐

  1. 【python接口自动化】- 使用requests库发送http请求

    前言:什么是Requests ?Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤ ...

  2. 秒杀 2Sum 3Sum 4Sum 算法题

    2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过,大家刷题一定要吃透一类题,为什么有的人题目 ...

  3. 【全解】Eclipse添加Spring项目插件

    1.Eclipse打开window-preference-InstallNewSoftware 2.先点Manage,取消掉The Eclipse Project Updates 3.选择Add . ...

  4. JavaScript学习系列博客_11_JavaScript中的for语句

    for循环 - 语法: for(①初始化表达式 ; ②条件表达式 ; ④更新表达式){ ③语句... } - 执行流程: 首先执行①初始化表达式,初始化一个变量,(这里只会执行一次) 然后对②条件表达 ...

  5. psutil 简单使用!

    psutil.cpu_percent() cpu 百分比 mem = psutil.virtual_memory()mem.total,mem.used mem.free psutil.cpu_cou ...

  6. 利用python爬取贝壳网租房信息

    最近准备换房子,在网站上寻找各种房源信息,看得眼花缭乱,于是想着能否将基本信息汇总起来便于查找,便用python将基本信息爬下来放到excel,这样一来就容易搜索了. 1. 利用lxml中的xpath ...

  7. 计算机网络-传输层(3)TCP协议与拥堵控制

    TCP是因特网传输层的面向连接的可靠的运输协议.   TCP被称为是面向连接的:通信双方在发送数据之前必须建立连接,连接状态只在连接的两端中维护,在沿途节点中并不维护状态. TCP连接包括:两台主机上 ...

  8. C语言复习-字符串与指针

    C语言复习-字符串与指针 例一: [字符串处理 去除C代码中的注释] C/C++代码中有两种注释,/* */和//.编译器编译预处理时会先移除注释.就是把/*和*/之间的部分去掉,把//以及之后的部分 ...

  9. Java面试题(Kafka篇+zookeeper 篇)

    Kafka 152.kafka 可以脱离 zookeeper 单独使用吗?为什么? kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafk ...

  10. “计数质数”问题的常规思路和Sieve of Eratosthenes算法分析

    题目描述 题目来源于 LeetCode 204.计数质数,简单来讲就是求"不超过整数 n 的所有素数个数". 常规思路 一般来讲,我们会先写一个判断 a 是否为素数的 isPrim ...