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