Posted at

Docker Machine 複数利用時のIP変動による Error checking TLS connection 対策

More than 3 years have passed since last update.


TL;DR

docker-machine の各種コマンド実行時に TLS 接続エラーになったら

docker-machine regenerate-certs マシン名 すれば OK


事象

複数の docker machine を生成して利用していると、マシンを起動した順で 192.168.99.100 から順に末尾 101, 102, ... とIPアドレスが割り当てられます。

各 VM に対して docker-machine コマンドが SSH 接続してアレコレするわけですが、起動順序の関係で前回接続時と IP アドレスが変わっていると Error checking TLS connection となって docker-machine env などができなくなります。

例えば defaultmyapp の2つのマシンがあり、 docker-machine start する順序が前回と違ったりすると

[hidekuro@localhost]~$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myapp - 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 is valid for 192.168.99.101, not 192.168.99.100
default - virtualbox Stopped Unknown

エラっている。 myapp の証明書はホスト 192.168.99.101 用だから 192.168.99.100 では使えないぞーと言われてます。

この状態で docker-machine env myapp を実行しても

[hidekuro@localhost]~$ docker-machine env myapp

Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376": x509: certificate is valid for 192.168.99.101, not 192.168.99.100
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.

この通り失敗しますが、その下に案内が出ています。


対策

案内に従って docker-machine regenerate-certs マシン名 で TLS 証明書を再生成します。

[hidekuro@localhost]~$ docker-machine regenerate-certs myapp

Regenerate TLS machine certs? Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
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...

更新されたっぽい。

[hidekuro@localhost]~$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myapp - virtualbox Running tcp://192.168.99.100:2376 v1.11.1
default - virtualbox Stopped Unknown

[hidekuro@localhost]~$ docker-machine env myapp
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\develop\.docker\machines\myapp"
export DOCKER_MACHINE_NAME="myapp"
# Run this command to configure your shell:
# eval $("C:\ProgramData\chocolatey\lib\docker-machine\bin\docker-machine.exe" env myapp)

エラーもなくなりました。

頻繁にいろんなマシンを切り替えて作業する場合は、次のように関数化しておくと便利かも。

function docker-machine-start() {

docker-machine start $1

if (docker-machine env $1 2>&1 | grep -q 'regenerate-certs'); then
docker-machine -f regenerate-certs $1
fi
}

マシン起動後に docker-machine env を試し撃ちして、「regenerate-certs」を含むようなエラーが出ていたら証明書を再生成しています。


以上です。