docker
docker-machine

docker-machine上のdockerが突如動かなくなった時の対処法

事象

コマンドを何を打っても x509: certificate has expired or is not yet valid と言われる。env でも ls でもなんでも。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
local   -        virtualbox   Running   tcp://192.168.99.100:2376           Unknown   Unable to query docker version: Get https://192.168.99.100:2376/v1.15/version: x509: certificate has expired or is not yet valid

解決法その1

VMとローカルの時刻がずれている。
ぐぐっても割とこの解決方法が出てくるのであるある事案っぽい。

sudo ntpdate ntp.nict.jp

適当にntpで時刻を合わせれば解決するときもある模様。今回は解決しなかった。

解決策その2

docker-machineと通信するときに使う証明書の期限が切れている

dockerのセットアップ時に作成された証明書は3年の有効期限っぽいので
それを過ぎると突然使えなくなる。

確認方法は以下の通り。めっちゃ有効期限切れとるやんけ!!

$ openssl x509 -in ~/.docker/machine/certs/ca.pem -noout -dates
notBefore=Nov 25 13:28:00 2015 GMT
notAfter=Nov  9 13:28:00 2018 GMT

docker-machine regenerate-certs --client-certs VM名 で証明書は更新できる。

手元の docker-machine では古すぎてhelpに --client-certs がいなかったけど、最新版にupgradeしたら居ました。

$ docker-machine regenerate-certs --client-certs local
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Regenerating local certificates
CA certificate is outdated and needs to be regenerated
Creating CA: /Users/agile/.docker/machine/certs/ca.pem
Client certificate is outdated and needs to be regenerated
Creating client certificate: /Users/agile/.docker/machine/certs/cert.pem
Waiting for SSH to be available...
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...

更新された模様。さっき確認した証明書を再度確認。

$ openssl x509 -in ~/.docker/machine/certs/ca.pem -noout -dates
notBefore=Nov  9 15:01:00 2018 GMT
notAfter=Oct 24 15:01:00 2021 GMT

こっちもおk。ls もエラーが消えました。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
local   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.0