「Docker Context」- 使用 docker 命令管理多个 docker 节点

更新日期:2021年02月22日
@P2TT

问题描述

在 Docker 中,通过 Docker Context 特性,可以实现:使用本地 docker 命令,管理多个远程的 Docker 节点。而且不仅如此,还可以管理 Swarm 集群、Kubernetes 集群。当然,由于 Docker Context 在 Swarm 与 Kubernetes 中的应用较少,所以我们内容的重点也放在使用 Docker Context 管理多个 Docker 节点。

该笔记将记录:如何使用 docker context 管理其他 Docker 节点,以及常见问题处理。

# 02/19/2021 注意事项,虽然我们在这里演示使用 Docker Context 管理多个 Docker 节点,但是这只是为了让我们熟悉 Docker Context 的使用方法。而 Docker Context 具有很多其他的实际应用。比如在 Docker Buildx 中,通过 Docker Context 来选择构建节点。因此,不要局限于使用 Docker Context 在多个远程 Docker 节点中执行命令。本质上,它提供了一种连接和管理远程 Docker 服务的方法。

解决方案

首先,我们要检查本地 docker 客户端是否 Docker Context 命令。执行 docker context 命令,产生如下输出表示支持:

# docker context

Usage:  docker context COMMAND

Manage contexts

Commands:
  create      Create a context
  export      Export a context to a tar or kubeconfig file
  import      Import a context from a tar or zip file
  inspect     Display detailed information on one or more contexts
  ls          List contexts
  rm          Remove one or more contexts
  update      Update a context
  use         Set the current docker context

Run 'docker context COMMAND --help' for more information on a command.

在实验环境中,有三台主机:
1)192.168.39.1 => 本地主机,laptop,运行 docker 命令的主机
2)192.168.122.59 => 实验主机,desktop-ubuntu-18-gnome
3)192.168.122.176 => 实验主机,desktop-debian-10-gnome

并且,两台实验主机都开启 TCP 监听(参考 Listen on Port 笔记),以允许远程主机访问。

现在,我们在本地主机中,顺序执行如下命令:

// 将 desktop-ubuntu-18-gnome 添加到 Context 中

# docker context create desktop-ubuntu-18-gnome --docker "host=tcp://192.168.122.59:2375"
desktop-ubuntu-18-gnome
Successfully created context "desktop-ubuntu-18-gnome"

// 将 desktop-debian-10-gnome 添加到 Context 中

# docker context create desktop-debian-10-gnome --docker "host=tcp://192.168.122.176:2375"
desktop-debian-10-gnome
Successfully created context "desktop-debian-10-gnome"

// 查看 Context 中的全部节点。其中星号(default *)表示当前 docker 客户端使用 defualt 节点,即当前主机的 Docker 服务 

# docker context ls
NAME                      DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default *                 Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
desktop-debian-10-gnome                                             tcp://192.168.122.176:2375                               
desktop-ubuntu-18-gnome                                             tcp://192.168.122.59:2375

// 切换到 desktop-debian-10-gnome 节点

# docker context use desktop-debian-10-gnome
desktop-debian-10-gnome
Current context is now "desktop-debian-10-gnome"

// 再次查看 Context 中的全部节点,此时 desktop-debian-10-gnome * 为当前节点

# docker context ls
NAME                        DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default                     Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
desktop-debian-10-gnome *                                             tcp://192.168.122.176:2375                          
desktop-ubuntu-18-gnome                                               tcp://192.168.122.59:2375

// 接下来,我们通过 docker 中查看宿主机的主机名
// 此时,显示的主机名为 desktop-debian-10-gnome 而不是本地 laptop 主机名

# docker run --rm -t --network host alpine hostname
desktop-debian-10-gnome

使用 SSH 连接

在有些情况下,比如出于安全考虑,我们不希望暴露 Docker TCP 端口、或者不想修改 docker.service 配置。此时,可以使用 SSH 连接:

# docker context create desktop-ubuntu-18-gnome --docker "host=ssh://192.168.122.59"       
desktop-ubuntu-18-gnome                                                      
Successfully created context "desktop-ubuntu-18-gnome" 

但是,使用该方法需要完成以下准备:
1)向目标主机分发公钥:ssh-copy-id -i ~/.ssh/id_ras.pub root@192.168.122.59
2)向 SSH Agent 中,添加私钥:ssh-add ~/.ssh/id_ras,因为 docker 命令只会从 ssh-agent 中读取密钥。

参考文献

Docker Context | Docker Documentation
docker context | Docker Documentation
Using SSH Connections in Docker Contexts – mikesir87's blog


ToC

问题描述

解决方案

使用 SSH 连接

参考文献