dockerに入門してみる(その2)

今日も勉強してみる。そういえば、Getting Startedのチャプターは10個あるみたい。2020年のうちにできるかな。

前回の記事はこちら↓ ren-opdev.hatenablog.com

このTutorialでは、Node.jsで動くToDoリストアプリケーションを題材にしていくらしい。
Node.jsに詳しくなくても大丈夫ということなので、安心。2021年は、javascriptの国にも足を踏み入れたい。

ソースをZIPでダウンロードする。

アプリケーションのソースはZIPでダウンロードする。ダウンロード先はhttp://localhost/assets/app.zip
ダウンロードしたZIPをエクスプローラー内で展開して、appディレクトリを生成できた。このディレクトリをVSCodeで開いておく。

Dockerfileを作り、buildする。

アプリケーションをbuildするためには、Dockerfileが必要とのこと。
Dockerfileはテキストベースのスクリプトで、コンテナイメージを作るのに使われるもの。注意点は、.txtのような拡張子を付けてはいけないこと。拡張子って勝手に追加されてることあるし、よくある躓きポイントみたい。
指示に従い、package.jsonと同じ階層にDockerfileを作ってみた。

FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

これは、

  1. node:12-alpineイメージをベースイメージとして
  2. /appディレクトリに
  3. コピーし、
  4. yarn install --productionでアプリケーションの依存関係をインストールする。
  5. 最後に、このイメージからコンテナをstartさせるときに実行するコマンドをCMDで定義している。

…なるほど。

とにかく、ついにDocker build!

appディレクトリに移動して、docker build -t getting-started .を実行する。
-t getting-startedは、「ビルドしたイメージをgetting-startedと呼びますよー」というタグ付けオプションで、
最後の.は、Dockerに対して「dockerfileを見てくれ」って命令しているらしい。

PS C:\Users\530lo\Documents\docker\tutorial\app> docker build -t getting-started .
[+] Building 0.1s (2/2) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 2B                                                                                 0.0s
 => CANCELED [internal] load .dockerignore                                                                         0.0s
 => => transferring context:                                                                                       0.0s
failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount711661012/Dockerfile: no such file or directory

失敗した。

failed to solve with frontend dockerfile.v0: failed to read dockerfile。。dockerfileが読み込めないらしい。
と思ったら、 no such file or directoryを吐かれている。階層を間違えていたみたい。

appディレクトリの中のappディレクトリに移って、もう一度実行する。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker build -t getting-started .
[+] Building 22.4s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 141B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/node:12-alpine                                                  3.0s
 => [auth] library/node:pull token for registry-1.docker.io                                                        0.0s
 => [internal] load build context                                                                                  0.1s
 => => transferring context: 4.63MB                                                                                0.1s
 => [1/4] FROM docker.io/library/node:12-alpine@sha256:9f8d0fde57ef82d73d234d712edc211d1235469cb55426c0383b7eacf7  4.4s
 => => resolve docker.io/library/node:12-alpine@sha256:9f8d0fde57ef82d73d234d712edc211d1235469cb55426c0383b7eacf7  0.0s
 => => sha256:3d6d69ed0edb4b5dab08a0a3d168b8379c44da6cbed1de8ec56a5cbbfd91d966 2.24MB / 2.24MB                     0.8s
 => => sha256:9f8d0fde57ef82d73d234d712edc211d1235469cb55426c0383b7eacf7d9199f 1.43kB / 1.43kB                     0.0s
 => => sha256:a9ee412baa5c130dea5f8483e95890f8d7e499dda196973f4397189b0bb98244 1.16kB / 1.16kB                     0.0s
 => => sha256:844f8bb6a3f8ba45d256a79b2db654da9234204d11df77106b3112bd11facede 6.73kB / 6.73kB                     0.0s
 => => sha256:cbdbe7a5bc2a134ca8ec91be58565ec07d037386d1f1d8385412d224deafca08 2.81MB / 2.81MB                     0.6s
 => => sha256:da41a38d96d0d8d12efb7c7c40627b4d4db0b20aa58ed143dd18937350e367e2 24.85MB / 24.85MB                   2.9s
 => => extracting sha256:cbdbe7a5bc2a134ca8ec91be58565ec07d037386d1f1d8385412d224deafca08                          0.3s
 => => sha256:13618797e148aa5d57b8f2ae0b835a343ef99066f944c3abf212eba1710955e9 282B / 282B                         0.9s
 => => extracting sha256:da41a38d96d0d8d12efb7c7c40627b4d4db0b20aa58ed143dd18937350e367e2                          1.0s
 => => extracting sha256:3d6d69ed0edb4b5dab08a0a3d168b8379c44da6cbed1de8ec56a5cbbfd91d966                          0.1s
 => => extracting sha256:13618797e148aa5d57b8f2ae0b835a343ef99066f944c3abf212eba1710955e9                          0.0s
 => [2/4] WORKDIR /app                                                                                             0.6s
 => [3/4] COPY . .                                                                                                 0.1s
 => [4/4] RUN yarn install --production                                                                           12.8s
 => exporting to image                                                                                             1.3s
 => => exporting layers                                                                                            1.3s
 => => writing image sha256:df95916b5a55ce4b08704d0c1f8b1a0f914005fb6b7e38e5e7f61c13b45313c1                       0.0s
 => => naming to docker.io/library/getting-started

成功した。
これで、Dockerfileから新しいコンテナイメージをビルドすることができた。ここでsha256値と共に沢山ダウンロードされているものは、node:12-alpineイメージをスタートさせるのに必要なイメージとのこと。

ちなみに、このハッシュ値を使ってイメージをPullすることもできるらしい。 docs.docker.com

アプリケーションを実行する。

コンテナイメージを用意できたから、アプリケーションを実行してみよう。 このTutorialを起動したときと同じように、docker runを使えば良い。

docker run -dp 3000:3000 getting-started

http://localhost:3000/ を開いてみると、Todo Appを開くことができた。 f:id:renkataoka:20201217183340p:plain

アイテムの追加や削除、ToDoアプリらしくチェックを入れて打消し線を加えることもできる。スゴイ、ちゃんとアプリケーションが動いてる。 f:id:renkataoka:20201217183628p:plain

Docker buildの方法と、ビルドしたコンテナイメージを実行してみたところで、このチャプターは終わり。
次はこのアプリケーションに改修を加えるやり方と、他にも便利なコマンドを勉強するみたい。

こんなに簡単にアプリケーションを実行できるのか。Dockerスゴイ!