今話題のDocker + Rails + Circle CI + Terraform構成を試したいんじゃ！

#概要
[Docker + Rails + Circle CI + Terraformでインフラをコードで環境構築 & ECSへ自動コンテナデプロイ](https://qiita.com/kazukimatsumoto/items/fa448e002b0afd441b7c)
上記ページを閲覧してみて心が踊ったので、実際に試そうと思ったけど
そもそもチュートリアルの環境がないので1から作ってみたメモ。
いや、ほんにこういう記事ってありがたいよね。としみじみ。

#これからやること
・(主にサーバーサイドの)アプリをDockerを使って環境構築して
・terraformでインフラの構成をコード化して
・(Kubernetesなどのコンテナオーケストレーションツールを用いて)なるべく開発環境との差異が無いままコンテナデプロイをして
・CircleCIでテストからデプロイまで自動化
※引用

今の現場だと触ることのできない構成（＝ナウい構成）なのでワクワクしながら始める。
本記事では元記事のページ内容を実行できる環境を構築していきます。
拙い内容になるかと思いますので、修正点などありましたらコメントお願いします。

#用語集
普段はインフラ構築（物理サーバ、スイッチ）の構築をメインとしているので
まずは知らない用語を調べてみる
###rbenv とは？
Ruby のバージョンを管理してくれるバージョン管理システム


[rbenv を利用した Ruby 環境の構築](https://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)

###ruby-build とは？
rbenv のプラグイン
rbenv install コマンドを提供する rbenv のプラグインとして利用できます。

[rbenv + ruby-build はどうやって動いているのか](https://takatoshiono.hatenablog.com/entry/2015/01/09/012040)
###gemとは
ruby用のライブラリ（宝石）
**ルビーとか宝石とか名前の付け方がいちいちおしゃれ**

###Bundllerとは
gemの管理に使用（方向性がyumに似ているイメージ）
gem同士の互換性を保ちながらパッケージの種類やバージョンを管理してくれる仕組みのこと。

[Bundlerとは？](https://qiita.com/io_fleming/items/14626a9cff44bc87e7db)

#環境構築
CentOS7.3にて環境構築を行っていきます。

##Rubyインストール
必要なパッケージのインストール

```
# yum -y install git bzip2 gcc gcc-c++ openssl-devel readline-devel zlib-devel
# yum -y install epel-release
# yum -y install nodejs
```

rbenvをダウンロード

```
# git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
# git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```

rbenvの環境設定

```/etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH=${RBENV_ROOT}/bin:$PATH
eval "$(rbenv init --no-rehash -)"
```

rootユーザで以下の実行が必要

```
# source /etc/profile.d/rbenv.sh
```

sudoでrbenvを実行するためにsudorderにRBENV_ROOTとsecure_pathの追記が必要

```
# visudo
...
Defaults env_keep += "RBENV_ROOT"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/rbenv/bin:/usr/local/rbenv/shims
...
```

Rubyのインストール
バージョンをチェック

```
# rbenv install -l

###実行結果
...
  2.6.0-rc1
  2.6.0-rc2
  2.6.0
  2.6.1
  2.6.2
  2.6.3
  2.7.0-dev
  jruby-1.5.6
...
```

インストール実行
バージョン2.6.3をインストールしてみます。

```
# rbenv install 2.6.3
```

使用するRubyのバージョンを設定します。

```
# rbenv global 2.6.3
# rbenv rehash
```

bundlerはRailsを動かすために最低限必要なのでインストールします。

```
# gem install bundler --no-doc
```

最新の Rails をインストールする

```
# gem install rails
```

次次ぃ！

##Dockerインストール

関連パッケージのインストール

```
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

dockerとdocker ceのインストール
最新バージョンのdocker ceをインストールします。

```
# yum install -y docker-ce docker-ce-cli containerd.io
```

Dockerの起動と自動起動設定、dockerバージョン確認

```
# systemctl start docker
# systemctl enable docker
# systemctl status docker
# docker --version
```

Dockerのプロキシ設定（必要に応じて）

```
# mkdir -p /etc/systemd/system/docker.service.d
# vi /etc/systemd/system/docker.service.d/http_proxy.conf

[Service]
Environment="HTTP_PROXY=http://<your_proxy_ip>:<your_proxy_port>/"

# vi /etc/systemd/system/docker.service.d/https_proxy.conf

[Service]
Environment="HTTPS_PROXY=http://<your_proxy_ip>:<your_proxy_port>/"

# systemctl daemon-reload
# systemctl restart docker
```


###補足1　『docker: Error response from daemon』とエラーがでたら、、
起動確認で『docker run hello-world』を実行してみるもエラーが出てしまいちょいハマり。。。

```
[root@localhost ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.
```

『docker info』にてdockerのコンフィグ内容を確認してみると、先程設定したはずのプロキシー設定が反映されていない

```
[root@localhost ~]# docker info
Client:
 Debug Mode: false

＜中略＞

 Docker Root Dir: /var/lib/docker
 Debug Mode: false
★★★本来はこのあたりにプロキシ設定が表示される★★★
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
```

結果からいうと、http_proxy.confの記載内容に誤りがありました。

```
[service]
↓
[Service]   ###Sは大文字
```

※viコマンドで改行を含む文章をコピペした時に、文頭の数文字が途切れてしまう現象どうにかならないかな。。。
他にも同様のエラーが起こった際には、DNSの設定やサーバ再起動によってなおる例もあるようです。


###補足2　　試しにNegixイメージを動かしてみる
Dockerをきちんと触ったことがなかったので、試しにNginxをインストールして起動させてみる。

NginxのDockerイメージを取得

```
# docker pull nginx
```

取得したNginxイメージを使用してコンテナを起動

```
# docker run -d --name nginx-container -p 8181:80 nginx
```
ブラウザに下記URLでアクセス
http://<作成したインスタンスのIPアドレス>:8181/









ドキドキ、、、







![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294638/632b7c34-c63c-de5b-1700-269715608b4d.png)

でけたー！！！すげー！！！簡単ー！！！！（小並感）

##docker-composeインストール
```
# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```
Docker Composeが使用できるか確認

```
# docker-compose --version
docker-compose version 1.21.2, build 1719ceb
```

##Terraformインストール
Terraformの概要理解はこちらの記事が大変参考になりました。
[Terraform - 仕組みと導入部分を簡単にまとめてみる](https://qiita.com/anfangd/items/08cc332f7f47936c6ed6)

導入はこちらの記事を参考に
[Terraform - CentOS 7 に Terraform をインストールして AWS へ接続](https://qiita.com/anfangd/items/5eac63d77264e796ffb5)


#環境構築はここで終わり
以降は元記事の内容を進めていこうと思います。
進めた上での感想などはまた記載しますね！