さくらのVPSにCoreOSをインストールしてDocker専用機にする

最近 Google Compute Engine でも CoreOS が選択できるようになりましたし、国産VPSでも導入できないかなと思いさくらのVPSに入れてみることにしました。

CoreOS is Linux for Massive Server Deployments
https://coreos.com/

## 事前準備

### ISOイメージのダウンロード

さくらのVPSでは「ISOイメージインストール」でISOイメージをSFTP経由でアップロードし、任意のOSをインストールすることが可能です。

CoreOSのサイトからISOイメージをダウンロードします。
Dockerのバージョンを0.11系を利用したいので、「Alpha Channel」を選択し、「Download Alpha ISO」をクリックしダウンロードします。

ISO - CoreOS
https://coreos.com/docs/running-coreos/platforms/iso/

もちろん、さくらのVPSも新規で申込も済ませておきます。

VPS（仮想専用サーバ）のさくらインターネット
http://vps.sakura.ad.jp/

## ISOイメージのアップロードと起動

VPSコントロールパネルにログインし、左サイドバーから「OS再インストール」をクリックします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/43082/0f939d1c-4ed7-8d59-f16e-646e08e741e7.png)

事前準備でISOイメージを用意していますので、「ISO イメージインストールへ」をクリックします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/43082/7d8674c4-2696-1e59-cf45-91da1986b91d.png)

SFTPでアップロードを行うため、接続用アカウントを作成します。「アカウント作成」をクリックすると、24時間だけ利用できるアカウントが作成されます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/43082/4c8e08ae-c2fa-e11a-a2ac-c9936bbdbdbf.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/43082/c0c7c152-f68b-c7ee-f221-09736fde5e6c.png)

表示されたアカウント情報をもとにアップロードを行います。以下はsftpコマンドを利用する場合の例です。

```shell-session:shell
$ sftp vps000000000000@vps-iso1.sakura.ad.jp
vps000000000000@vps-iso1.sakura.ad.jp's password:
Connected to vps-iso1.sakura.ad.jp.
sftp> cd /iso
sftp> put coreos_production_iso_image.iso
Uploading coreos_production_iso_image.iso to /iso/coreos_production_iso_image.iso
coreos_production_iso_image.iso                     100%  132MB   9.4MB/s   00:14
sftp>
```

アップロードを完了したら、先ほどの「ISOイメージインストール」画面の中ほどにある「ISOイメージ」の「更新」ボタンをクリックします。

ISOイメージに先ほどアップロードしたISOイメージファイル名が表示されていれば問題ありません。画面下部にある「確認」をクリックして進みます。

確認画面が表示されますので、問題がなければ「実行」をクリックします。

実行すると「インストール情報」というページが表示されますので、インストールにはこれらの情報が必要となりますのでメモしておくかページを移動したり閉じずに残しておきます。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/43082/443bf7a1-d726-41ae-5805-7de45189eb12.png)

### cloud-config の準備

CoreOSのネットワークはDHCPがディフォルトとなっているうえに、ログインできるユーザーのパスワードも設定されていないため、何もしなければログインもできません。

インストール時にネットワークの設定、SSHキーの設定を行うため、YAMLファイルを準備しておきます。

```yaml:cloud-config
#cloud-config
 
write_files:
  - path: /etc/systemd/network/static.network
    permissions: 0644
    content: |
      [Match]
      Name=ens3

      [Network]
      Address=<IPアドレス>/<サブネットマスク>
      Gateway=<ゲートウェイ>
      DNS=<DNS1>
      DNS=<DNS2>
 
ssh_authorized_keys:
  - ssh-rsa ABCDABCDABCDABCDABCDABCDABCDABCDABCD...
```

ネットワークの設定は先ほどの「インストール情報」を元に入力を行います。このとき、サブネットマスクはビットで入力する必要がありますので、 `255.255.254.0` の場合は `23` とします。

ssh_authorized_keys にはSSHのログインに利用する公開鍵を指定しますので、お使いの秘密鍵に対応する公開鍵をペースとするか、新規に作りましょう。

