Dockerで最小構成のSinatraを起動する

f:id:ingnis:20201120144028j:plain

はじめまして、にしむらです。

今回はrubyフレームワークSinatraの構築を通じてDockerfileのはじめの一歩を紹介します。

具体的にはDocker公式rubyイメージをもとに、Sinatraのgemをインストールし実行ファイルをコピーしたイメージを作成し、コンテナとしてを実行します。

動作環境

  • OS macOS 10.15.7
  • docker desktop community 2.5.0.1

使用するファイル

以下のファイルを同一ディレクトリに作成してください。

  • Dockerfile:イメージ構築(ビルド)用

  • sample.rb:sinatraで 「Hellow docker!」と表示

Dockerfile

# FROM:公開リポジトリからベースとなるイメージを取得
#  → rubyイメージを取得
FROM ruby:2.7.2-alpine

# RUN:イメージ作成中に実行させたいコマンド
#  → sinatraのインストール
RUN gem install sinatra

# COPY:ファイルのコピー
#  → 実行ファイルをイメージにコピー
COPY sample.rb .

# EXPOSE:コンテナ実行時にリッスンするポート番号
#  → sinatra標準の4567を指定
EXPOSE 4567

# CMD:コンテナ実行時のデフォルトの処理
#  → "ruby sample.rb"を実行させる
CMD ["ruby", "sample.rb"]

参考 Dockerfile リファレンス — Docker-docs-ja 17.06 ドキュメント


sample.rb

require 'sinatra'

set :bind, '0.0.0.0'

get '/' do
  'Hello docker!!'
end

参考 Sinatra: README (Japanese)

手順

1.Dockerイメージを作成する

コマンド docker build -t sinatra_sample1 . を実行


解説

使い方 docker build [オプション] パス

パスにあるソースコードから新しいイメージを構築します。オプション-t sinatra_sample1はイメージにsinatra_sample1とタグ付けします。


結果

 => [internal] load build definition from Dockerfile                                                                                                                                       0.0s
 => => transferring dockerfile: 37B                                                                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/ruby:2.7.2-alpine                                                                                                                       2.0s
 => [1/3] FROM docker.io/library/ruby:2.7.2-alpine@sha256:f9f332eece9188d10abb30ff6b109a1b0fee9f3e82683df8df8bf81be8121567                                                                 0.0s
 => [internal] load build context                                                                                                                                                          0.0s
 => => transferring context: 30B                                                                                                                                                           0.0s
 => CACHED [2/3] RUN gem install sinatra                                                                                                                                                   0.0s
 => CACHED [3/3] COPY sample.rb .                                                                                                                                                          0.0s
 => exporting to image                                                                                                                                                                     0.0s
 => => exporting layers                                                                                                                                                                    0.0s
 => => writing image sha256:6f5b0317471fe7b32e1ebe912821de20fc728c986014aa85740226e15696fe45                                                                                               0.0s
 => => naming to docker.io/library/sinatra_sample1                                                                                                                                         0.0s


確認

コマンド docker images を入力してREPOSITORYsinatra_sample1があることで確認できます。

REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
sinatra_sample1                                 latest              6f5b0317471f        3 hours ago         54.3MB


2.コンテナの作成と実行

コマンドdocker run -d -p 8000:4567 --name sinatra sinatra_sample1を実行


解説

使い方 docker run [オプション] イメージ [コマンド] [引数...]

今回の場合 -d -p 8000:4567 --name sinatra がオプションで、イメージがsinatra_sample1となります。

runコマンドは指定したイメージでコンテナを作成createして、指定したコマンドでコンテナを実行startします。

-dオプションはコンテナをバックグラウンドで実行(デタッチ)します。

-pオプションは コンテナのポート4567をホストのポート8000に割り当てています。

--nameオプションはコンテナに名前sinatraを割り当てます。

コマンドを省略するとイメージで指定したCMDが実行されます。指定すると上書きされます。


結果

成功なら作成したコンテナIDが表示されます。IDは実行ごとに異なります。

9efd21eae197db966ad7d2011398579874b7fbce11be1903b89b920186816040


確認

コマンド docker ps を入力してコンテナが稼働していることを確認します。

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
9efd21eae197        sinatra_sample1     "ruby sample.rb"    37 seconds ago      Up 36 seconds       0.0.0.0:8000->4567/tcp   sinatra


3.ブラウザで確認

ブラウザで、URLhttp://localhost:8000 と入力して、「Hello docker!!」と表示されていればSinatraが正常に稼働しています。

f:id:ingnis:20201120150623p:plain

コマンドdocker stop sinatraと入力するとコンテナが停止します。再度、実行させたい場合は コマンドdocker start sinatraと入力してください。

以上です、編集長!!