Hyper-V上にBoot2DockerをインストールしてMacからつないでみた

2015.08.20

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。
とある案件でDockerを使った環境を使う機会があり、
自宅のMacbook Airにも環境を作ろうとしたらこの仕打ち。

blog20150818_2-1

いや、我が家にはWindows 8.1機がある。
Windows 8.1にはHyper-Vが導入できる。
Hyper-V上でBoot2Docker動かしてMacから繋いでみれば良いのでは?
といった経緯で環境を構築してみました。

構成図

Windows 8.1(Hyper-V)上にゲストOSとしてBoot2Dockerを導入し、
Macから操作すると言った流れになります。

Docker-Machineを用いて作成する事もできそうなのですが、
自分の環境ではうまく行きませんでした。
そのため、今回は手動で構築していきます。

Boot2Dockerの導入

Hyper-V 導入

Windows 8.1へのHyper-Vの導入は省略します。
マシンのCPU要件さえ満たしていれば導入は問題なく行えるはずです。
クライアント Hyper-V を使用して Windows 8 で仮想マシンを実行する - Windows ヘルプ

仮想スイッチの作成

外部ネットワークを接続先とするスイッチを作成しておきます。

ゲストOS作成

仮想マシンの新規作成ウィザードにそって進めていきます。

  • 仮想マシンの世代は第1世代とします。
  • メモリに関しては任意に割り当ててください。 起動するコンテナ数に応じてって事になるかと思います。
  • 仮想HDDの形式はVHDはVHDX形式で問題ありません。
  • ネットワークは先ほど作成した仮想スイッチを使います。
  • ディスクイメージとしてBoot2DockerのISOイメージを選択します。

ここまでできた段階で起動します。
起動さえしてしまえばMac上からSSHでつないで以下の作業は実施可能です。
なお、秘密鍵を用いない場合の接続情報は以下のようになります。

ユーザー名 docker
パスワード tcuser

パーテーションの作成・フォーマットの実施

Boot2Dockerはboot2docker-dataといったラベルがついている
ext4かbtrfsでフォーマットされたパーテションを自動でマウントするとのことなので、
そういったパーテーションの作成・フォーマットを実施していきます。

以下に私がやった例を載せておきます。

パーテーション作成

docker@boot2docker:~$ sudo fdisk /dev/sda
Device contains neither a valid DOS partition table, nor Sun, SGI, OSF or GPT disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that the previous content
won't be recoverable.


The number of cylinders for this disk is set to 16578.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-16578, default 1): Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-16578, default 16578): Using default value 16578

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table

フォーマットの実施

docker@boot2docker:~$ sudo mkfs.ext4 -L boot2docker-data /dev/sda1
mke2fs 1.42.12 (29-Aug-2014)
/dev/sda1 alignment is offset by 512 bytes.
This may result in very poor performance, (re)-partitioning suggested.
Discarding device blocks: done
Creating filesystem with 33290688 4k blocks and 8323072 inodes
Filesystem UUID: 58918b9f-5d25-4a0c-b875-0bb703d332a3
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

なお、ここではマウントを実施していないため、一度再起動してマウントさせてます。
また、再起動した際に、公開鍵が再度作られているので、
sshでログインする場合は~/.ssh/known_hostの内容を消す等しておく必要があります。

/home/docker の永続化

上記でディスク領域を作成したので、作ったコンテナ等は保存されるのですが、
/home/dockerが起動するたびに消えてしまうので、永続化する必要があります。

docker@boot2docker:~$ sudo su -
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
root@boot2docker:~# cat > /var/lib/boot2docker/bootlocal.sh <<EOF
> echo "tar cf /var/lib/boot2docker/userdata.tar . -C /home/docker/" >> /opt/shutdown.sh
> EOF
root@boot2docker:~# chmod +x /var/lib/boot2docker/bootlocal.sh

なお、上記の設定はBoot2Docker起動時に、
Boot2Docker終了した際にuserdata.tarを作ると言った設定を行っているため、
一度再起動させておきます。

正しく設定できていれば/home/dockerにファイルを作成後、
Rebootしても問題なく復元されるはずです。
確認してみたいと思います。

docker@boot2docker:~$ touch fileRestoreCheck
docker@boot2docker:~$ ls
fileRestoreCheck
docker@boot2docker:~$ sudo reboot
再起動実施後
docker@boot2docker:~$ ls
fileRestoreCheck

ファイルが再起動後も配置されている事が確認できました。

秘密鍵の設定

様々な方法があるとは思いますが、
Docker上で秘密鍵・公開鍵を作成しMac側は作った秘密鍵を用います。

docker@boot2docker:~$ ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/docker/.ssh/id_ecdsa):
Created directory '/home/docker/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/docker/.ssh/id_ecdsa.
Your public key has been saved in /home/docker/.ssh/id_ecdsa.pub.
The key fingerprint is:
50:37:1a:85:1c:79:97:7a:03:10:05:e4:5a:ab:77:9d docker@boot2docker
The key's randomart image is:
+--[ECDSA  521]---+
|       oOX=  .   |
|       o++o.o    |
|      . +. +     |
|       + .. o    |
|      . S  . .   |
|       .   . .   |
|      . . . E    |
|       . .       |
|                 |
+-----------------+
docker@boot2docker:~$ mv ./.ssh/id_ecdsa
id_ecdsa      id_ecdsa.pub
docker@boot2docker:~$ mv ./.ssh/id_ecdsa.pub ./.ssh/authorized_keys
docker@boot2docker:~$ chmod 600 ./.ssh/authorized_keys

Macからの接続

接続を行うMacはDocker Docker-machineの導入と、
OpenSSHの更新を行い、ECDSAでログインができる環境を前提とします。
なお、DockerとDocker-machineはHomebrewから導入が可能です。
OpenSSHの更新については下記のサイトを参考にしました。
How to Update OpenSSH on Mac OS X | Dctr Watson

Dockerの登録

先ほど作った秘密鍵を取得し、
取得した秘密鍵でdocker-machineからdockerの登録を行います。

$ scp docker@192.168.11.106:~/.ssh/id_ecdsa ./.ssh/docker_ecdsa
$ docker-machine create -d generic --generic-ssh-user docker --generic-ssh-key ~/.ssh/docker_ecdsa --generic-ip-address 192.168.11.106 hyper-v
$ eval "$(docker-machine env hyper-v)"
$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 19:45:58 UTC 2015
 OS/Arch:      darwin/amd64

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

Dockerコンテナの作成・アクセスの実施

コンテナの作成まで問題なく行えていれば、
以下でブラウザにNode-REDの画面が表示されます。

$ docker run –d –p 1880:1880 node-red
$ docker-machine ip hyper-v
192.168.11.106
$ open http://192.168.11.106:18080

blog20150818_2-2

さいごに

Dockerのインストールまで行えてしまえば、
どこの環境に入っているかと言った事はほとんど意識する必要がなく使えます。

VirtualBoxの機能を用いたSharedFolderの機能が無い点は注意が必要です。

参考サイト

Getting Docker Running on Hyper-V 8.1/ 2012 R2 | CloudExpert Tackling your needs for success boot2dockerのデータ永続化まとめ - Qiita