#【目標】docker上でrailsアプリを作って初期画面を表示させます。
▼知識
①イメージ
→設計図のようなもの
②コンテナ(インスタンス)
→設計図を元に建てられた家みたいなもの
→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 コマンドで行えます。
$ 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 で起動することができます。
$ 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 で停止することができます。
$ 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」にもアプリが作成されています。確認してみてください。
作成した、アプリ(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」にも表示されているはずです。確認してください。
##9.補足:execでコンテナに入る(attachとの違い)
先ほどdettachしたrailsコンテナに再度ログインするには、docker attach を実行すると言いました。attachでログインした場合exitでログアウトすると、コンテナのSTATUSがExitedになってしまいます。
しかし、コンテナにdocker exec -it /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
以上、です!