在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