## ネットワーク設定とパスワード設定

ネットワーク設定を固定IPアドレスにするため、リモートコンソールで設定を行う必要があります。

HTML版のリモートコンソールはなぜか開けませんので、Javaアプレットモードで開きます。ここで注意が1点あって、MacOS の Chrome では Java のバージョンによってアプレットモードを開くことができません。もし MacOS で開けない場合は Safari から開くと良いでしょう。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/43082/4d0e3332-9df7-c7d3-2b59-5a9ce3427973.png)
![7.png](https://qiita-image-store.s3.amazonaws.com/0/43082/ca8d339f-8350-a026-f1cd-31fac958f098.png)

### ネットワーク設定

`/etc/systemd/network/static.network` をvimで開き、ネットワークの設定を行います。残念ながらコピペが利用できないため、手打ちが必要です。内容はさきほどの `cloud-config` の `write_files` に記載されているものと同じ内容になります。

```
$ sudo vi /etc/systemd/network/static.network
[Match]
Name=ens3

[Network]
Address=<IPアドレス>/<サブネットマスク>
Gateway=<ゲートウェイ>
DNS=<DNS1>
DNS=<DNS2>
```

保存したらネットワークを再起動し、外部への通信が行えるか確認します。

```
$ sudo systemctl restart systemd-networkd
$ wget -O /dev/null example.com
--2014-05-26 19:27:25--  http://example.com/
Resolving example.com... 93.184.216.119
Connecting to example.com|93.184.216.119|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1270 (1.2K) [text/html]
Saving to: '/dev/null'

100%[============================>] 1,270       --.-K/s   in 0s

2014-05-26 19:27:26 (25.2 MB/s) - '/dev/null' saved [1270/1270]
```

ちゃんと通信できていますね。

### パスワード設定とSSHログイン

ここからの作業はVNCコンソールからの入力だと少し辛くなってきます。coreユーザーのパスワードを設定し、SSHログインして作業を進めることとします。ここで設定するパスワードは1度しか使いませんので、なるべく複雑なものがいいでしょう。

```
$ sudo passwd core
Enter the new password (minimum of 5 characters)
Please use a combination of upper and lower case letters and numbers.
New password:
Re-enter new password:
passwd: password changed.
```

パスワードを変更したらSSHでログインできます。

```
ssh core@<IPアドレス>
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'xxx.xxx.xxx.xxx' (RSA) to the list of known hosts.
core@xxx.xxx.xxx.xxx's password:
Last login: Mon May 26 10:16:45 2014
CoreOS (alpha)
Update Strategy: No Reboots
core@localhost ~ $
```

## インストール

### cloud-configのアップロード

インストール時にネットワーク設定とSSH公開鍵を設定するため、先ほどの `cloud-config` をアップロードします。以下はscpでコピーする例です。

```
local) $ scp cloud-config core@<IPアドレス>:~/
```

### インストール

さて、いよいよインストールです。インストールは `coreos-install` コマンドで行います。さくらのVPSでは `/dev/vda` がストレージのデバイスになっているようなので、インストール先に指定します。

先ほどアップロードした `cloud-config` を指定し、Alpha Channel からダウンロードしインストールします。

```
$ sudo coreos-install -d /dev/vda -c cloud-config -C alpha
Downloading and verifying coreos_production_image.bin.bz2...
--2014-05-26 10:21:19--  http://alpha.release.core-os.net/amd64-usr/324.1.0/coreos_production_image.bin.bz2
Resolving alpha.release.core-os.net... 173.194.72.128, 2404:6800:4008:c01::80
Connecting to alpha.release.core-os.net|173.194.72.128|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 172839024 (165M) [application/octet-stream]
Saving to: `/tmp/coreos-install.BpifWMN6ON/coreos_production_image.bin.bz2'

100%[======================================================>] 172,839,024  233K/s   in 12m 3s

2014-05-26 10:33:23 (233 KB/s) - `/tmp/coreos-install.BpifWMN6ON/coreos_production_image.bin.bz2' saved [172839024/172839024]

2014-05-26 10:33:23 URL:http://alpha.release.core-os.net/amd64-usr/324.1.0/coreos_production_image.bin.bz2.sig [543/543] -> "/tmp/coreos-install.BpifWMN6ON/coreos_production_image.bin.bz2.sig" [1]
gpg: Signature made Wed May 21 23:37:02 2014 UTC using RSA key ID 74E7E361
gpg: key 93D2DCB4 marked as ultimately trusted
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: Good signature from "CoreOS Buildbot (Offical Builds) <buildbot@coreos.com>"
Writing coreos_production_image.bin.bz2 to /dev/vda...
  /tmp/coreos-install.BpifWMN6ON/coreos_production_image.bin.bz2: done
Installing cloud-config...
Success! CoreOS alpha 324.1.0 is installed on /dev/vda
```

インストールが完了したら、VPSコントロールパネルから「再起動」を実施します。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/43082/9de54074-9efe-d70c-e2b6-617be5977726.png)

