Posted at

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