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