注意が1点あって、`cloud-config` に記載したネットワーク設定がどうやらネットワークを起動した後に動作するようでIPアドレスが設定されないため、起動後しばらくしたあと再度再起動が必要になりました。

## SSHでログインする

```
$ ssh core@<IPアドレス>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Please contact your system administrator.
Add correct host key in /Users/xxxx/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/xxxx/.ssh/known_hosts:xxx
RSA host key for xxx.xxx.xxx.xxx has changed and you have requested strict checking.
Host key verification failed.
```

インストール中にSSHにログインしてしまうと `known_hosts` にホストのキーが書き込まれてしまい、インストール後のホストのキーと違うため接続できなくなってしまいます。初めてのログインだけは `-o 'StrictHostKeyChecking no'` オプションを付けて無視します。

```
$ ssh core@<IPアドレス> -o 'StrictHostKeyChecking no'
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Please contact your system administrator.
Add correct host key in /Users/xxxx/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/xxxx/.ssh/known_hosts:107
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Please contact your system administrator.
Add correct host key in /Users/xxxx/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/xxxx/.ssh/known_hosts:107
CoreOS (alpha)
core@localhost ~ $ 
```

正常にログインできましたね。

## Dockerの動作確認

Dockerで何か動かしてみましょう。手っ取り早く WordPress でも動かしてみることにします。

```
$ docker run -d -p 8080:80 tutum/wordpress
```

上の例ではコンテナの `80` ポートをホストの `8080` に転送していますので、`http://<IPアドレス>:8080` をブラウザで開きます。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/43082/bdbba1be-078d-b6aa-e73e-504dfee51291.png)

![10.png](https://qiita-image-store.s3.amazonaws.com/0/43082/b5d2e8ca-c318-d43f-c160-f185bf94ed73.png)

ばっちり動いています。

## 最後に

途中ネットワークの設定やSSH公開鍵の設定で少し手間がかかりますが、恐らくは CoreOS をリビルドすれば実現可能です。が、IPアドレスが変わるごとにイメージを作る必要があるので、そちらのほうが手間かなと思いましたのでリビルドはしません。

あと、ISOイメージからのインストールはISOイメージにあるアーカイブをインストールするものではなく、インストーラーを起動すると結局CoreOSのインストールイメージをダウンロードしにいくので、ISOイメージはお好きなディストリビューションでもいいと思います。その場合は、インストーラーである `coreos-install` は `https://raw.github.com/coreos/init/master/bin/coreos-install` からダウンロードしたものを利用するといいでしょう。

本当は自宅のMac miniの物理マシン上（いわゆるベアメタル）にインストールしたいのですが、CoreOS のインストーラーはパーティションではなくデバイスを指定する必要があるので、既存のMacOSも残しつつデュアルブートは難しそうです。

といっても Mac は Lion からインターネット経由のOS復元ができるようになっているので、玉砕覚悟でそのうち試してみようと思っています。さっとできそうであれば、またそのレポートを投稿したいと思います。