ようへいの日々精進XP

よかろうもん

Docker Toolbox を Windows 8.1 で使う時に色々やったメモ

tl;dl

Docker ToolboxWindows 8.1 にインストール(boot2docker からの移行)してみたが、すんなりいかなかったのでメモしてみた。(ほぼ docker-machine 周りのお話)

尚、詳細は以下のドキュメントに記載されている。


memo

検証環境

f:id:inokara:20150815133916p:plain

既に boot2docker を利用している環境に Docker Toolbox をインストールする。

boot2docker-vm からの移行

意外に時間が掛かるので気長に待とう。

f:id:inokara:20150815133723p:plain

Docker Toolbox のインストールウィザードの最後に boot2docer-vm が存在する場合には移行するか否かを問われるので迷わず移行を選んだは良かったのだが、上記の画面が出るまで(移行完了まで)に 20 分位かかったので気長に待つと良さそう。

Docker Toolbox には Virtualbox も同梱されている

f:id:inokara:20150815134150p:plain

VirtualBox のバージョンは 5.0.1 だった。(2015/08/15 現在)

Docker Toolbox のインストール後は PC の再起動をした方が良さそう

全ての環境でこれが言えるか分からないけど、再起動せずに移行した VM を起動しようとすると以下のようなエラーが出た。(※ MsysGit 環境で実行した結果。)

kappa@KAPPAFACE ~
$ docker-machine.exe start default
Error setting up host only network on machine start: exit status 1
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

PC を再起動することで正常に起動することを確認した。

kappa@KAPPAFACE ~
$ docker-machine.exe ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM
default            virtualbox   Stopped

kappa@KAPPAFACE ~
$ docker-machine.exe start default
Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

docker-machine env で環境変数を確認する

何も考えず(ドキュメントもろくすっぽ読まず)に docker ps を叩くと...

kappa@KAPPAFACE ~
$ docker ps
Get http://127.0.0.1:2375/v1.20/containers/json: dial tcp 127.0.0.1:2375: ConnectEx tcp: No connection could be made because the target machine actively refused it..
* Are you trying to connect to a TLS-enabled daemon without TLS?
* Is your docker daemon up and running?

上記のようなエラーとなるので docker-machine env ${NAME}DOCKER_HOST 等の環境変数を確認する。

kappa@KAPPAFACE ~
$ docker-machine.exe env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://xxx.xxx.xxx.xxx:2376"
export DOCKER_CERT_PATH="C:\Users\kappa\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval "$(c:\Program Files\Docker Toolbox\docker-machine.exe env default)"

コマンドプロンプトの場合には --shell cmd 引数を付けて実行する。

C:\Users\kappa>docker-machine.exe env --shell cmd default
set DOCKER_TLS_VERIFY=1
set DOCKER_HOST=tcp://xxx.xxx.xxx.xxx:2376
set DOCKER_CERT_PATH=C:\Users\kappa\.docker\machine\machines\default
set DOCKER_MACHINE_NAME=default
# Run this command to configure your shell:
# copy and paste the above values into your command prompt

尚、docker-machine config を実行すると docker コマンドの引数として出力してくれるので有り難い。

kappa@KAPPAFACE ~
$ docker-machine.exe config default
--tlsverify --tlscacert="C:\\Users\\kappa\\.docker\\machine\\machines\\default\\ca.pem" --tlscert="C:\\Users\\kappa\\.docker\\machine\\machines\\default\\cert.pem" --tlskey="C:\\Users\\kappa\\.docker\\machine\\machines\\default\\key.pem" -H=tcp://xxx.xxx.xxx.xxx:2376

DigitalOcean に Docker VM マシンを作ってみる

docker-machine ではローカルホストの VirtualBox 以外の VM 環境にも VM を作成、管理することが出来るので DigitalOcean 環境に Docker VM マシンを作成してみたい。

以下のように docker-machine create コマンドを実行して作成する。(※ -D オプションを付けて Debug 出力を有効にしている。)

