Docker每天学一点09 - 多主机管理
前面的实验都是在一个host中,而真实环境中肯定会有多个主机。 容器在这些 host 中启动、运行、停止和销毁,相关容器会通过网络相互通信,无论它们是否位于相同的 host。
对于这样一个 multi-host 环境,我们将如何高效地进行管理呢?我们面临的第一个问题是:为所有的 host 安装和配置 docker。 如果一个个去安装肯定很麻烦又容易出错,手工方式效率低且不容易保证一致性,针对这个问题,docker 给出的解决方案是 Docker Machine。
安装 Docker Machine
用 Docker Machine 可以批量安装和配置 docker host,这个 host 可以是本地的虚拟机、物理机,也可以是公有云中的云主机。
安装命令:
1 | curl -L https://github.com/docker/machine/releases/download/v0.16.1/docker-machine-Linux-x86_64 >/tmp/docker-machine && |
下载的执行文件被放到 /usr/local/bin
中,执行ocker-mahine version
验证命令是否可用:
1 | [root@ecs-hw01 ~]# docker-machine version |
配置自动补全
为了得到更好的体验,我们可以安装 bash completion script,这样在 bash 能够通过 tab 键补全 docker-mahine 的子命令和参数。
先安装bash-completion:yum install bash-completion -y
然后执行下面脚本下载三个bash文件,复制到/etc/bash_completion.d/
中:
1 | scripts=( docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash ); |
启用该功能。 在~/.bashrc中末尾添加:
1 | source /etc/bash_completion.d/docker-machine-prompt.bash |
重新退出再登录一下bash即可。
创建 Machine
对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机。”创建 Machine” 指的就是在 host 上安装和部署 docker。
先执行 docker-machine ls
查看一下当前的 machine:
1 | [root@ecs-hw01 ~]# docker-machine ls |
当前还没有 machine,接下来我们创建第一个 machine: host1 - 192.168.1.21
创建 machine 要求能够无密码登录远程主机,所以需要先通过如下命令将 ssh key 拷贝到 192.168.1.21:
1 | ssh-copy-id 192.168.1.21 |
一切准备就绪,执行 docker-machine create
命令创建 host1:
1 | docker-machine create --driver generic --generic-ip-address=192.168.2.21 host1 |
因为我们是往普通的 Linux 中部署 docker,所以使用 generic driver, 其他 driver 可以参考文档 https://docs.docker.com/machine/drivers/
--generic-ip-address
指定目标系统的 IP,并命名为 host1。
过程如下:
- 通过 ssh 登录到远程主机
- 安装 docker
- 拷贝证书
- 配置 docker daemon
- 启动 docker
再次执行 docker-machine ls
可以看到host1了。登录远程主机我们也看到docker已经安装完成,并且 hostname 已经设置为 host1。
安装同样的方式可以安装host2。
管理 Machine
用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境。除此之外, Docker Machine 也提供了一些子命令方便对 machine 进行管理。其中最常用的就是无需登录到 machine 就能执行 docker 相关操作。
我们前面学过,要执行远程 docker 命令我们需要通过 -H 指定目标主机的连接字符串,比如:
1 | docker -H tcp://192.168.12.100:2376 ps |
Docker Machine 则让这个过程更简单。docker-machine env host1
显示访问 host1 需要的所有环境变量:
根据提示,执行 eval $(docker-machine env host1)
切换到host1中。
下面再介绍几个有用的 docker-machine 子命令
docker-machine upgrade
更新 machine 的 docker 到最新版本,可以批量执行:
1 | docker-machine upgrade host1 host2 |
不要执行stop/start/restart之类,这是对操作系统的命令。
docker-machine scp
可以在不同 machine 之间拷贝文件,比如:
1 | docker-machine scp host1:/tmp/a host2:/tmp/b |
个人感觉,除了安装docker外,貌似没啥太大用出去,我还是觉得还不如去每台机器上面安装。