アプリケーションのコンテナー化

ここからのガイドでは、Node.js において稼動する単純な ToDo リストマネージャーを作っていくことにします。 Node.js をよくわかっていなくても心配ありません。 JavaScript の知識などなくてもかまいません。

前提条件

  • 最新バージョンの Docker Desktop をインストールしていること。
  • Git クライアント をインストールしていること。
  • ファイル編集のために IDE あるいはテキストエディターを用意していること。 Docker では Visual Studio Code の利用を推奨。

アプリの入手

アプリケーションを実行するために、アプリケーションのソースコードを入手してマシン上におくことが必要です。

  1. 以下のコマンドを実行して getting-started-app リポジトリ のクローンを行います。

    $ git clone https://github.com/docker/getting-started-app.git
    
  2. クローンを行ったリポジトリの内容を確認します。 以下のようなファイルやサブディレクトリが確認できます。

    ├── getting-started-app/
    │ ├── .dockerignore
    │ ├── package.json
    │ ├── README.md
    │ ├── spec/
    │ ├── src/
    │ └── yarn.lock

アプリイメージのビルド

イメージをビルドするには Dockerfile を用いる必要があります。 Dockerfile とは単純なテキストファイルであって、拡張子を持ちません。 そこにはさまざまな命令がスクリプトとして記述されます。 Docker はこのスクリプトを使ってコンテナーイメージをビルドします。

  1. getting-started-app ディレクトリには package.json というファイルがあります。 そのファイルと同じ並びに Dockerfile という名前のファイルを生成します。 そしてその内容は以下のようにします。

    # syntax=docker/dockerfile:1
    
    FROM node:lts-alpine
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "src/index.js"]
    EXPOSE 3000

    この Dockerfile はベースイメージ node:lts-alpine の記述から始まります。 これは Node.js とYarn パッケージマネージャーがあらかじめインストールされている、軽量な Linux イメージです。 イメージに対しては全ソースコードがコピーされ、必要な依存パッケージがインストールされた上で、アプリケーションが起動します。

  2. 以下のコマンドを実行してイメージをビルドします。

    端末内ではカレントディレクトリを getting-started-app とします。 /path/to/getting-started-app の部分は、実際の getting-started-app ディレクトリに置き換えてください。

    $ cd /path/to/getting-started-app
    

    イメージをビルドします。

    $ docker build -t getting-started .
    

    docker build コマンドは Dockerfile を利用して新たなイメージをビルドします。 実行すればわかることですが、Docker は数々の「レイヤー」をダウンロードします。 そうなるのは、ビルド処理に対して指示を行ったからであり、node:lts-alpine イメージから処理を始めることを伝えたためです。 マシン内にそのイメージがなかったので、Docker がダウンロードする必要があったということになります。

    Docker がイメージをダウンロードした後は、Dockerfile に示された命令に従って、アプリケーションがコピーされ、さらに yarn によってアプリケーションの依存パッケージがインストールされます。 CMD ディレクティブがデフォルトコマンドを指定しているので、このイメージから生成されるコンテナーが起動した際にそれが実行されます。

    なお -t フラグはイメージにタグづけを行うものです。 これは最終生成されるイメージに対して、わかりやすい名前をつけたと考えればよいでしょう。 ここでは getting-started という名前をつけたので、コンテナー起動の際にイメージを特定する名前として利用できます。

    docker build コマンドの最後にある . は、Dockerfile を探し出す先はカレントディレクトリであることを Docker に指示しています。

アプリコンテナーの起動

イメージが出来上がったので、docker run コマンドを使ってコンテナー内のアプリケーションを実行します。

  1. docker run コマンドを実行してコンテナーを起動します。 実行にあたっては、上で生成したイメージの名前を指定します。

    $ docker run -d -p 127.0.0.1:3000:3000 getting-started
    

    -d フラグ (--detach の短縮形) は、コンテナーをバックグラウンドで実行します。 これを行うと、Docker がコンテナーを起動した後に、端末上のプロンプトに戻ります。 またその場合、端末上にはログが表示されなくなります。

    -p フラグ (--publish の短縮形) は、ホストとコンテナーの間でのポートマッピングを生成します。 -p フラグには HOST:CONTAINER という書式の文字列を与えます。 ここで HOST はホストのアドレス、CONTAINER はコンテナー上のポートを表します。 このコマンドは、コンテナーのポート 3000 をホスト上の 127.0.0.1:3000 (localhost:3000) にマッピングするものです。 このポートマッピングがなかったとしたら、アプリケーションへのアクセスがホストからはできないことになります。

  2. しばらくしてウェブブラウザーから http://localhost:3000 にアクセスします。 アプリケーションが確認できます。

    空の todo リスト
  3. 1 つ、2 つとアイテムを追加します。 そして期待どおりに追加できていることを確認します。 アイテムには完了マークをつけることができます。 これを行ってからアイテムを削除してください。 このフロントエンド処理から、バックエンド内にアイテムを保存する処理がうまく動作していることがわかります。

ここまで todo リストマネージャーを実行し、いくつかアイテム操作を行ってみました。

コンテナーに目を向けてみると、少なくとも 1 つのコンテナーが動作していて、それは getting-started イメージとポート 3000 を利用するものであることがわかるはずです。 コンテナーを確認するには CLI から、または Docker Desktop のグラフィックインターフェースから確認できます。


端末画面から docker ps コマンドを実行すると、コンテナーを一覧表示できます。

$ docker ps

出力結果は以下のようなものになるはずです。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
df784548666d        getting-started     "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        127.0.0.1:3000->3000/tcp   priceless_mcclintock

Docker Desktop 画面にて Containers (コンテナー) タブをクリックしてコンテナー一覧を確認します。

Docker Desktop と get-started コンテナーの実行確認

まとめ

本節では Dockerfile を生成してイメージをビルドする基本操作を学びました。 イメージをビルドした後は、コンテナーを起動してアプリケーションが起動することを確認しました。

関連情報

次のステップ

次ではアプリケーションの修正を行います。 そして新たなイメージを使って起動中のアプリケーションを更新する方法について学びます。 その際には他の便利なコマンドについてもいろいろ学んでいきます。