DockerでRails「Yay! You’re on Rails!」の表示

#【目標】docker上でrailsアプリを作って初期画面を表示させます。

▼完成の概念イメージ図
![docker-rails.jpg](https://qiita-image-store.s3.amazonaws.com/0/251273/91f8ef9a-38ca-134e-0d06-5649aa1d5c81.jpeg)
##0.前知識・準備

▼知識
①イメージ
　→設計図のようなもの
②コンテナ（インスタンス）
　→設計図を元に建てられた家みたいなもの
　→1つのイメージから、幾つでも家を建てられる


▼前準備

デスクトップに「test_app」フォルダを作る。

ターミナルを開き、cd+フォルダを「ドラッグ・アンド・ドロップ」し、test_appフォルダに移動する。

    $ cd /Users/kaz/Desktop/test_app






##1.イメージの確認

docker imagesコマンドを実行すると、Docker Machineに保存されているイメージを確認できます。

    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

「dockerを始めて使う人」or「まだイメージを取得したことない人」は上記のように、何も表示されません。



##2.イメージの取得

今回はDocker HubにあるRailsリポジトリからコンテナイメージを取得します。

取得はdocker pull <REPOSITORY>コマンドで行えます。

    $ docker pull rails
    Using default tag: latest
    latest: Pulling from library/rails
    75a822cd7888: Pull complete 
    57de64c72267: Pull complete 
    4306be1e8943: Pull complete 
    871436ab7225: Pull complete 
    afb684ad7765: Pull complete 
    c2807e33cf84: Pull complete 
    7025772f9b60: Pull complete 
    73729083bf6c: Pull complete 
    7dd42782d26e: Pull complete 
    6bd3d457e27a: Pull complete 
    4cd427c44fca: Pull complete 
    Digest: sha256:aec52fe81ff0e99d64174001fbdf44c3bc9e1869756dec05c447f52a0fe637e7
    Status: Downloaded newer image for rails:latest

（rails:バージョンでバージョン指定もできますが、何もつけないと、最新バージョンが選択されます。）

以上で取得が完了しました。

再度イメージの確認をするとREPOSITORYが"rails"という名前のイメージが取得されているのが確認できます。

    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    rails               latest              660f41442a27        15 months ago       840MB



##3.コンテナの作成

コンテナの稼働状況を確認するコマンドをまとめます。

    #「現在起動しているコンテナ」の表示
    $ docker ps
    #「最後に起動したコンテナ」の表示
    $ docker ps -l
    #「最後に起動したコンテナから指定数分のコンテナ」の表示
    $ docker ps -n=2
    #「すべてのコンテナ」の表示
    $ docker ps -a

まず、docker psコマンドで現在のコンテナの稼働状況を確認します。

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

現状、ひとつも稼働していないため、何も表示されません。

それでは、先ほど取得したイメージ(rails)からコンテナを作成します。

    $ docker run -it rails /bin/bash
    root@df384f27120d:/#

上記のコマンドを実行すると作成と同時にコンテナも起動し、そのタイミングで自動的にログインします。

また、ログイン状態を抜けるには"control"を押した状態で"P、Q"を順番に押します。

この抜けることを「dettach(デタッチ)」と呼びます。

サーバからログアウトする感覚でexitコマンドを実行すると、起動したコンテナも停止します。

それでは、"control + P、Q"で抜けた後に再度docker psコマンドで稼働状況を確認します。

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    2a33039ddd24        rails               "irb"               2 minutes ago       Up 3 minutes                            peaceful_chatterjee

STATUSがUPになっているのが確認できます。

先ほどdettachしたrailsコンテナに再度ログインするには、`docker attach <CONTAINER IDまたはNAME>`を実行します。

    $ docker attach peaceful_chatterjee
    root@df384f27120d:/#

それでは一旦、exitコマンドでコンテナを抜けて停止させましょう。

    root@df384f27120d:/# exit
    exit

確認してみると表示されなくなりました。

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

先ほど案内しましたが、これはdocker psコマンドが「現在稼働中のコンテナのみを表示する」からです。

"-a"オプションを付けることで、停止中のも含めて全てのコンテナを表示します。

    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    df384f27120d        rails               "/bin/bash"         4 minutes ago       Exited (0) 27 seconds ago                       peaceful_chatterjee

ここでは停止しているのでSTATUSがExitedとなっています。

「Exited=停止」という意味です。



##4.コンテナの起動

コンテナイメージを作成した後はdocker start <CONTAINER IDまたはNAME>で起動することができます。

    $ docker start peaceful_chatterjee
    peaceful_chatterjee

STATUSがUpとなり、起動しているのが確認できます。

    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    df384f27120d        rails               "/bin/bash"         9 minutes ago       Up 25 seconds                                   peaceful_chatterjee





##5.コンテナの停止

起動と同様に、docker stop <CONTAINER IDまたはNAME>で停止することができます。

    $ docker stop peaceful_chatterjee
    peaceful_chatterjee

STATUSがExitedとなり、停止しているのが確認できます。

    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    df384f27120d        rails               "/bin/bash"         12 minutes ago      Exited (0) 51 seconds ago                       peaceful_chatterjee

また、docker startコマンドで起動させた場合でも、docker attach後にexitコマンドで抜けると停止します。



##6.コンテナに名前をつける

先程railsイメージからコンテナを作成する際docker run -it rails /bin/bashとしました。

そうすると「peaceful_chatterjee」のように勝手にコンテナ名をつけられてしまいます。

体験していただいた通りコンテナ名を指定する機会は多いです。

これでは、コンテナ名を覚えるのも管理するのも大変ですよね？

コンテナ名を指定するには、コンテナ作成の際に--name=＜コンテナ名＞で指定してあげる必要があります。

今回は「rails_app」という名前をつけてみます。

    $ docker run -it --name=rails_app rails /bin/bash
    root@9c512fc4a48f:/#

それでは、"control + P、Q"で抜けた後に再度docker psコマンドで稼働状況を確認します。

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
    9c512fc4a48f        rails               "/bin/bash"         About a minute ago   Up About a minute                       rails_app

NAMEを確認してください。ちゃんと「rails_app」と名付けられています。



##7.「ポート番号の共有」と「ボリュームの共有」

誤解を恐れず説明します…

コンテナとは、別PCだと思ってください。

root@9c512fc4a48f:/#と表示されたら、別PCにいる状態です。

---

▼ポート番号の共有

別PCで表示している内容を、ローカルの環境で表示させてあげる

▼ボリュームの共有

別PCでの変更を、ローカルの環境で反映させてあげる

---

「ポート番号の共有-p」と「ボリュームの共有-v」も、コンテナ作成時に行います。

「ローカルの環境：コンテナ」です。今回は「rails_app2」という名前をつけてあげましょう。

    $ docker run -it --name=rails_app2 -p 3000:3000 -v /Users/kaz/Desktop/test_app:/home rails /bin/bash



##8.Railsアプリの作成

Railsで「hello_rails」というアプリを作成します。

    root@f4ecef8f214c:/# cd home
    root@f4ecef8f214c:/home# rails new hello_rails
    
    …省略…
    
             run  bundle exec spring binstub --all
    * bin/rake: spring inserted
    * bin/rails: spring inserted
    root@f4ecef8f214c:/home# 

コンテナ（別PC）で、Railsアプリの作成ができました。

これは、別PCで行われたことですので、通常ローカル環境には反映されませんが、

ローカルの「test_app」とコンテナの「home」のボリュームの共有を行っているため、

「test_app」にもアプリが作成されています。確認してみてください。


![test_app_rails.jpg](https://qiita-image-store.s3.amazonaws.com/0/251273/98814501-db4e-a75a-021e-21df73e5c79e.jpeg)



作成した、アプリ（hello_rails）に移動します。

    root@f4ecef8f214c:/home# cd hello_rails

ここで、Railsサーバーを起動します。

    root@f4ecef8f214c:/home/hello_rails# rails s
    => Booting Puma
    => Rails 5.0.7 application starting in development on http://localhost:3000
    => Run `rails server -h` for more startup options
    Puma starting in single mode...
    * Version 3.11.4 (ruby 2.3.3-p222), codename: Love Song
    * Min threads: 5, max threads: 5
    * Environment: development
    * Listening on tcp://0.0.0.0:3000
    Use Ctrl-C to stop

先程、ローカル環境の「local:3000」とコンテナ（別PC）の「local:3000」を共有したので、

今、別PC上の「local:3000」に表示されている、画面がローカル環境の「local:3000」にも表示されているはずです。確認してください。

<img width="998" alt="スクリーンショット 2018-04-18 19.00.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/251273/f44fab0a-a1da-a0b7-6cd2-57b30da2e682.png">

##9.補足：execでコンテナに入る（attachとの違い）

先ほどdettachしたrailsコンテナに再度ログインするには、docker attach <CONTAINER IDまたはNAME>を実行すると言いました。attachでログインした場合exitでログアウトすると、コンテナのSTATUSがExitedになってしまいます。

しかし、コンテナにdocker exec -it  <CONTAINER IDまたはNAME> /bin/bashで入ると、exitしてもSTATUSがUpのままなので、好きな方を使ってください。

    $ docker exec -it rails_app2 /bin/bash
    root@49fb59dc1879:/# exit
    exit
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
    49fb59dc1879        rails               "/bin/bash"         5 minutes ago       Up About a minute   0.0.0.0:3000->3000/tcp   rails_app2






以上、です！