第2回 Dockerのコンテナとファイル共有して継続的に開発する

f:id:ingnis:20201216161443p:plain

こんにちは、にしむらです。

今回はコンテナとファイルを共有する方法についてです。

前回のSinatraのサンプルですと、ソースコードを修正するたびにコンテナをビルドする必要がありました。 今回はホストのディレクトリをコンテナにマウントすることで、コンテナ起動中でもファイル変更が反映されるようにしていきたいと思います。

動作環境

  • OS macOS 10.15.7
  • docker desktop community 3.0.1

使用するファイル

使用するファイルは前回と同じですが、sample.rbはappディレクトリに移動させてください。

.
├── Dockerfile
└── app
    └── sample.rb

Dockerfile

FROM ruby:2.7.2-alpine

# gem install
#  → sinatra-contribを追加
RUN gem install sinatra sinatra-contrib

# 作業ディレクトリ指定(存在しない場合は作成)
#  → 以降のコマンドは指定ディレクトリで実行される。
WORKDIR /sinatra_app

# 開放するポート番号
EXPOSE 4567

# docker runされた時に実行されるコマンド
CMD ["ruby", "sample.rb"]

前回との差分

  • sample.rbのコピーを削除

  • gem sinatra-contribを追加

  • WORKDIR /sinatra_appを追加


./app/sample.rb

require 'sinatra'
require 'sinatra/reloader'

set :bind, '0.0.0.0'

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

前回との差分

  • require 'sinatra/reloader'を追加

手順

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

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


解説

今回はsinatra_sample2として新しいイメージを作成します。


結果

 [+] Building 0.9s (7/7) FINISHED                                                                                                                                                                                                                                                                                      
 => [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                                                                                                                                                                                                                                             0.8s
 => [1/3] FROM docker.io/library/ruby:2.7.2-alpine@sha256:72a83c3b7e2d1a5b6e3cd9b61c9e82ec843cbd9226ca80ff7ef02df28e84ea09                                                                                                                                                                                       0.0s
 => CACHED [2/3] RUN gem install sinatra sinatra-contrib                                                                                                                                                                                                                                                         0.0s
 => CACHED [3/3] WORKDIR /sinatra_app                                                                                                                                                                                                                                                                            0.0s
 => exporting to image                                                                                                                                                                                                                                                                                           0.0s
 => => exporting layers                                                                                                                                                                                                                                                                                          0.0s
 => => writing image sha256:057a0f837d7218a710f58cc368ff6f11ae314cfbc96b9b69e3eee7e26be65877                                                                                                                                                                                                                     0.0s
 => => naming to docker.io/library/sinatra_sample2 


確認

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

REPOSITORY                                      TAG               IMAGE ID       CREATED          SIZE
sinatra_sample2                                 latest            057a0f837d72   37 minutes ago   54.5MB


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

前回のsinatraコンテナが動作中であれば停止させておいてください。
docker stop sinatra

作成と実行
docker run -d -p 8000:4567 --name sinatra2 -v $PWD/app:/sinatra_app sinatra_sample2


解説

前回のとの差分

  • コンテナ名とイメージ名をそれぞれ sinatra2 sinatra_sample2変更

  • ボリュームオプション-v $PWD/app:/sinatra_appを追加

-vフラグはホストのディレクトリをコンテナ内にマウントします。
-v [ホスト側パス]:[コンテナ側パス]

これで、ホストのappディレクトリをコンテナ内のsinatra_appにマウント(共有)されます。


結果

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

0f7de30f843871276e2a2a6696f73efe853505df297f91387b0221c1e06fa2c5


確認

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

CONTAINER ID   IMAGE             COMMAND            CREATED          STATUS          PORTS                    NAMES
0f7de30f8438   sinatra_sample2   "ruby sample.rb"   33 seconds ago   Up 32 seconds   0.0.0.0:8000->4567/tcp   sinatra2


3.ブラウザで確認

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

さらに、sample.rbを編集して、変更内容がブラウザで反映されるか確認しましょう。

  1. sample.rb7行目の'Hello docker!!''こんにちは docker!!'に変更
  2. ブラウザをリロード
  3. こんにちは docker!!と表示されいれば成功です。

これで、コンテナを稼働させながらファイルの編集ができます。