docker & vagrant on Ubuntu14.04

今噂の[Docker](http://www.docker.com/whatisdocker/)を[Vagrant](https://docs.vagrantup.com/v2/why-vagrant/index.html)から触ってみました。
Vagrantは[provider](https://docs.vagrantup.com/v2/providers/)としてデフォはVirtualBoxを使いますが、1.6くらいから（正確には不明）dockerがサポートされました。
これの何が嬉しいかというと、Vagrant up した時の起動がとにかく早いです。VirtualBoxだと条件によりますが2.3分かかるのですが、dockerを使うと一瞬で立ち上がります。（初回だけはdocker のイメージをbuildするのに多少時間がかかりますが）

あ、タイトル通りホストがUbuntuの場合の記事です。
MacOSからの場合はnativeでdockerを使えない（docker実行用のLinuxの仮想マシンをかますみたいです）のでちょっと変わるかもしれません。

## Dockerのインストール
Dockerのインストールとかについてはこちらの記事を参照してください。
http://krakenbeal.blogspot.jp/2014/04/docker-0100-ubuntu-1404.html

apt-getでも入れられるようですが、パッケージ名は「docker」ではなく「docker.io」なので注意が必要です。
私はリンク先のcurlで取得したものをsudo shに流し込む方法でやりました。

## dockerグループにユーザーを入れてやる
必須ではないです。が、dockerを実行するたびにsudoをつけるのが面倒な人はやっておくといいかも。

```shell-session
$ gpasswd -a newgyu docker
```

usermod -G でやってハマった人です。ハイ。

## Dockerのイメージ取得
centosのイメージでやりたかったので、「centos」という名前のイメージをpullしました。

```shell-session
$ docker search centos
NAME                                            DESCRIPTION                       STARS     OFFICIAL   AUTOMATED
centos                                          The official build of CentOS.                   162                  
tianon/centos                                   CentOS 5 and 6, created using rinse instea...   22                   
blalor/centos                                   Bare-bones base CentOS 6.5 image                4                    [OK]
$ docker pull centos

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos6             0c752394b855        7 days ago          124.1 MB
centos              latest              0c752394b855        7 days ago          124.1 MB
centos              6.4                 539c0211cd76        14 months ago       300.6 MB
````

## vagrant ssh できるようにする

pullしてきたdockerのイメージはホントに素の状態のcentosでsshが使えない状態だったのでここにつまづきました。
多分、sshが使える状態のimageをpullしてくれば素直にやれると思います。が、Dockerfileの学習も兼ねてやってみたかったので、
http://www.nerdstacks.net/2014/03/ssh-ready-centos-dockerfile/
この辺を参考にして頑張りました。

### Dockerfileの作成

```go:Dockerfile
FROM centos:latest

RUN yum update -y
RUN yum install -y passwd openssh openssh-server openssh-clients sudo 
## Create user
RUN useradd vagrant
RUN passwd -f -u vagrant
## Set up SSH 
RUN mkdir -p /home/vagrant/.ssh; chown vagrant /home/vagrant/.ssh; chmod 700 /home/vagrant/.ssh
ADD  authorized_keys /home/vagrant/.ssh/authorized_keys
 
RUN chown vagrant /home/vagrant/.ssh/authorized_keys
RUN chmod 600 /home/vagrant/.ssh/authorized_keys
## setup sudoers
RUN echo "vagrant    ALL=(ALL)       ALL" >> /etc/sudoers.d/docker

## Set up SSHD config
 
RUN sed -ri 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config

RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop
CMD /usr/sbin/sshd -D
EXPOSE 22
```

ポイントは

1. yumでopenssh-serverを入れる
2. vagrantユーザーで鍵認証でssh接続できるようにする
3. 22番ポートを開ける

です。
sshdを一回起動して停止するのは自分にとってはおまじないですが、ログを見るとsshd_configを読み込んでどうたらしているっぽいのでまぁそういうことだと納得しておきます。

### Vagrantfileの作成

```rb:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.provider "docker" do |d|
    d.has_ssh = true
    d.build_dir =  "."
   d.remains_running = false
  end

  config.ssh.username = "vagrant"
  config.ssh.private_key_path = "vagrant.pkey"
end
```

ポイントは、

1. Vagrantfileと同ディレクトリにあるDockerfileを使ってイメージビルドするように指定
2. sshを使いたい
3. 起動しっぱなしにしとけ指定
4. 接続ユーザーはvagrantユーザー
5. 鍵は所定の場所にあるやつを使う

というところですかね。remains_runningとか無くても動くのかもしれませんが・・・。

## いよいよ実行

```shell-session
$ vagrant up --provider=docker
Bringing machine 'default' up with 'docker' provider...
==> default: Building the container from a Dockerfile...
    default: Image: 19b599c4d574
==> default: Creating the container...
    default:   Name: centos_default_1402991682
    default:  Image: 19b599c4d574
    default: Volume: /home/newgyu/workspace/centos:/vagrant
    default:   Port: 2222:22
    default:  
    default: Container created: 347f7ea987ae242a
==> default: Starting container...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 172.17.0.40:22
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!

$ vagrant ssh
[vagrant@347f7ea987ae ~]$ pwd
/home/vagrant
```

ようやく出来た。

動きとしては、

```shell-session
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              19b599c4d574        About an hour ago   192.6 MB
centos              centos6             0c752394b855        7 days ago          124.1 MB
centos              latest              0c752394b855        7 days ago          124.1 MB
centos              6.4                 539c0211cd76        14 months ago       300.6 MB

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                  NAMES
347f7ea987ae        19b599c4d574        /bin/sh -c '/usr/sbi   2 minutes ago       Up 2 minutes        0.0.0.0:2222->22/tcp   centos_default_1402991682  
```

Dockerfileを使って19b599c4d574というイメージをbuildして、347f7ea987ae242aというコンテナを起動するということか。

一応ファイル一式を下記の場所においておきました。
https://github.com/NewGyu/myfirst_vagrant_docker