This is a short recipe to use new context feature in docker to create & switch between docker contexts, so you can run any docker command remotely without need to establish a SSH connection (it’s done automatically by the docker context).
Prerequisites
Docker version
You need a relative modern docker version, to check if your installed docker version supports it, just run:
$ 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.
If all is OK you will see the help message, if not you will see an error message complaining about not existing docker command.
Public SSH key
You also need to send your public SSH key to the remote host, in order to allow a SSH connection from your local docker client to the remote docker server (replace user & IP):
$ ssh-copy-id emilio@192.168.1.18
You will need to accept the remote host key (if it’s the first time you connect to that server) and type the remote password.
Then you can try to log in without introducing the password:
$ ssh emilio@192.168.1.18
Creating & using docker contexts
Creating the context
To create a context, just run (we will call it eht, you can use the name you want):
$ docker context create eht --docker \
"host=ssh://emilio@192.168.1.18"
eht
Successfully created context "eht"
Listing & switch contexts
The context is created (but not in use yet), you can list your contexts (including the default one pointing to local docker server) with this command:
$ docker context ls
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
eht ssh://emilio@192.168.1.18
The selected context is marked with an asterisk after the context name.
To switch between context just run:
$ docker context use eht
eht
Current context is now "eht"
To check is working properly, run any docker command to check which docker server you are connected with, in my case I want to list the swarm nodes, because my selected docker context is the eht cluster:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
2tusd451dit99xa4rqakio7bk docker-01 Ready Active Reachable 19.03.8
bjpao3x71d2vxfd0ale7yzvqg docker-02 Ready Active Reachable 19.03.8
bimgyeacu85cdcc6h77vzqech docker-03 Down Drain 19.03.6
lgmhp6uq54mc52hhnqkvbbzt4 * docker-04 Ready Active Leader 19.03.8
vvgq04cxfojaam59za35o6f7v rasp-01 Ready Active 19.03.8
9xd2s0e4lv4xese3yieol54d0 rasp-02 Ready Active 19.03.8
iqyqky61f04uoh3na6e8qbm0c rasp-03 Ready Active 19.03.8
juwcoql2no9ilj6479wevn88m rasp-04 Ready Active 19.03.8
References
- How to deploy on remote Docker hosts with docker-compose
- Docker Context (official docker reference)
- docker context (official docker command reference)