いけすの技術メモ

趣味開発etc.用の自己満ブログです

MENU

DockerでWebサーバーのアプリケーションを動かしてみる

webアプリケーションの作成にあたって、dockerの勉強をしたくなったので、かんたんな使い方を学んでみた。
基本的には以下のyoutubeの内容を参考にさせてもらった。(ありがたい) www.youtube.com

前提

dockerのインストール等は完了している。

目的

DockerでWebサーバーを建てて、ブラウザでトップページを閲覧する。

ディレクトリ構成

今回のディレクトリ構成は以下のようなシンプルなものになる。 ※後ほど、これでは駄目なことが発覚。

.
├── Dockerfile
└── main.rb

Dockerfile

動画ではrubyは2.7だが、ここでは3.0にしてみた。(これがちょっとしたトラブルの始まり)

FROM ruby:3.0.0

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

CMD ["ruby", "/var/www/main.rb"]

main.rb

これを実行すれば、webサーバーが建つ。

require 'webrick'

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

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

server.start

イメージの作成・起動

ビルドする。

$ docker image build -t sample/webrick:latest .

イメージ作成完了。

$ docker images
REPOSITORY                       TAG           IMAGE ID       CREATED         SIZE
sample/webrick                   latest        830ecfb45407   2 minutes ago   850MB

コンテナを作成する。

$ docker container run -p 8000:8000 --name webrick sample/webrick:latest
<internal:/usr/local/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- webrick (LoadError)
    from <internal:/usr/local/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /var/www/main.rb:1:in `<main>'

なぬ。。。

色々ググってみるとWEBrickは標準ライブラリから削除された(gemとして引き続き利用可能)らしい。 www.ruby-lang.org

とりあえずは動画の通りにポチポチしていけばいいのに変にrubyのバージョンだけアレンジするからこうなる。。。

とはいえ、gem installすれば使えると。 多分、Dockerfileにgem install webrickとベタ書きしても動くのだろうが、なんとなくGemfileでライブラリを管理したかったので、gem install bundlerしてからのbundle installとすることにした。 よって、Gemfileを追加し、Dockerfileを以下のように変更。

Gemfile

source 'https://rubygems.org'
gem 'webrick'

Dockerfile

FROM ruby:3.0

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

# 追加
COPY Gemfile .

# 追加
RUN gem update \
    && gem install bundler \
    && bundle install

CMD ["ruby", "/var/www/main.rb"]

そして、再びイメージ作成。

$ docker image build -t sample/webrick:latest .
[+] Building 48.0s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                                             0.1s
 => => transferring dockerfile: 217B                                                                                                                                                                                                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/ruby:3.0                                                                                                                                                                                                                                                      0.0s
 => [1/5] FROM docker.io/library/ruby:3.0                                                                                                                                                                                                                                                                        0.0s
 => [internal] load build context                                                                                                                                                                                                                                                                                0.0s
 => => transferring context: 104B                                                                                                                                                                                                                                                                                0.0s
 => CACHED [2/5] RUN mkdir /var/www                                                                                                                                                                                                                                                                              0.0s
 => CACHED [3/5] COPY main.rb /var/www                                                                                                                                                                                                                                                                           0.0s
 => [4/5] COPY Gemfile .                                                                                                                                                                                                                                                                                         0.1s
 => [5/5] RUN gem update     && gem install bundler     && bundle install                                                                                                                                                                                                                                       46.5s
 => exporting to image                                                                                                                                                                                                                                                                                           1.1s
 => => exporting layers                                                                                                                                                                                                                                                                                          1.1s
 => => writing image sha256:5a03aa6c25c3901829dd9910d1c928b9dc0c9b1072443c40463679c43fc00648                                                                                                                                                                                                                     0.0s
 => => naming to docker.io/sample/webrick:latest

よさげ。 確認してみたら、イメージができていた。

$ docker image ls
REPOSITORY                       TAG           IMAGE ID       CREATED          SIZE
sample/webrick                   latest        5a03aa6c25c3   16 minutes ago   912MB

では、コンテナの作成、起動してみる。

$ docker container run -p 8000:8000 --name webrick sample/webrick:latest
[2021-03-21 10:02:46] INFO  WEBrick 1.7.0
[2021-03-21 10:02:46] INFO  ruby 3.0.0 (2020-12-25) [x86_64-linux]
[2021-03-21 10:02:46] INFO  WEBrick::HTTPServer#start: pid=1 port=8000

ブラウザでhttp://localhost:8000/に接続してみると・・・

無事、表示できた!!

その他のコマンド

# コンテナの起動
$ docker container start webrick

# 実行中のコンテナのログを確認する
$ docker container logs webrick

# コンテナの停止
$ docker container stop webrick

# コンテナの削除
$ docker container rm webrick

# イメージの削除
$ docker container rmi sample/webrick

まとめ

結局、ディレクトリ構成とファイルの内容は以下のようになった。
とりあえず動画の内容だけじゃなく、自分で、調べながら解決できてよかった。

.
├── Dockerfile
├── Gemfile
└── main.rb

Dockerfile

FROM ruby:3.0

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

# 追加
COPY Gemfile .

# 追加
RUN gem update \
    && gem install bundler \
    && bundle install

CMD ["ruby", "/var/www/main.rb"]

Gemfile

source 'https://rubygems.org'
gem 'webrick'

main.rb

require 'webrick'

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

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

server.start