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は日進月歩でなかなか本は手に取りづらいけど):