Vagrant上のCoreOSでRocketを使ってみる入門(Dockerも試してみる)


##はじめに

###Vagrantについて

VagrantはVirtualBoxを簡単に扱うものです。ラッパーという短縮スクリプトという感じのツールという印象です。Dockerに似てる感じはするのですが、バージョン管理的な機能は、Dockerが必要なのかもですね。

###Dockerについて

Dockerは、VirtualBox上に軽量のLinux環境を作り、そのサーバーを操ってDockerコンテナを実行するという感じのものらしいです。Macでは。

ネットワーク周りのデフォルト設定どうなっているのだろうとか考えると、場合によっては、危険かもしれないなあと思いました。

VirtualBoxが用意してくれているコマンドを使えばできることしかやってないので、それ以外でどの辺りが便利になっているのかは、把握できていません。ただ、イメージのバージョン管理あたりが便利になっているような気がしました。

Dockerについては、CentOS上でApacheサーバーを立ち上げるまでをやってみます。

```bash:
$ brew install docker boot2docker

# 補完をダウンロード
$ cd ~/.zsh/functions/
$ curl -OL https://raw.github.com/felixr/docker-zsh-completion/master/_docker
$ exec zsh

$ boot2docker up

$ boot2docker status

$ cat << EOF >> ~/.zshrc
export DOCKER_HOST=tcp://$(boot2docker ip):2375 #boot2dockeripコマンドの結果を設定。
export DOCKER_CERT_PATH=/Users/takaito/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1   
EOF

# イメージをダウンロード
$ docker pull centos:centos6

# イメージ一覧
$ docker images

# 名前をつけてイメージを起動する
$ docker run -t -i -d --name centos6 centos:centos6 /bin/bash

# 名前でイメージにアクセスする
$ docker attach centos6

# Apacheをインストール
$ yum update && yum install httpd && chkconfig httpd on && service httpd start
$ exit

# コミットしていつでも呼び出せるようにする
$ docker commit centos6 syui/centos6-apache

# バックグラウンドで保存したコミットを起動
docker run -t -i -d -p 80:80 --name centos6-up syui/centos6-apache /sbin/init

# 立ち上げたサーバーにアクセスしてみる
$ ping `boot2docker ip`
$ w3m `boot2docker ip`
```

###CoreOSについて

CoreOSは、コンテナという概念を用いて運用するOSのことです。コンテナは、使い捨てと独立という要素を意味する感じです。OS自体は、Gentoo Linuxのような必要最小限の構成と、独自の安全なセキュリティアップデートを採用している感じですね。


###Rocketについて

Rocketは、Dockerの代わりに採用されたものという感じでしょうか。仮想環境の構築運用支援ツール。

> Dockerのforkとしなかった理由については、「全てが中央のデーモン（プロセス）を通じて実行されるDockerの処理モデルには、セキュリティと再利用性において根本的な欠陥がある。こうした問題に対応しないまま、Dockerの破綻したセキュリティモデルをサポートし続けることはできない」と言い切っている。

http://www.atmarkit.co.jp/ait/articles/1412/02/news108.html

###リンク

[Vagrant](https://www.vagrantup.com/)

[Docker](https://www.docker.com/)

[CoreOS](https://coreos.com/)

[Rocket](https://github.com/coreos/rocket)

[actool](https://github.com/appc/spec)

[golang](https://github.com/golang/go)

###目標の設定

Vagrantを使って、仮想環境にCoreOSを作り、Rocketを使って、コンテナを作り、そこに、http-serverを立ち上げて、アクセスするという感じになります。

##Vagrant

```bash:
# vagrantのインストール
$ brew tap phinze/homebrew-cask
$ brew install brew-cask
$ brew cask install vagrant

# coreosイメージの作成と接続
$ git clone https://github.com/coreos/coreos-vagrant/
$ cd coreos-vagrant
$ vagrant up
$ vagrant ssh
```

##CoreOS

```bash:
# rocket(rkt)のインストール
$ wget https://github.com/coreos/rocket/releases/download/v0.2.0/rocket-v0.2.0.tar.gz
$ tar xzvf rocket-v0.2.0.tar.gz
$ ./rocket-v0.2.0/rkt help

# actoolのインストール
$ wget https://github.com/appc/spec/releases/download/v0.1.1/appc-spec-v0.1.1.tar.gz
$ tar zxf appc-spec-v0.1.1.tar.gz
$ ./appc-spec-v0.1.1/actool --help

# golangのインストールと設定
$ wget https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz
$ sudo mkdir /opt
$ sudo tar zxf go1.3.3.linux-amd64.tar.gz -C /opt/

$ touch ~/.bash_profile && cat << EOF >> ~/.bash_profile
export GOROOT=/opt/go
export GOPATH=~/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
EOF

$ mkdir ~/go
$ exec $SHELL -l
$ go version

# actoolでコンテナを作ります
$ git clone https://github.com/syui/hello-aci
$ CGO_ENABLED=0 GOOS=linux go build -a -tags netgo -ldflags '-w' hello-aci/rootfs/bin/hello.go
$ mv hello hello-aci/rootfs/bin/
$ rm -rf hello-aci/.git
$  ./appc-spec-v0.1.1/actool build hello-aci/ hello.aci

# rktでコンテナを起動します
$ sudo ./rocket-v0.1.1/rkt --debug run hello.aci
```

コンテナを落としたいときは、`C-]`を3回押します。

###Mac

Macに戻って、新しい端末にて以下を実行し、サーバーにアクセスします。

```bash:
# coreosに入り、ローカルホストのポート5000にアクセスする
$ vagrant ssh
$ curl 127.0.0.1:5000
```

サーバー側ではログが残ります。