アプリケーションのコンテナ化¶
以降のガイドでは、 Node.js で動作するシンプルな Todo リスト管理を扱います。Node.js に慣れていなくても、心配はいりません。このガイドでは JavaScript の事前経験は要りません。
このガイドを終えるために、以下の項目が必要です:
ローカルで動作する Docker。 Docker のダウンロードとインストール の手順に従ってください。
-
注釈
Windows を利用中で、Git Bash を使って Docker コマンドを実行したい場合は、構文の違いについて Git Bash で動かす を御覧ください。
ファイルを編集するための IDE (統合開発環境)やテキストエディタ。Docker は Visual Studio Code の利用を推奨します。
コンテナとイメージ の概念を理解。
アプリの入手¶
アプリケーションを実行する前に、マシン上にアプリケーションのソースコードを入手する必要があります。
次のコマンドを使い、 getting-started リポジトリ をクローンします。
$ git clone https://github.com/docker/getting-started.git
クローンしたリポジトリの内容を表示します。
getting-started/app
ディレクトリ内に、package.json
と2つのサブディレクトリ(src
とspec
)が見えるでしょう。
アプリのコンテナ イメージを 構築 ¶
コンテナ イメージ を Dockerfile
を使う必要があります。Dockerfile とはシンプルな文字情報を主体とするファイルで、ファイルの拡張子がありません。このファイル内に命令のスクリプトが入っています。Docker はコンテナ イメージを構築するために、このスクリプトを使います。
同じ場所に
package.json
ファイル等があるapp
ディレクトリ内で、Dockerfile
という名前のファイルを作成します。使っているオペレーティングシステムに応じた Dockerfile を作成するには、以下のコマンドが使えます。
Mac / Linux
ターミナル上で、以下に記載してあるコマンドを実行します。 ディレクトリを
app
ディレクトリに変更します。/path/to/app
をgetting-started/app
ディレクトリのパスに置き換えます。$ cd /path/to/app
Dockerfile
という名前の空ファイルを作成します。$ touch DockerfileWindows
Windows コマンドプロンプト上で、以下に記載してあるコマンドを実行します。 ディレクトリを
app
ディレクトリに変更します。\path\to\app
をgetting-started\app
ディレクトリのパスに置き換えます。$ cd \path\to\app
Dockerfile
という名前の空ファイルを作成します。$ type nul > Dockerfile
テキストエディタかコードエディタを使い、Dockerfile に以下の内容を追加します。
# syntax=docker/dockerfile:1 FROM node:18-alpine WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"] EXPOSE 3000
以下のコマンドを使い、コンテナイメージを構築します。
ターミナル上で、ディレクトリを
getting-started/app
ディレクトリに変更します。/path/to/app
のパスは、自分のgetting-started/app
ディレクトリに置き換えます。$ cd /path/to/app
コンテナイメージを構築します。
$ docker build -t getting-started .
docker build
コマンドは Dockerfile を使い新しいコンテナイメージを構築します。Docker が多くの「レイヤー 」をダウンロードするのが分かるでしょう。こうなるのは、構築用プログラム に対してnode:18-alpine
イメージから始めると命令したからです。ですが、まだマシン上にイメージがないため、 Docker はイメージをダウンロードする必要があります。Docker がイメージをダウンロードした後は、 Dockerfile の命令によってアプリケーションをコピーし、それから、
yarn
を使ってアプリケーションの依存関係をインストールします。CMD
命令は、このイメージからコンテナを起動したとき、デフォルトで実行するコマンドを指定します。最後に
-t
フラグでイメージにタグ を付けます。タグとは、最終イメージに対して、人間が読める名前を単に付けるためと考えてください。このイメージにはgetting-started
と名前を付けましたので、このイメージ名を示してコンテナを実行できます。docker build
コマンドの最後にある.
は、Docker に対して、現在のディレクトリ内にあるDockerfile
を探すべきと命令します。
アプリ コンテナの起動¶
イメージが手に入りましたので、コンテナ内でアプリケーションを実行できます。そのためには、 docker run
コマンドを使います。
コンテナを起動するには、
docker run
コマンドを使い、先ほど作成したイメージ名を指定します。$ docker run -dp 127.0.0.1:3000:3000 getting-started
--d
フラグ(--detach
の省略)は、コンテナをバックグラウンドで実行します。-p
フラグ(--publish
の省略)は、ホストとコンテナ間でポートの関連付け(ポート マッピング )を作成します。-p
フラグはHOST:CONTAINER
という書式の文字列値です。HOST
はホスト上のアドレスにあたり、CONTAINER
はコンテナ上で対象となるポートです。このコマンドが示すのは、コンテナのポート 3000 をホスト上の127.0.0.1:3000
(localhost:3000
)へ公開します。ポート割り当ての指定がなければ、ホスト上からアプリケーションに接続できません。
数秒後、自分のウェブ ブラウザで http://localhost:3000 を開きます。そうしたら、私たちのアプリが見えるでしょう。
あとはアイテムを1つ2つと追加したら、期待通りに動作するでしょう。完了したアイテムに印を付けると、アイテムを削除できます。このように、フロントエンドはバックエンドへのアイテム保存に成功しています。
この時点で、全て自分で構築した todo リストマネージャは実行中で、複数のアイテムが入っています。
ここでコンテナをちょっと調べると、 getting-started
イメージを使い、ポート 3000
を使っている実行中のコンテナが、少なくとも1つ見えるでしょう。コンテナを調べるには、 CLI か Docker Desktop のグラフィカルインターフェースが使えます。
CLI
コンテナ一覧を表示するには、ターミナル上で以下の
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
Docker Desktop では、コンテナ一覧を表示するには Containers タブを選びます。