使用Docker Context連線遠端節點

夢哲發表於2022-05-08

在Docker v19.03版本之前,我們可以使用DOCKER_HOST環境變數來配置和連線遠端Docker主機,自從Docker v19.03版本開始,Docker的命令列介面(CLI)增加了一個子命令 - context,用於管理docker客戶端連線多個上下文環境。
通過context命令,可通過配置SSH協議的上下文連線並管理遠端多個Docker主機,同時從一臺安裝了Docker CLI的機器匯出上下文環境,並在另一臺安裝了Docker CLI的機器匯入。

首先可以通過--help選項檢視命令支援的子命令:

 docker context --help
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.

這裡將演示如何使用使用DOCKER_HOST環境變數的方式,以及context命令的方式來連線遠端Docker主機。

提前準備

首先我們需要準備兩臺Docker主機,並安裝Docker v19.03+ 版本,例如這裡

  • 192.168.0.110(linux-dev) - 我的本地工作主機,Docker version 20.10.12-ce
  • 192.168.0.200(home-boxsrv) - 遠端Docker主機,Docker version 20.10.7

為避免輸入SSH密碼,請提前配置從Docker客戶端主機免密訪問遠端Docker主機。

DOCKER_HOST環境方式

首先我們在遠端Docker主機(home-boxsrv)上執行一個容器,例如名為 dns_masq 的容器

ubuntu@linux-boxsrv:~$ docker container ls
CONTAINER ID   IMAGE                  COMMAND                  CREATED        STATUS        PORTS                                                                                                                                                                                             NAMES
0597a189d488   jpillora/dnsmasq:1.1   "webproc --config /e…"   2 months ago   Up 31 hours   127.0.0.1:53->53/tcp, 127.0.0.1:53->53/udp, 192.168.0.200:53->53/tcp, 192.168.0.200:53->53/udp, 192.168.31.200:53->53/tcp, 192.168.31.200:53->53/udp, 0.0.0.0:8053->8080/tcp, :::8053->8080/tcp   dns_masq

在本地主機上(linux-dev)配置環境變數

mengz@linux-dev?~
❯ export DOCKER_HOST=ssh://ubuntu@192.168.0.200

然後檢視容器

mengz@linux-dev?☸~
❯ docker container ls
CONTAINER ID   NAMES      IMAGE                  CREATED ago        STATUS        PORTS                                                                                                                                                                                             COMMAND
0597a189d488   dns_masq   jpillora/dnsmasq:1.1   2 months ago ago   Up 31 hours   127.0.0.1:53->53/tcp, 127.0.0.1:53->53/udp, 192.168.0.200:53->53/tcp, 192.168.0.200:53->53/udp, 192.168.31.200:53->53/tcp, 192.168.31.200:53->53/udp, 0.0.0.0:8053->8080/tcp, :::8053->8080/tcp   "webproc --config /e…"

我們可以看到,列出的是執行在遠端主機上的容器。

使用context命令

首先我們在本地主機(linux-dev)上清除上面配置的環境變數

mengz@linux-dev?~
❯ unset DOCKER_HOST

使用context ls命令列出當前客戶端配置的上下文環境

mengz@linux-dev?~
❯ docker context ls
NAME           DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT                     ORCHESTRATOR
default *      Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://k8s1.mengz.lan:6443 (default)   swarm

可以看到,當前有一個名為 default 的環境,連線的是本機上Docker引擎。
現在,我們通過 context create 命令來新增連線(home-boxsrv)的上下文環境

mengz@linux-dev?~
❯ docker context create home-boxsrv --description "Docker Engine on home-boxsrv" --docker "host=ssh://ubuntu@192.168.0.200"
home-boxsrv
Successfully created context "home-boxsrv"

❯ docker context ls
NAME           DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT                     ORCHESTRATOR
default *      Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://k8s1.mengz.lan:6443 (default)   swarm
home-boxsrv    Docker Engine on home-boxsrv              ssh://ubuntu@192.168.0.200

以成功新增了名為 home-boxsrv 的環境,但是當前啟用的還是 default 環境,我們需要通過 context use 命令來設定當前環境

mengz@linux-dev?~
❯ docker context use home-boxsrv
home-boxsrv
Current context is now "home-boxsrv"

現在我們使用 container ls 看一下

mengz@linux-dev?☸~
❯ docker container ls
CONTAINER ID   NAMES      IMAGE                  CREATED ago        STATUS        PORTS                                                                                                                                                                                             COMMAND
0597a189d488   dns_masq   jpillora/dnsmasq:1.1   2 months ago ago   Up 31 hours   127.0.0.1:53->53/tcp, 127.0.0.1:53->53/udp, 192.168.0.200:53->53/tcp, 192.168.0.200:53->53/udp, 192.168.31.200:53->53/tcp, 192.168.31.200:53->53/udp, 0.0.0.0:8053->8080/tcp, :::8053->8080/tcp   "webproc --config /e…"

列出的是遠端主機(home-boxsrv)上的容器,如果使用 docker info 命令檢視,server將是遠端主機的資訊。

除了SSH協議的端點方式,如果遠端主機通過tcp暴露的docker端點,那我們也可以使用tcp的端點方式,例如下面的名為 home-cappsrv 的環境

❯ docker context ls
NAME            DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT                     ORCHESTRATOR
default         Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://k8s1.mengz.lan:6443 (default)   swarm
home-boxsrv *   Docker Engine on home-boxsrv              ssh://ubuntu@192.168.0.200                                            
home-cappsrv    The docker engine on home-cappsrv         tcp://192.168.0.123:2375

總結

通過 context 命令,我們可以方便在一臺Docker客戶端主機上連線並切換管理多臺Docker主機環境,大大提高了運維多主機環境的效率,同時可以方便將管理的Docker上下文環境匯出並匯入到其他Docker客戶端使用,跟多的命令使用方法可參考 官方文件

同時釋出在 Mengz's blog

相關文章