docker-machineの使用をやめる。
複数ホストから同一のリモートのdockerを使おうと思った。苦労して(machine-shareを使って)もう一台の方へdocker-machineのmachine設定を移した。
しかし結局docker desktop (wsl2 backend)とdocker-machineの相性が悪いようでdockerコマンドが使えなくなったのでこれは断念した。その代わりにsshコマンドを使ってアクセスすることにした。
要約
docker-machineのmachine設定はmachine-shareで移せる。
windowsのwsl2環境では、docker desktopをwsl2バックエンドで使用していると、eval $(docker-machine env machine)してもdockerコマンドが使えない。使うとdocker desktopの方が落ちる。
docker-machineを使わないならsshでいい。
machine設定を移す
自分の環境の場合移しても使えなかったが、wsl2でないlinux環境なら使えると思うので、一応メモしておく。
docker-machineのmachine設定を移すのには、machine-shareというnpmパッケージを利用したので、nodeをインストールする必要がある。
machine-shareはdocker-machineのmachineに必要なファイル(主に証明書の類)を保管場所から取り出してzipでまとめたり、その逆ができるツール。docker-machineのコマンドとして存在しないのが不思議。
machine-share:
nodeが使える必要があるが、真っ白な環境でnodeをセットアップするなら、anyenvを入れてnodenvを入れるのに良い機会なのでそのようにした。anyenvのインストールは下部リンクのManual git checkoutの項目に従っただけなので省略する。
anyenv:
設定のエクスポート
nodeの準備ができていれば、
$ npx -p machine-share machine-export <machine-name>
で<machine-name>.zipが出力される。そしてこのzipファイルを新しくdocker-machineを使うPCに移動しておく。
npxは相変わらず便利だ。パッケージ名とコマンド名が違っても-pオプションでパッケージを指定できるので問題ない。
設定のインポート
基本的には別のPCで行うだろうから、やはりnodeの準備を行っておく。準備が済んだら、
$ npx -p machine-share machine-import <machine-name>.zip
$ # 確認
$ docker-machine ls | grep <machine-name>
... # リストにあるはず
これでインポート完了。
使えなかったら諦めてsshを使う
自分の環境のようにmachine-shareで移しても使えなければ、docker-machineの使用を諦めるしかないと思う。
もしかしたら設定次第ではなんとかなるのかも知れないが、私はあきらめた。
違う方法で複数環境からアクセスするなら、やはりsshでしょう、ということで代わりにsshが使えるように設定する。
sshのことはそこいら中にネットの海に書いてあるが、要点だけここにも書いておくとしよう。
パスワードログインはせず、公開鍵認証でログインするので、ここでは鍵の生成・配置と/etc/ssh/sshd_configの設定を記録しておく。リモートはcentos7。
ローカル側の設定
ローカルで鍵を生成しておく。
$ # 基本的にはお好みで。
$ ssh-keygen -t rsa -b 4096
$ ssh-keygen -t ecdsa -b 521
$ ssh-keygen -t ed25519
rsaならどの環境(古くても)でも使える。素因数分解はそのうち破られる(もう破れてるのかも)ので個人的には下2つ、互換性の観点からは真ん中のecdsaがおすすめ。ほとんどの環境で使える。
鍵の保存場所はどこでもいいが、大抵の場合は~/.ssh/にする。id_<algorithm>とid_<algorithm>.pubの2つが生成されて、リモートには、.pubの方を登録しておく必要がある。
今回は、~/.ssh/mykeyと~/.ssh/mykey.pubが生成されたとする。
ローカル側でssh-id-copyが使えるなら、前述の作業は、
$ ssh-copy-id -i ~/.ssh/mykey <user>@<host>
これだけで済む。
ssh-id-copyができない場合はリモート側の~/.ssh/authorized_keysに公開鍵を追記(なければ作成)しておく必要がある。先のはこの辺りを自動でしてくれる。リモート側の~はもちろん<user>@<host>の<user>のディレクトリ。
参考:

リモート側の設定
公開鍵の設定と、/etc/ssh/sshd_configの設定を行う。
ssh-id-copyで公開鍵の設定ができなければ、それを行う。リモート側の~/.ssh/authorized_keysに公開鍵を追記(なければ作成)しておく。パスワードログインするなどして、追記・作成する。
/etc/ssh/sshd_configの設定は、ポート、パスワードログインの禁止を行う。抜粋:
# デフォルトは22
Port xxxxx
# 早めにnoにしておくべき
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication no
ポートはxxxxxに変更。デフォルト22のままではカモにされるので。
公開鍵認証の設定が済んだら下の3つはnoにする。
設定が済んだらsshdのリスタートを忘れずに。sudo systemctl restart sshdなど。
ログインしてみる
一応ログインのためのコマンドを書いておく。
$ ssh -i ~/.ssh/mykey -p xxxxx <user>@<host>
ログインできればOK。
公開鍵認証でパスフレーズを聞かれるのが面倒(Enter passphrase for key '~/.ssh/mykey':が表示される)なら、
$ ssh-add ~/.ssh/mykey
$ # 上のが失敗するなら下を実行してもう一度する。
$ eval $(ssh-agent)
wsl2だとeval $(ssh-agent)も必要だった。これをしておかないとssh-addしても、Could not open a connection to your authentication agent.と表示される。
おわり
docker-machineはdocker環境を作る分には楽だけど運用を考えるとあまり適さない感じだなぁと痛感した。
リモートのdocker環境さえ用意すればdocker-machineはなくても問題無い事がよくわかった。
やはりsshは便利。docker-machineも半分sshみたいなものだし。
以上です。
広告(Dockerは日進月歩でなかなか本は手に取りづらいけど):


