トラブルシューティング

通常 QuickStart は難しい設定など一切なく利用できます。しかし、いくつかの場合に問題が起こるかもしれません。

エラー例

マシン( docker-machine env default など)に接続しようとする時や Docker Hub からイメージの取得時( docker run hello-world )に、エラーが発生するかもしれません。

エラーは次のように証明書に関するものかもしれません。

Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376": dial tcp 192.168.99.100:2376: i/o timeout

あるいは、証明書の再作成を促すでしょう。

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.

あるいは、ネットワークのタイムアウトを表示するかもしれません。

bash-3.2$ docker run hello-world
Unable to find image 'hello-world:latest' locally
Pulling repository docker.io/library/hello-world
Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/hello-world/images. You may want to check your internet connection or if you are behind a proxy.
bash-3.2$

解決法

正しい状態に戻すために、迅速な解決方法を示します。これらの例では Docker ホストが動くマシンを default と呼びます。

証明書の再作成

エラー発生時、証明書の再作成が指示される場合があります。エラーを出なくするためには、接続可能な証明書の再作成を試みてください。

$ docker-machine regenerate-certs default
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates

Docker ホストの再起動

$ docker-machine restart default

Machine を起動したら、コマンドライン上で環境変数を指定します。

$ eval $(docker-machine env default)

docker-machine ls コマンドを実行し、マシンが実行中であることと、コマンドライン上で通信可能なことを確認します。アクティブなマシン(ACTIVE の列)にアスタリスク(*)が付いているのがわかります。

$ docker-machine ls
NAME             ACTIVE   DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
default          *        virtualbox     Running   tcp://192.168.99.101:2376           v1.10.1

マシンを停止・削除し、あたらしいマシンを作成

$ docker-machine stop default
  Stopping "default"...
  Machine "default" was stopped.

$ docker-machine rm default
  About to remove default
  Are you sure? (y/n): y
  Successfully removed default

docker-machine create コマンドに virtualbox ドライバを指定し、 default という名前のマシン(あるいは任意のマシン名称)を作成できます。

$ docker-machine create --driver virtualbox default
  Running pre-create checks...
  (default) Default Boot2Docker ISO is out-of-date, downloading the latest release...
  (default) Latest release for github.com/boot2docker/boot2docker is v1.10.1
  (default) Downloading
  ...
  Docker is up and running!
  To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env default

環境変数を指定するには、以下のコマンドを実行します。

$ eval $(docker-machine env default)

docker-machine ls コマンドを実行し、マシンが実行中であることと、コマンドライン上で通信可能なことを確認します。アクティブなマシン(ACTIVE の列)にアスタリスク(*)が付いているのがわかります。

HTTP プロキシと接続に関するエラー

HTTP プロキシによって接続に関する特殊なエラーが発生する場合があります。VPN を使うシステム上に Docker Toolbox をインストールしている時、HTTP プロキシを使うと(あるいは企業内のネットワークにおいて)、クライアントがサーバに接続できないというエラーが発生します。

この種のエラーは以下のようなものです。

$ docker run hello-world
An error occurred trying to connect: Post https://192.168.99.100:2376/v1.20/containers/create: Forbidden

$ docker run ubuntu echo "hi"
An error occurred trying to connect: Post https://192.168.99.100:2376/v1.20/containers/create: Forbidden

Docker マシンに HTTP プロキシを設定

Toolbox は仮想マシンを作成するため start.sh を実行します。ここに HTTP_PROXYHTTPS_PROXYNO_PROXY など default machinecreate (作成時)オプションを指定します。

既に作成された Docker Machine (例: default )でも、プライベートのネットワーク上に対応した HTTP プロキシの再設定を行えます。設定を変えると、異なったネットワーク上でも同じシステムを利用可能です。

他にも、仮想マシン内にある /var/lib/boot2docker/profile ファイルのプロキシ設定を自分で直接書き換える方法と、 docker-machine create コマンド実行時にプロキシの指定をする方法があります。

どちらも詳細な方法は、以下で説明します。

Docker マシン上の /var/lib/boot2docker/profile を更新

この問題を解決する方法の1つに、既存マシン上の /var/lib/boot2docker/profile ファイルを編集し、任意のプロキシを指定することです。

ファイルは仮想マシン自身が持っているため、マシンには ssh でログインしてファイルを編集・保存する必要があります。

マシンの設定で``NO_PROXY`` の値を指定すると、ここで指定した環境はプロキシ・サーバを通らないようにします。URL に対して接続の問題が起こる典型的な例が、Docker Machine の URL です。具体的には以下の通りです。

  1. 仮想マシン(例: default )にログインします。

$ docker-machine ssh default
docker@default:~$ sudo vi /var/lib/boot2docker/profile
  1. 以下の例のように、ファイルの末尾に NO_PROXY の設定を追加します。

    # 以下は皆さんのオフィスの PROXY 環境に置き換えてください export "HTTP_PROXY=http://PROXY:PORT" export "HTTPS_PROXY=http://PROXY:PORT" # プロキシを通したくない環境を NO_PROXY で指定します export "NO_PROXY=192.168.99.*,*.local,169.254/16,*.example.com,192.168.59.*"

  1. Docker を再起動します。

仮想マシンの profile を変更したら、Docker を再起動して、マシンからログアウトします。

docker@default:~$ sudo /etc/init.d/docker restart
docker@default:~$ exit

Docker コマンドを再度試します。これで Docker も Kitematic も適切に動作するでしょう。

異なるネットワークに移動する時は(例えば会社のオフィス・ネットワークを離れ、家に帰った時)、 /var/lib/boot2docker/profile の設定を変更し、Docker を再起動します。

マシン作成時に --engine env でプロキシ設定をする方法

自動作成されたマシンの設定を変えると、 default として作成したマシンを削除できます。他の方法として docker-machine create 時に --engine env フラグで任意のプロキシを設定する方法があります。

次の例は default マシンの作成時、PROXY として http://example.com:8080https://example.com:8080 を指定し、 NO_PROXY として example2.com を指定しています。

docker-machine create -d virtualbox \
--engine-env HTTP_PROXY=http://example.com:8080 \
--engine-env HTTPS_PROXY=https://example.com:8080 \
--engine-env NO_PROXY=example2.com \
default

docker-machine create の詳しい使い方は Docker Machine リファレンスの create をご覧ください。