kappa@KAPPAFACE ~
$ docker-machine -D create \
>   --driver digitalocean \
>   --digitalocean-access-token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
> ocean-vm
Creating SSH key...
Creating Digital Ocean droplet...
Created droplet ID 6599565, IP address xxx.xxx.xxx.xx

(snip)

Using SSH client type: external
About to run SSH command:
if grep -xq 127.0.1.1.* /etc/hosts; then sudo sed -i 's/^127.0.1.1.*/127.0.1.1 ocean-vm/g' /etc/hosts; else echo '127.0.1.1 ocean-vm' | sudo tee -a /etc/hosts; fi
&{C:\Program Files (x86)\Git\bin\ssh.exe [C:\Program Files (x86)\Git\bin\ssh.exe -o PasswordAuthentication=no -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet -o ConnectionAttempts=3 -o ConnectTimeout=10 -i C:\Users\kappa\.docker\machine\machines\ocean-vm\id_rsa -p 22 root@104.236.247.40 if grep -xq 127.0.1.1.* /etc/hosts; then sudo sed -i 's/^127.0.1.1.*/127.0.1.1 ocean-vm/g' /etc/hosts; else echo '127.0.1.1 ocean-vm' | sudo tee -a /etc/hosts; fi] []  <nil> <nil> <nil> [] <nil> <nil> <nil> <nil> false [] [] [] [] <nil>}
SSH cmd err, output: exit status 255:
Error creating machine: exit status 255
You will want to check the provider to make sure the machine and associated resources were properly removed.

マシンを作成したら環境変数を確認してみる。

kappa@KAPPAFACE ~
$ docker-machine.exe env ocean-vm
open C:\Users\kappa\.docker\machine\machines\ocean-vm\ca.pem: The system cannot find the file specified.

上記のようなエラーが出る場合には docker-machine regenerate-certs を実行して証明書、秘密鍵を生成する必要があった。

kappa@KAPPAFACE ~
$ docker-machine.exe regenerate-certs ocean-vm
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates

再度確認。

kappa@KAPPAFACE ~
$ docker-machine.exe env ocean-vm
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://xxx.xxx.xx.xxx:2376"
export DOCKER_CERT_PATH="C:\Users\kappa\.docker\machine\machines\ocean-vm"
export DOCKER_MACHINE_NAME="ocean-vm"
# Run this command to configure your shell:
# eval "$(c:\Program Files\Docker Toolbox\docker-machine.exe env ocean-vm)"

docker コマンドを叩いてみる。

kappa@KAPPAFACE ~
$ docker $(docker-machine config ocean-vm) version
Client:
 Version:      1.8.0
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0d03096
 Built:        Tue Aug 11 17:17:40 UTC 2015
 OS/Arch:      windows/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:35:49 UTC 2015
 OS/Arch:      linux/amd64

尚、今回は触れていないが DigitalOcean 以外にも Amazon EC2 や Azure 等の各種クラウド環境や OpenStack 等の IaaS 環境にも構築出来るので、予算が許す限り試してみたいということで EC2 用のヘルプを掲載。

kappa@KAPPAFACE ~
$ docker-machine.exe create --help 2>&1 | grep amazon
   --amazonec2-access-key                                                                                               AWS Access Key [$AWS_ACCESS_KEY_ID]
   --amazonec2-ami                                                                                                      AWS machine image [$AWS_AMI]
   --amazonec2-iam-instance-profile                                                                                     AWS IAM Instance Profile [$AWS_INSTANCE_PROFILE]
   --amazonec2-instance-type "t2.micro"                                                                                 AWS instance type [$AWS_INSTANCE_TYPE]
   --amazonec2-monitoring                                                                                               Set this flag to enable CloudWatch monitoring
   --amazonec2-private-address-only                                                                                     Only use a private IP address
   --amazonec2-region "us-east-1"                                                                                       AWS region [$AWS_DEFAULT_REGION]
   --amazonec2-request-spot-instance                                                                                    Set this flag to request spot instance
   --amazonec2-root-size "16"                                                                                           AWS root disk size (in GB) [$AWS_ROOT_SIZE]
   --amazonec2-secret-key                                                                                               AWS Secret Key [$AWS_SECRET_ACCESS_KEY]
   --amazonec2-security-group "docker-machine"                                                                          AWS VPC security group [$AWS_SECURITY_GROUP]
   --amazonec2-session-token                                                                                            AWS Session Token [$AWS_SESSION_TOKEN]
   --amazonec2-spot-price "0.50"                                                                                        AWS spot instance bid price (in dollar)
   --amazonec2-ssh-user "ubuntu"                                                                                        set the name of the ssh user [$AWS_SSH_USER]
   --amazonec2-subnet-id                                                                                                AWS VPC subnet id [$AWS_SUBNET_ID]
   --amazonec2-vpc-id                                                                                                   AWS VPC id [$AWS_VPC_ID]
   --amazonec2-zone "a"                                                                                                 AWS zone for instance (i.e. a,b,c,d,e) [$AWS_ZONE]
   --driver, -d "none"                                                                                                  Driver to create machine with. Available drivers: amazonec2, azure, digitalocean, exoscale, generic, google, hyper-v, none, openstack, rackspace, softlayer, virtualbox, vmwarevcloudair, vmwarevsphere

