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

以降のガイドでは、 Node.js で動作するシンプルな Todo リスト管理を扱います。Node.js に慣れていなくても、心配はいりません。このガイドでは JavaScript の事前経験は要りません。

このガイドを終えるために、以下の項目が必要です:

アプリの入手

アプリケーションを実行する前に、マシン上にアプリケーションのソースコードを入手する必要があります。

  1. 次のコマンドを使い、 getting-started リポジトリ をクローンします。

    $ git clone https://github.com/docker/getting-started.git
    
  2. クローンしたリポジトリの内容を表示します。 getting-started/app ディレクトリ内に、 package.json と2つのサブディレクトリ( srcspec )が見えるでしょう。

    Virusl Studio Code で 読み込んだアプリのスクリーンショット

アプリのコンテナ イメージを 構築(build)

コンテナ イメージ構築(build) するには、 Dockerfile を使う必要があります。Dockerfile とはシンプルな文字情報を主体とするファイルで、ファイルの拡張子がありません。このファイル内に命令のスクリプトが入っています。Docker はコンテナ イメージを構築するために、このスクリプトを使います。

  1. 同じ場所に package.json ファイル等がある app ディレクトリ内で、 Dockerfile という名前のファイルを作成します。使っているオペレーティングシステムに応じた Dockerfile を作成するには、以下のコマンドが使えます。

Mac / Linux

ターミナル上で、以下に記載してあるコマンドを実行します。 ディレクトリを app ディレクトリに変更します。 /path/to/appgetting-started/app ディレクトリのパスに置き換えます。

$ cd /path/to/app

Dockerfile という名前の空ファイルを作成します。

$ touch Dockerfile

Windows

Windows コマンドプロンプト上で、以下に記載してあるコマンドを実行します。 ディレクトリを app ディレクトリに変更します。 \path\to\appgetting-started\app ディレクトリのパスに置き換えます。

$ cd \path\to\app

Dockerfile という名前の空ファイルを作成します。

$ type nul > Dockerfile
  1. テキストエディタかコードエディタを使い、Dockerfile に以下の内容を追加します。

    # syntax=docker/dockerfile:1
    FROM node:18-alpine
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "src/index.js"]
    EXPOSE 3000
    
  1. 以下のコマンドを使い、コンテナイメージを構築します。

    ターミナル上で、ディレクトリを getting-started/app ディレクトリに変更します。 /path/to/app のパスは、自分の getting-started/app ディレクトリに置き換えます。

    $ cd /path/to/app
    

    コンテナイメージを構築します。

    $ docker build -t getting-started .
    

    docker build コマンドは Dockerfile を使い新しいコンテナイメージを構築します。Docker が多くの「 レイヤー(layer) 」をダウンロードするのが分かるでしょう。こうなるのは、 構築用プログラム(builder) に対して node:18-alpine イメージから始めると命令したからです。ですが、まだマシン上にイメージがないため、 Docker はイメージをダウンロードする必要があります。

    Docker がイメージをダウンロードした後は、 Dockerfile の命令によってアプリケーションをコピーし、それから、 yarn を使ってアプリケーションの依存関係をインストールします。 CMD 命令は、このイメージからコンテナを起動したとき、デフォルトで実行するコマンドを指定します。

    最後に -t フラグでイメージに タグ(tag) を付けます。タグとは、最終イメージに対して、人間が読める名前を単に付けるためと考えてください。このイメージには getting-started と名前を付けましたので、このイメージ名を示してコンテナを実行できます。

    docker build コマンドの最後にある . は、Docker に対して、現在のディレクトリ内にある Dockerfile を探すべきと命令します。

アプリ コンテナの起動

イメージが手に入りましたので、コンテナ内でアプリケーションを実行できます。そのためには、 docker run コマンドを使います。

  1. コンテナを起動するには、 docker run コマンドを使い、先ほど作成したイメージ名を指定します。

    $ docker run -dp 127.0.0.1:3000:3000 getting-started
    

    --d フラグ( --detach の省略)は、コンテナをバックグラウンドで実行します。 -p フラグ( --publish の省略)は、ホストとコンテナ間でポートの関連付け( ポート マッピング(port mapping) )を作成します。 -p フラグは HOST:CONTAINER という書式の文字列値です。 HOST はホスト上のアドレスにあたり、 CONTAINER はコンテナ上で対象となるポートです。このコマンドが示すのは、コンテナのポート 3000 をホスト上の 127.0.0.1:3000localhost:3000 )へ公開します。ポート割り当ての指定がなければ、ホスト上からアプリケーションに接続できません。

  1. 数秒後、自分のウェブ ブラウザで http://localhost:3000 を開きます。そうしたら、私たちのアプリが見えるでしょう。

    まだ何も入っていない ToDo List
  1. あとはアイテムを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 タブを選びます。

Docker ダッシュボードにはチュートリアルとアプリ用コンテナが実行中

次のステップ

この短いセクションでは、コンテナ イメージを構築するための、 Dockerfile を作成する基本を学びました。イメージを構築した後、コンテナを実行し、アプリケーションが動作しているのが見えます。

次はアプリに変更を加え、実行中のアプリケーションを新しいイメージに更新する方法を学びます。その途中で、幾つかの便利なコマンドも学びます。

参考

Containerize an application

https://docs.docker.com/get-started/02_our_app