みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

MacOSやWindowsからsshでDockerを操作する

計算用のDocker Engineサーバーを別の場所に用意して,リビングのソファーでリラックスしながら、MacOSやWindowsのノートパソコンでDokerを操作したいと思ったので,方法をまとめます.

以下ではDocker Engineを実行するリモートサーバーと,Docker Clientを実行するローカルマシンを用意してDockerを使えるようにします.

Docker Engineサーバーを用意

それなりのスペックのPCでUbuntu Serverを用意して,Docker daemonを実行します.詳細は別の記事で紹介しています.

Ubuntu Serverにrootless Dockerをインストールする - みーのぺーじ

ホスト名の設定とmDNSの有効化

IPアドレスを管理するのは面倒なので,ホスト名でアクセスできるようにします.まずはホスト名を設定します.

$ hostnamectl set-hostname mt-server
$ hostname
mt-server

mDNSを有効にします.avahiをインストールしてサービスを有効にします.

avahi - mDNS/DNS-SD

sudo apt install avahi-daemon
systemctl status avahi-daemon

ホスト名でアクセスできるようになったか確認して完了です.

% ping mt-server.local
2 packets transmitted, 2 packets received, 0.0% packet loss

公開鍵暗号方式でSSHにログイン

環境変数DOCKER_HOSTを利用する場合,DockerはSSHにログインするパスワードの入力に対応していないので,公開鍵暗号方式でログインする設定にします.

MacOS

~/.zshrcに以下の内容を追加して,環境変数DOCKER_HOSTを登録します.

DOCKER_HOST=ssh://mt@192.168.1.4

以下のコマンドは,mtという名前のMacOS上のユーザーで鍵を生成して,それをIPアドレス192.168.1.4のUbuntu Serverにコピーするコマンドです.

% ssh-keygen -t ecdsa
...
Your identification has been saved in /Users/mt/.ssh/id_ecdsa
Your public key has been saved in /Users/mt/.ssh/id_ecdsa.pub
...
% ssh-copy-id -i ~/.ssh/id_ecdsa.pub mt@192.168.1.4
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/mt/.ssh/id_ecdsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
...
Number of key(s) added:        1
Now try logging into the machine, with:   "ssh 'mt@192.168.1.4'"
and check to make sure that only the key(s) you wanted were added.

ssh-copy-idとは,sshを使用してリモートマシンにログインして,指定した鍵でログインできるよう~/.sshなどを自動で書き換える,便利なスクリプトです*1

sshでホスト名とユーザー名のみでログインしてみて,パスワードを要求されなければ完了です.

Windows

環境変数の編集画面を開いて,以下の内容を追加します.

DOCKER_HOST=ssh://mt@192.168.1.4

PATH=<dockerコマンドのディレクトリ>

Windowsにはssh-copy-idに相当するコマンドはなさそうなので,PowerShellで以下のコマンドを実行します*2

cat $env:USERPROFILE/.ssh/id_rsa.pub | ssh mt@192.168.1.4 "umask 077; test -d .ssh || mkdir .ssh ; cat >> ./.ssh/authorized_keys || exit 1"

sshでホスト名とユーザー名のみでログインしてみて,パスワードを要求されなければ完了です.

Docker CLIをインストール

以下のウェブサイトからダウンロードします.

https://download.docker.com/

GitHub - docker/cli: The Docker CLI

/user/local/bin/などに移動して実行できるようにすれば,Docker CLIが使えるようになります.

% docker version
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Client:
 Cloud integration: v1.0.22
 Version:           20.10.13
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 10 14:08:44 2022
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      true

Docker Contextを使用する

リモートサーバーにアクセスする設定を毎回行うのは面倒です.Dockerにはこのような設定をまとめるcontextという機能があるので,利用します.

Docker Context | Docker Documentation

初回だけ新規にcontextを作成します.

% docker context create remote --docker "host=ssh://mt@mt-server.local"
remote

編集するならばupdate,一覧表示するならlsを実行します.

% docker context update remote --docker "host=ssh://mt@mt-server.local"
% docker context ls

contextを使用するにはuseを実行します

% docker context use remote
remote

これでリモートマシンでDockerを使えるようになりました. docker versionを実行すると以下のようになり,Docker Clientはdarwin/amd64,Docker Engineはlinux/amd64と別々のマシンで実行できていることが分かります.

% docker version
Client:
 Cloud integration: v1.0.22
 Version:           20.10.13
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 10 14:08:44 2022
 OS/Arch:           darwin/amd64
 Context:           remote
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:46:12 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0