Ubuntu 14.04 LTS  Dockerによるrails環境構築（ハンパ版）

~~【注意】まだコンテナ外部から接続できてません。
tcp6でバインドされててうまくつながらない。
回避策調べて追記します。~~

【追記 11/26】
rails server 起動コマンドで外部から接続するよーに指定してなかっただけでした
超なやんだのに何だったんだ


## 1.動機

故あってUbuntu 14.04 LTS上でDocker環境でrails環境作ることにしました



## 2.Docker環境のインストール

基本的に[公式ドキュメント](https://docs.docker.com/engine/installation/ubuntulinux/)通りに実施する。

- 1.バージョン確認

```bash
$ uname -r
3.13.0-68-generic
```
公式ドキュメントには
>your kernel must be 3.10 at minimum

とあるので、うちの環境だと問題ないみたい。

- 2.aptのアップデートと設定

最新のdockerを手に入れるためには、リポジトリの設定をしなければならんようです。

```bash
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
(中略)
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
$
```
とgpg keyを加えたあと、

```
/etc/apt/sources.list.d/docker.list
```
を編集するなり、なければ作れ、とある。

うちだと、

```bash
$ pwd
/etc/apt/sources.list.d
$ ls
$
```
なかったので、viで作る。

```
deb https://apt.dockerproject.org/repo ubuntu-trusty main
```

うちは14.04 LTSなので上記。他のバージョンだと違うので、[公式ドキュメント](https://docs.docker.com/engine/installation/ubuntulinux/)を参照。

aptをアップデートして、

```bash
$ sudo apt-get update
```

apt-cacheを実行。

```bash
$ sudo apt-cache policy docker-engine
```

linux-image-extraを入れろ、とおすすめされているので、それを入れる。

```bash
sudo apt-get install linux-image-extra-$(uname -r)
```

うちだと、already the newest versionと出た。

- 3.dockerインストール

いよいよdockerのインストール実施。

```bash
sudo apt-get install docker-engine
```

- 4.dockerサービス起動

```bash
$ sudo service docker start
```
すでに動いてるよ、と怒られた。

- 5.docker起動確認

```
$ sudo docker run hello-world
(中略)
Hello from Docker.
This message shows that your installation appears to be working correctly.
(中略)
$

$docker images
(中略)
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              0a6ba66e537a        6 weeks ago         960 B
(中略)
```

とりあえず動いてはいるようですね。

- 6.Dockerを常にsudoで動かすのは都合悪いので、ユーザーグループ追加

```bash
$ sudo usermod -aG docker (ユーザ名）
```

- 7. 一度ログアウト
- 8. sudoなしでdockerコマンド実行

```bash
$ docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.
(後略)
```
いい感じにできた。

```bash
$ docker --version
Docker version 1.9.1, build a34a1d5
```

上記のとおり、1.9.1がインストールできている。

## 3.元となるimageのpull

docker pullコマンドを実行して、imageをひっぱってくる。
[docker hubのubuntuページ](https://hub.docker.com/_/ubuntu/)みると、

>14.04.3, 14.04, trusty-20151028, trusty, latest (trusty/Dockerfile)

とタグ設定あるので、まあせっかくなんでウチの環境

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"
```
と合わせたやつを持ってきましょう。自分でイメージ作っちゃえばいいんですけどね。

```bash
$docker pull ubuntu:14.04.3
$
```
```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04.3             e9ae3c220b23        2 weeks ago         187.9 MB
hello-world         latest              0a6ba66e537a        6 weeks ago         960 B
```

軽く起動してみて、ちゃんと動くかどうか確認。

```bash
$ docker run -it ubuntu:14.04.3 /bin/bash
root@95bd14488f51:/#
# uname -a
Linux 95bd14488f51 3.13.0-68-generic #111-Ubuntu SMP Fri Nov 6 18:17:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
(ctrl+p, ctrl+qでプロセスぬける）
$
(ホストに戻る）
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b7765856679a        ubuntu:14.04.3      "/bin/bash"         11 seconds ago      Up 11 seconds                           loving_bell
$
```

ついでにexecコマンドを実施。

```bash
$ docker exec -it b7765856679a bash
root@b7765856679a:/#
```

ちゃんと動いてるみたいなので、後始末。

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b7765856679a        ubuntu:14.04.3      "/bin/bash"         3 minutes ago       Up 3 minutes                            loving_bell
$docker stop b7765856679a
b7765856679a
$
```

以上でとりあえず動くことは確認でけた。

## 4.Dockerfile


以下、[Techscoreさんのサイト](http://www.techscore.com/blog/2014/08/18/rails-development-on-docker/)を参考に実施。

mysqlは別サーバに設定することにし、コンテナへはdocker execで入ることにする。
コンテナ内だとプロセス切るごとあじゃぱーになって泣くので、ワークスペースは外部でマウント。

dockerfileを書いて、docker内部でrails4環境を作る。
まずは一般ユーザで/home/rails/workspaceを作っておいてから、以下の記述。

```bash
FROM ubuntu:14.04.3
MAINTAINER kentakuma<hogehogehoge@gmail.com>

# 基本的パッケージを導入

ENV TERM $TERM:xterm
RUN apt-get update
RUN apt-get install -y build-essential wget curl git
RUN apt-get install -y libffi-dev
RUN apt-get install -y zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev
RUN apt-get install -y sqlite3 libsqlite3-dev
RUN apt-get clean

#ruby-buildの導入
RUN git clone https://github.com/sstephenson/ruby-build.git .ruby-build
RUN .ruby-build/install.sh
RUN rm -fr .ruby-build

# ruby　2.2.1のインストール
RUN ruby-build 2.2.1 /usr/local

# bundlerの導入
RUN gem update --system
RUN gem install bundler --no-rdoc --no-ri

# railsコマンドを実行したときのエラー抑止用
RUN apt-get install -y software-properties-common

RUN add-apt-repository ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y gcc-4.9 g++-4.9
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 100 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9

RUN gem install libv8 -v '3.16.14.11' -- --with-system-v8
RUN bundle config build.libv8 --with-system-v8

# railsのインストール
RUN gem install rails --version="~> 4.2.3" --no-ri --no-rdoc


RUN mkdir ~/workspace
EXPOSE 3000
VOLUME /home/rails/workspace
```

[ここらへん](https://github.com/rbenv/ruby-build/issues/690)も助けになりました。

Dockerfileのビルド実施。

```bash
$ docker build -t ubuntu/rails:0.0 .
```

だいぶ待ちます。とくにrubyのインストール中。


## 5.Docker起動

-vオプションで永続化ファイルを指定しつつdocker imageの起動実施。

```bash
docker run -v /home/rails/workspace:/root/workspace -it -p 3000:3000 ubuntu/rails:0.0 /b
in/bash
```

## 6.railsコマンド実行

/root/workspaceがワークスペースになっているので、そこでrailsで動かしてみる。

```bash
# rails new test_mogemoge
(中略)
Installing sdoc 0.4.1
Installing spring 1.4.4
Installing sqlite3 1.3.11 with native extensions
Installing turbolinks 2.5.3
Installing uglifier 2.7.2
Installing web-console 2.2.1
Bundle complete! 12 Gemfile dependencies, 53 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted

# cd test_mogemoge

```

Gemfileで、以下をコメントイン

> \# gem 'therubyracer', platforms: :ruby
>→
>gem 'therubyracer', platforms: :ruby


```

# bundle install    #rootでやるなと怒られる
# rails g controller welcome index
      create  app/controllers/welcome_controller.rb
       route  get 'welcome/index'
      invoke  erb
      create    app/views/welcome
      create    app/views/welcome/index.html.erb
      invoke  test_unit
      create    test/controllers/welcome_controller_test.rb
      invoke  helper
      create    app/helpers/welcome_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/welcome.coffee
      invoke    scss
      create      app/assets/stylesheets/welcome.scss
# rails server　　→【11/26追記】これだとコンテナ外部からつながらないので、外部からアクセスしたい場合は
# rails server -b 0.0.0.0
```

と、とりあえず動いたチック。



## 課題
- Mysqlとの連携
- libv8とtherubyracer問題のDockerfile上での回避
- Webricだとあれなのでnginxあたり導入
- 何故かportがtcp6でバインドされてるので回避策。このままだと外部からつながらない！→できました。tcp6でバインドされてたんじゃなくて、ip4/6の両方とも受け付ける設定になってただけみたい。