Dockerを動かしてみた(Ruby2.7 簡易webサーバー構築)

# はじめに
dockerを使った開発をしたことがないので、環境構築してみたことを備忘録として残しておく。
dockerが何なのか、メリットデメリットなどはそこらじゅうに解説サイトなどがあるので、ここでは割愛する。

# 環境
* MacBook Air (Retina, 13-inch, 2020)
* macOS Monterey version 12.6


# やりたいこと
dockerをインストールし、誰かが作った環境を動かしてみる。
期待すること：自身のPCにインストールせずとも、同じように動かせるはず。

# やったこと
1. 以下のサイトで、Docker Desktop for Macをインストール
https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/
※インテル用と、M1チップ用があるので注意。

2. docker Desktopのチュートリアルに従って操作してみる。
公式チュートリアルの和訳をされているページがあったので、参考にさせていただきました。[和訳](https://qiita.com/Michinosuke/items/5778e0d9e9c04038903c)
和訳サイトもありました。


https://docs.docker.jp/index.html

他にはyoutubeで解説されているのが分かりやすかったです。

https://www.youtube.com/watch?v=oHcLtX_DPko&t=0s

* Dockerfile作成
* イメージのビルド
```bash
docker image build -t タグ名 .
```
* コンテナの作成、起動
```bash
docker container run -it -p ローカルポート番号:dockerポート番号 --name コンテナ名 -v ${PWD}/ローカルワークdir:dockerワークdir イメージ名
```
※-itはインタラクティブ指定

* Dockerfileへの反映
環境構築時に成功したコマンドを反映させておけば間違いない。

* コンテナ削除
```bash
docker container rm コンテナ名
```
一括削除

```bash
$ docker system prune
```

## youtubeの例を元に、webサーバーを作ってみた例：


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

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

server.start
```

```docker:Dockerfile
FROM ruby:2.7

RUN mkdir /var/www
COPY main.rb /var/www
COPY index.html /var/www
COPY mainpage.jpg /var/www

CMD ["ruby", "/var/www/main.rb"]
```
```html:index.html
<html>
    <head></head>
    <body>
        <h1>Hello, World!!</h1>
        <img src="mainpage.jpg">
    </body>
</html>
```
## 実行結果

```sh
webricktest % docker image build -t webricktest:latest .                             
[+] Building 2.9s (11/11) FINISHED                                                                                                  
 => [internal] load build definition from Dockerfile                                                                           0.0s
 => => transferring dockerfile: 186B                                                                                           0.0s
 => [internal] load .dockerignore                                                                                              0.0s
 => => transferring context: 2B                                                                                                0.0s
 => [internal] load metadata for docker.io/library/ruby:2.7                                                                    2.5s
 => [auth] library/ruby:pull token for registry-1.docker.io                                                                    0.0s
 => [1/5] FROM docker.io/library/ruby:2.7@sha256:85860033c72fc9d0f3c20fb38a9b71981c6a9002afcc28048b923790ba409df2              0.0s
 => [internal] load build context                                                                                              0.1s
 => => transferring context: 567.66kB                                                                                          0.0s
 => CACHED [2/5] RUN mkdir /var/www                                                                                            0.0s
 => CACHED [3/5] COPY main.rb /var/www                                                                                         0.0s
 => [4/5] COPY index.html /var/www                                                                                             0.0s
 => [5/5] COPY mainpage.jpg /var/www                                                                                           0.0s
 => exporting to image                                                                                                         0.1s
 => => exporting layers                                                                                                        0.0s
 => => writing image sha256:90b6fbcaf9b809c4a35ed1042fca4eeb2d738e9548f69d8c123669bdfcfedfdf                                   0.0s
 => => naming to docker.io/library/webricktest:latest                                                                          0.0s


webricktest % docker container run -p 8000:8000 --name webricktest webricktest:latest
[2023-01-03 06:18:22] INFO  WEBrick 1.6.1
[2023-01-03 06:18:22] INFO  ruby 2.7.7 (2022-11-24) [x86_64-linux]
[2023-01-03 06:18:22] INFO  WEBrick::HTTPServer#start: pid=1 port=8000
172.17.0.1 - - [03/Jan/2023:06:18:37 UTC] "GET / HTTP/1.1" 200 3269
- -> /
172.17.0.1 - - [03/Jan/2023:06:19:13 UTC] "GET /var/ HTTP/1.1" 200 2335
http://localhost:8000/ -> /var/
172.17.0.1 - - [03/Jan/2023:06:19:15 UTC] "GET /var/www/ HTTP/1.1" 200 120
http://localhost:8000/var/ -> /var/www/
172.17.0.1 - - [03/Jan/2023:06:19:15 UTC] "GET /var/www/mainpage.jpg HTTP/1.1" 200 566883
http://localhost:8000/var/www/ -> /var/www/mainpage.jpg
^C[2023-01-03 06:20:14] FATAL Interrupt: 
	/usr/local/lib/ruby/2.7.0/webrick/server.rb:170:in `select'
	/usr/local/lib/ruby/2.7.0/webrick/server.rb:170:in `block in start'
	/usr/local/lib/ruby/2.7.0/webrick/server.rb:32:in `start'
	/usr/local/lib/ruby/2.7.0/webrick/server.rb:157:in `start'
	/var/www/main.rb:13:in `<main>'
[2023-01-03 06:20:14] INFO  going to shutdown ...
[2023-01-03 06:20:14] INFO  WEBrick::HTTPServer#start done.
/usr/local/lib/ruby/2.7.0/webrick/server.rb:170:in `select': Interrupt
	from /usr/local/lib/ruby/2.7.0/webrick/server.rb:170:in `block in start'
	from /usr/local/lib/ruby/2.7.0/webrick/server.rb:32:in `start'
	from /usr/local/lib/ruby/2.7.0/webrick/server.rb:157:in `start'
	from /var/www/main.rb:13:in `<main>'

```

表示したwebpage：
![スクリーンショット 2023-01-03 16.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/298a415f-1802-1f26-157f-5a937e61a98e.png)

Docker Desktopの画面：
![スクリーンショット 2023-01-03 16.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/81616a70-8877-98f8-683b-88a79817d24d.png)



# まとめ
今回はruby2.7の環境を構築するためのDockerfileを作成し、動かしてみた。
以下のように自身のPCの環境ではrubyは2.6だが、
dockerhubからruby2.7を引っ張ってコンテナを作成して動かすという経験ができたので、まずは目標達成とする。

```sh
webricktest % ruby -v
ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.x86_64-darwin21]
```

同じことがしたい場合は、以下の環境を取ってきて、同じようにイメージをビルドしてコンテナ作成、起動させればすぐに動かせると思う。
[（gitソースコード）](https://github.com/ishiinox/webricktest)

ビルドもコンテナ作成、起動も一瞬で終わるので、同じ環境で動かしたいときは嬉しいんだと思う。
Dockerfileの書き方とかはまだ応用できるレベルではないので、
もうちょっと使いこなせるようにしておきたい。

あとは、とにかくyoutubeの山浦さんっていう方の説明が分かりやすい。あれを見れば誰でもある程度できるようになると思う。