在Docker v19.03版本之前,咱们能够应用DOCKER_HOST
环境变量来配置和连贯近程Docker主机,自从Docker v19.03版本开始,Docker的命令行接口(CLI)减少了一个子命令 - context,用于治理docker客户端连贯多个上下文环境。
通过context命令,可通过配置SSH协定的上下文连贯并治理近程多个Docker主机,同时从一台装置了Docker CLI的机器导出上下文环境,并在另一台装置了Docker CLI的机器导入。
首先能够通过--help选项查看命令反对的子命令:
docker context --helpUsage: docker context COMMANDManage contextsCommands: 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 contextRun '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 lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0597a189d488 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 lsCONTAINER ID NAMES IMAGE CREATED ago STATUS PORTS COMMAND0597a189d488 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 lsNAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATORdefault * 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-boxsrvSuccessfully created context "home-boxsrv"❯ docker context lsNAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATORdefault * Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://k8s1.mengz.lan:6443 (default) swarmhome-boxsrv Docker Engine on home-boxsrv ssh://ubuntu@192.168.0.200
以胜利增加了名为 home-boxsrv
的环境,然而以后激活的还是 default
环境,咱们须要通过 context use
命令来设置以后环境
mengz@linux-dev~❯ docker context use home-boxsrvhome-boxsrvCurrent context is now "home-boxsrv"
当初咱们应用 container ls
看一下
mengz@linux-dev☸~❯ docker container lsCONTAINER ID NAMES IMAGE CREATED ago STATUS PORTS COMMAND0597a189d488 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 lsNAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATORdefault Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://k8s1.mengz.lan:6443 (default) swarmhome-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