アプリケーションのコンテナー化
ここからのガイドでは、Node.js において稼動する単純な ToDo リストマネージャーを作っていくことにします。 Node.js をよくわかっていなくても心配ありません。 JavaScript の知識などなくてもかまいません。
前提条件
- 最新バージョンの Docker Desktop をインストールしていること。
- Git クライアント をインストールしていること。
- ファイル編集のために IDE あるいはテキストエディターを用意していること。 Docker では Visual Studio Code の利用を推奨。
アプリの入手
アプリケーションを実行するために、アプリケーションのソースコードを入手してマシン上におくことが必要です。
以下のコマンドを実行して getting-started-app リポジトリ のクローンを行います。
$ git clone https://github.com/docker/getting-started-app.gitクローンを行ったリポジトリの内容を確認します。 以下のようなファイルやサブディレクトリが確認できます。
├── getting-started-app/ │ ├── .dockerignore │ ├── package.json │ ├── README.md │ ├── spec/ │ ├── src/ │ └── yarn.lock
アプリイメージのビルド
イメージをビルドするには Dockerfile を用いる必要があります。 Dockerfile とは単純なテキストファイルであって、拡張子を持ちません。 そこにはさまざまな命令がスクリプトとして記述されます。 Docker はこのスクリプトを使ってコンテナーイメージをビルドします。
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 イメージです。 イメージに対しては全ソースコードがコピーされ、必要な依存パッケージがインストールされた上で、アプリケーションが起動します。以下のコマンドを実行してイメージをビルドします。
端末内ではカレントディレクトリを
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 コマンドを使ってコンテナー内のアプリケーションを実行します。
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) にマッピングするものです。 このポートマッピングがなかったとしたら、アプリケーションへのアクセスがホストからはできないことになります。しばらくしてウェブブラウザーから http://localhost:3000 にアクセスします。 アプリケーションが確認できます。

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 (コンテナー) タブをクリックしてコンテナー一覧を確認します。

まとめ
本節では Dockerfile を生成してイメージをビルドする基本操作を学びました。 イメージをビルドした後は、コンテナーを起動してアプリケーションが起動することを確認しました。
関連情報
次のステップ
次ではアプリケーションの修正を行います。 そして新たなイメージを使って起動中のアプリケーションを更新する方法について学びます。 その際には他の便利なコマンドについてもいろいろ学んでいきます。
アプリケーションの更新