永久地址:Docker Context——使用 docker 命令管理多个 docker 节点(保存网址不迷路 🙃)
问题描述
在 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」- 拉取镜像
「Docker」- 容器(学习笔记)
「Docker」- 使用 Docker API
「Docker」- 在容器中,运行 systemd 进程(轻量化的虚拟机)
「Docker」- 监控与日志
「Docker」- 删除镜像
参考文献
Docker Context | Docker Documentation
docker context | Docker Documentation
Using SSH Connections in Docker Contexts – mikesir87's blog