デザイナーが1からウェブサービスを作る | dockerの設定編1

#事前情報
デザイナー/コーダーです。html/css、less、jQuery、phpが少し扱える程度の知識しかありません。インフラもMVCも、基本的な概念すらも何もわからない状態からです。勉強しながらなんとか作ってみたいと思います。つっこみどころだらけになると思いますし、間違ったこともたくさん書いてしまうと思いますので、基本参考になりませんのでご注意ください。
また間違っている箇所や不明点についてご指摘いただけるようでしたらなにより嬉しいです。

#目標
- とりあえずユーザー登録機能を作ってみる

#全体的な流れ
1. 開発環境の構築。docker+virtualboxで誰でも簡単にセットアップできるものを目指します。
2. ウェブサーバーの構築。nginxを使います。ローカルPCと仮想環境を連動させて、仮想環境に入らないでも、htmlが作れたり、ブラウザで表示確認できるようにします。
3. 動的アプリケーションでブラウザ確認できるようにする。ドキュメントが多いという理由で、rubyを使います。最終的に、かゆいところに手が届くようにしたいので、railsは後回し。rubyを勉強した後にします。
4. データベースの構築。ここはまだ何も調べていません。普通はmySQLになるのかな？今後使われそうなものを採用したいです。
5. 本番環境の構築。開発したものを本番環境で表示する。

では、はじめます。

#dockerについて
- インフラ、仮想サーバー。
- OSまで含めてコンテナとして作成できる。これにより個々の環境に左右されず、開発環境を共有できるものらしい。

#dockerの仕組み
- コンテナ = nignxやruby、centosといった開発環境を内包した枠みたいなもの。
- イメージ = コンテナを作るためのベースになるもの。必要なOSやミドルウェア、アプリケーションをdockerfileに記載し、buildすることでimageファイルが作られる。imageファイルを`docker run`すると、そのimageの内容でコンテナが作られる。
- Mac -> VirtualBox -> HostOS -> コンテナ -> アプリケーション<br>
Macの中に、別途仮想のサーバーを作って、そこにコンテナがある。コンテナには、いろいろなアプリケーションを入れてサーバー環境の構築ができる。

#docker-machineとは
- dockerで仮想環境を作ったり、開始・停止したり、仮想環境に対していろいろなことができる。<br>(vagrantと同じようなものかもしれない)
- 仮想環境はvirtual boxを利用したり、docker for macだとそもそもvirtualboxもいらないらしい。

#docker導入の流れ
1. dockerのウェブサイトからdocker for macをダウンロードし、インストールする。
2. terminalを開き、`docker --version`で繋がっているか確認。以下terminalでの操作。
3. 同様に`docker-machine --version`で確認。
4. virtualboxがmacのアプリケーションにインストレールされていることを確認。

#dockerとvirtualboxを連携する
1. docker-machineでmachineを作る。
`docker-machine create --driver virtualbox (machine_name)`<br>
--driver : 利用するアプリケーションを指定。今回はvirdualbox。<br>
(machine_name) : 任意の名前 ex) dev<br>
*指定しないとどうなるのか？*
2. 作成されたmachineを確認する。`docker-machine ls`
3. dockerを仮想環境で使うためにmacとmachineを連携する。現状はmachineを作っただけなので、dockerコマンドを打っても仮想環境になにも影響を与えることはできない。
machineの環境変数を、virtualboxに指定することでdockerがmachine上で実行されたことになるらしい。<br>
`docker-machine env (machine_name)`をすると、machineに割り当てられている環境変数が表示されるので、確認しておく。
4. machineの環境変数をvirtualboxに指定する。`eval $(docker-machine env (machine_name))`
5. 環境変数の指定は、ターミナルを閉じたり、macを再起動すると失われるので、その都度指定する必要がある。*作成されたmachineは失われない。*
macのドキュメントルートに移動し、bash_profileファイルを作成し、4の記述を入れておくと、terminal起動時に自動で環境変数が指定されるようだが、試していない。*要調査*
6. dockerコマンドがmachine内で動いているかどうかを以下で確認。
7 imageファイルを取得`docker pull hello-world`
*hello-worldはdockerの動作確認用のimage*
- imageが取得できたかを確認。`docker images`
- 次に、dockerと仮想環境との連携を切って、mac上に先ほどのhello worldがあるかを確認。ターミナルを再起動し、virtualboxへの環境変数指定がされていない状態にする。
- mac上で先ほどのimageがあるかどうかを確認。`docker images`
- 無いことが確認できればOK。仮想環境にのみimageがある状態。

#今回覚えたコマンド
`docker-machine ls`
作成されたmachineの名前とステータスが確認できる

`docker-machine create --driver virtualbox (machine_name)`
仮想環境にmachineを作る。--driverで、対象となる仮想環境アプリを指定する。

`docker-machine ip (machine_name)`
仮想環境のipを表示する。

`docker-machine env (machine_name)`
machineの環境変数を表示する。

`eval $(docker-machine env (machine_name))`
machineの環境変数を仮想環境へ割りあてる。仕組みはよくわからない。

`docker-machine start (machine_name)`
machineを開始・再開する。

`docker-machine stop (machine_name)`
machineを停止する。

`docker-machine ssh (machine_name)`
仮想環境上のtermnalが使えるようになる。ログアウトはcntrol + d

`docker ps`
起動しているdockerコンテナを表示する。-aをつけると、起動していないものも含め全て表示する。

`docker images`
pullしてきたimageを表示する

`docker rm (container_name)`
作成されたコンテナを削除する

`docker rmi (image_name)`
持っているimageを削除する。上手くいかないときは-fをつけると良い。

`docker pull (image_name)`
docker hubにあるimageをpullしてくる

`docker --help`,`docker-machine --help`
dockerコマンドの一覧が見れる。オプションも見れる。
`docker ps --help`などもできる。

`mkdir (folder_name)`
ディレクトリを作る

`touch (file_name)`
ファイルを作る

`vi (file_name)`
ファイルを編集する。編集後はESC -> :w -> :qで保存し、戻る

`cd /`
一番上のディレクトリに行く。

`cd $HOME`,`cd ~/`
ホームディレクトリに行く。ホームディレクトリが何なのかはよくわからない。

`pwd`
現在のディレクトリまでのpathを表示

`mdfind (file_name)`
ファイルを検索する

`cp -rP (from_dir) (to_dir)`
ディレクトリを中身のファイルごとコピーする。ディレクトリ名が違う場合、コピー先ディレクトリの中に、コピー元ディレクトリがコピーされる。

`cp -rP (from_dir). (to_dir)`
from_dirのpathに.をつけると、ディレクトリの中身のみをコピーする。

#不明点
- `docker-machine ssh (machine-name)`で、仮想サーバーにログインしても、imageのファイルがない。nginxのコンテナで試してみたが、ホームディレクトリがdockerになっているだけで、Welcome neginxのデフォルトページのhtmlがどこにもない。謎。docker-machineで仮想環境作ると、MacのUsersから以下が、仮想サーバー上にも表示されるらしいのでそれが関係してる？
- 仮想環境にCentOSやubuntuなどのOSはなくてもいいのか？公式のnginxイメージから、コンテナを作ってブラウザで表示されているのでいらない？でもOSってなくて大丈夫なのか？<br>
- [x] nginxのイメージのdockerfileを覗くと、devianというOSが使われている。なにかしらのOSは必要。
https://github.com/nginxinc/docker-nginx/blob/0dd9ef6a337474293b5e36c95a85da99b11e1a0a/mainline/jessie/Dockerfile


##一覧
[次回 >>](http://qiita.com/gamips/items/ae0f154e97805fb76cee)