Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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」を含むようなエラーが出ていたら証明書を再生成しています。


以上です。

hidekuro
雑食。私がQiitaで公開する独自コードは、特に記載がない限り CC0 https://creativecommons.org/publicdomain/zero/1.0/deed.ja とします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away