複数の Docker VM マシン環境での運用

以下のように Docker VM マシンが複数作成されているので環境変数を切り替えてアクセスしてみる。

kappa@KAPPAFACE ~
$ docker-machine.exe ls
NAME       ACTIVE   DRIVER         STATE     URL                         SWARM
default             virtualbox     Running   tcp://xxx.xxx.xx.xxx:2376
ocean-vm            digitalocean   Running   tcp://xxx.xxx.xx.xx:23

default の環境にアクセスしてみる。

# default の環境変数をセットする
kappa@KAPPAFACE ~
$ eval $(docker-machine.exe env default)

# docker image を実行
kappa@KAPPAFACE ~
$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
inokappa/fluentd        latest              31062c8970e4        14 hours ago        1.652 GB
hello-world             latest              af340544ed62        8 days ago          960 B

(snip)
ubuntu                  latest              9bd07e480c5b        8 months ago        192.7 MB

centos                  centos6             25c5298b1a36        8 months ago        215.8 MB
centos                  latest              34943839435d        8 months ago        224 MB
kiyoto/fluentd          0.10.56-2.1.1       655fdf622847        9 months ago        1.652 GB

boot2docker からの移行なので既にコンテナイメージが存在している。

次に DigitalOcean の環境にアクセスしてみる。

# --unset オプションで default の環境変数を unset する
kappa@KAPPAFACE ~
$ eval $(docker-machine.exe env default --unset)

# ocean-vm の環境変数をセットする
kappa@KAPPAFACE ~
$ eval $(docker-machine.exe env ocean-vm)

# docker image を実行
kappa@KAPPAFACE ~
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

作りたての Docker VM マシンなのでコンテナイメージは存在していない。

後片付け

ローカルホストの VirtualBox 以外の VM は後片付けしたいので以下のように VM を削除する。

kappa@KAPPAFACE ~
$ docker-machine.exe rm ocean-vm
Successfully removed ocean-vm

以下のように DigitalOcean の VM については削除されていることが判る。

kappa@KAPPAFACE ~
$ docker-machine.exe ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default            virtualbox   Running   tcp://xxx.xxx.xxx.xxx:2376

念の為 DigitalOcean の API でも確認。

kappa@KAPPAFACE ~
$ curl -X GET \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  "https://api.digitalocean.com/v 2/droplets?page=1&per_page=1"
{"droplets":[],"links":{},"meta":{"total":0}}

削除 OK 牧場。


ということで

Docker Toolbox いいなあと思ったところ

  • docker-machine を使えば VirtualBox をはじめ DigitalOcean や EC2 等に Docker VM 環境をサクッと構築できる
  • 必要なツールが一発でインストール出来る

ちょっとツライと思ったところ

  • boot2docker-vm の移行が時間が掛かるなあ(移行中にステータス表示が無いのが辛かった)→何度か中断してしもた
  • VirtualBox のバージョンを選びそう...

マスコット

f:id:inokara:20150815144953p:plain

インストーラーの最初に表示されるマスコットに癒やされる。