【学習メモ】Dockerfileを書いてRubyを実行してみる

##今回のゴールは「Docker Hello!!」
今回のゴールは、

```
仮想環境からローカルホストにアクセスし、ブラウザに「Docker Hello!!」と表示させる。
```
とします。
具体的には `Docker` で`Ruby`の仮想環境を作り、ブラウザに**Docker Hello!!**と表示さます。

Docker学習のアウトプット記事になりますので、間違いがあったらご指摘頂けると幸いです。

##Dockerを使って仮想環境を作る手順
1. Dockerをインストールする
2. Dockerfileを記述する
3. Dockerfileをビルドしてコンテナイメージを作る
4. コンテナを実行する←ここでようやく仮想環境が出来上がる

Dockerを使って仮想環境を作る流れはこんな感じです。

厳密には違うと思いますが、今のところはこんな認識で問題ないと思います。
今回はDockerファイルの中身にはあまり触れず、

**とりあえずDocker使ってコンテナ作ってみる。**
っていう感じのノリでやっていきます。

##【下準備】作業用のフォルダを作る
今回はデスクトップに『work』というフォルダを作り、その中に『sample-app』というフォルダを作り、その中で作業していきます。

1. まずはデスクトップに`work`フォルダを作ります。
2. その中に`sample-app`フォルダを作ります。
3. ターミナルを起動し、ディレクトリを移動します。

```shell
cd desktop
cd work
cd sample-app
```
これで`sample-app`フォルダの中に入りました。

###Rubyの処理が書かれたファイルを用意する
今回は`main.rb`ってファイルを用意しました。

```ruby:main.rb
require 'webrick'

server = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddress: '0.0.0.0',
  Port: 8000
)

server.mount_proc('/') do |req, res|
  res.body = 'Docker hello!!'
end

server.start
```

このコードはこちらの動画にあるコードを参考にしてます。

>[【Docker超入門 #5】アプリを作成・実行しよう](https://youtu.be/ZxwHVaq7FJo)

今回はあくまで
Dockerファイルを使い、仮想環境を作ってみる。
っていうのを目標にしてますので、`ruby`の中身はあんまり気にしない方向でやってます。

###Dockerfaileを用意する

```Dockerfile:Dockerfile
FROM ruby:2.7

RUN mkdir /var/www
COPY main.rb /var/www

CMD ["ruby", "/var/www/main.rb"]
```
用意するのは上記２つのファイルだけです。

##ターミナルを使ってコンテナイメージとコンテナを作る【buildとrun】
1. Dockerファイルをビルドしイメージを作る。
2. コンテナを起動させる

今回は上記２つの手順で、コンテナを起動させていきます。

###Dockerファイルをビルドし、イメージを作る。
ターミナルを開き、以下のコマンドを実行していきます。

```shell
実行するコマンド
docker image build -t test-name:test .
```
[【公式ドキュメント】docker image build](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/image_build/)

```
コマンドの書き方
docker image build [オプション名] [パス]
```

オプション名の`-t`はタグって意味で、イメージ名とタグ名の２つを書くのが決まりになってます。
なので今回は、イメージ名を`test-name`、タグ名を`test`にしてます。

`.(ドット)`は「今いる階層」って意味です。
ITっぽく言うと、`カレントディレクトリ`ってやつですね。

つまりこのコマンドは、
**今いる階層の中にあるdockerfileをビルドせよ。イメージの名前は`test-name`ね、タグの名前は`test`だよ。**

って意味になります。

###イメージが作れたかを確認する。
```shell
docker image ls
```
このコマンドで、現在実行されてるイメージファイルの一覧が見れます。

REPOSITORYに`test-name`
TAGに`test`

と書かれたDockerイメージが出てくればOKです。

##コンテナを起動させる。

```shell
実行するコマンド
docker container run -p 8000:8000 --name test-docker test-name:test
```

```
コマンドの書き方
docker container run [オプション名] --name [コンテナ名] [イメージ名]:[タグ名]
```
`-p`はポート番号を指定してます。
詳しい説明は割愛しますが、ローカルと仮想空間を紐づけてるって認識でいいと思います。

`--name`はコンテナの名前が書いてあり、今回は`test-docker`ってコンテナ名にしてます。

そこから下の`[イメージ名]:[タグ名]`は
さっきビルドした時に書いたイメージ名とタグ名を指定します。

つまりこのコマンドは、
**`test-name:test`ってイメージファイルは`test-docker`って名前でコンテナを作ってね。あ、ポートは8000番を使ってね。**

って意味です。
これで仮想空間が作られてるはずです。

##ローカルホスト8000にアクセスしてみる

実際にローカルホストにアクセスしてみます。
なんでもいいんでブラウザを立ち上げましょう。

そしてURLに`localhost:8000`と打ってアクセスしてみてください。
`ruby`ファイルの記述された、`docker hello!!`と出力されてるはずです。

##コンテナを止めて削除する
コンテナにはライフサイクルって考え方があって、
`作成⇒起動⇒停止⇒削除`
といった決まりがあります。

要は
**コンテナ作ったら消してね。**
ってのがルールらしいです。

コンテナの作成・及び起動は上記で説明した通りなので割愛します。

```
コンテナの停止
docker container stop [コンテナ名]
```

今回の場合なら

```shell
docker container stop test-docker
```
となります。

コンテナ・及びイメージの削除は、

```shell
docker system prune
```
これを実行すると、コンテナとイメージを一掃することができます。

以上です。

##参考にさせて頂た記事
[【Docker超入門 #5】アプリを作成・実行しよう](https://youtu.be/ZxwHVaq7FJo)
[Dockerのイメージ、コンテナおよびボリュームを削除する方法](https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes-ja)
[Docker一括削除コマンドまとめ](https://qiita.com/boiyama/items/9972601ffc240553e1f3)
[Dockerコンテナライフサイクルについて](https://qiita.com/roko18366758/items/f00b16a06afef6676ea6)
[docker container / image コマンド新旧比較](https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266)
[dockerコマンド一覧](https://qiita.com/suzukihi724/items/961112f6578a60dd6266)
[【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その2:Dockerってなに？ 〜](https://tech-lab.sios.jp/archives/19073#Docker-5)