arrow_back

Docker の概要

参加 ログイン

Docker の概要

1時間 クレジット: 1

GSP055

Google Cloud セルフペース ラボ

概要

Docker は、アプリケーションを開発、リリース、実行するためのオープン プラットフォームです。Docker を使用すると、アプリケーションをインフラストラクチャから分離して、インフラストラクチャをマネージド アプリケーションのように扱うことができます。また、コードのリリース、テスト、デプロイを高速化し、コード作成とコード実行のサイクルを短縮できます。

Docker は、カーネル コンテナ化機能と、アプリの管理とデプロイをサポートするワークフローおよびツールを組み合わせることでこれを実現します。

Docker コンテナは Kubernetes で直接使用できるため、Kubernetes Engine で簡単に実行できます。Docker の基本を学ぶことで、Kubernetes とコンテナ化アプリケーションを開発するスキルが身に付きます。

ラボの内容

このラボでは、次の方法について学びます。

  • Docker コンテナをビルド、実行、デバッグする方法
  • Docker Hub と Google Container Registry から Docker イメージを pull する方法
  • Docker イメージを Google Container Registry に push する方法

要件

これは入門レベルのラボです。Docker とコンテナを使用した経験がほとんどない、あるいはまったくない方を対象としています。Cloud Shell とコマンドラインの知識があれば役立ちますが、必須ではありません。このサービスエリアの上級者向け資料をお探しの場合は、以下のラボをご確認ください。

準備ができたら、下にスクロールしてラボ環境をセットアップしてください。

設定と要件

Qwiklabs の設定

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

この Qwiklabs ハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

必要なもの

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
  • ラボを完了するために十分な時間

注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、ラボでは使用しないでください。

注: Chrome OS デバイスを使用している場合は、シークレット ウィンドウを開いてこのラボを実行してください。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Google Cloud Shell の有効化

Google Cloud Shell は、デベロッパー ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Google Cloud Shell では、コマンドラインで GCP リソースにアクセスできます。

GCP Console の右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

Cloud Shell アイコン

[続行] をクリックします。

cloudshell_continue

環境のプロビジョニングと接続には少し時間がかかります。接続すると、すでに認証されており、プロジェクトは PROJECT_ID に設定されています。例えば:

Cloud Shell 端末

gcloud は Google Cloud Platform のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

次のコマンドを使用すると、有効なアカウント名を一覧表示できます。

gcloud auth list

出力:

ACTIVE: *
ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net
To set the active account, run:
    $ gcloud config set account `ACCOUNT`
	

次のコマンドを使用すると、プロジェクト ID を一覧表示できます。

gcloud config list project
	

出力:

[core]
project = <project_ID>
	

出力例:

[core]
project = qwiklabs-gcp-44776a13dea667a6
	

Hello World

まずは、Cloud Shell を開いて次のコマンドを入力し、hello world コンテナを実行します。

docker run hello-world

(コマンド出力)

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

この単純なコンテナから返された Hello from Docker! が 表示されます。コマンド自体はシンプルですが、出力内で、コマンドによって実行されたステップ数に注目してください。Docker デーモンは hello-world イメージを検索し、ローカルでは見つけることができませんでした。そこで Docker Hub という一般公開レジストリからイメージを pull し、そのイメージからコンテナを作成して実行しています。

次のコマンドを実行して、Docker Hub から pull されたコンテナ イメージを確認します。

docker images

(コマンド出力)

REPOSITORY     TAG      IMAGE ID       CREATED       SIZE
hello-world    latest   1815c82652c0   6 days ago    1.84 kB

これは、Docker Hub 一般公開レジストリから pull されたイメージです。イメージ ID は SHA256 ハッシュ形式で示され、このフィールドではプロビジョニング済みの Docker イメージが指定されます。Docker デーモンがローカルでイメージを見つけることができない場合、デフォルトで一般公開レジストリを検索します。もう一度コンテナを実行してみましょう。

docker run hello-world

(コマンド出力)

Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
...

この 2 回目の実行で、Docker デーモンはローカル レジストリでイメージを見つけ出し、そのイメージからコンテナを実行します。Docker Hub からイメージを pull する必要はありません。

最後に、次のコマンドを使用して実行中のコンテナを確認します。

docker ps

(コマンド出力)

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

実行中のコンテナはありません。以前実行した hello-world コンテナはすでに終了しています。終了したものを含むすべてのコンテナを表示するには、docker ps -a を実行します。

docker ps -a

(コマンド出力)

CONTAINER ID      IMAGE           COMMAND      ...     NAMES
6027ecba1c39      hello-world     "/hello"     ...     elated_knuth
358d709b8341      hello-world     "/hello"     ...     epic_lewin

この出力では、コンテナ ID(コンテナの識別用に Docker によって生成された UUID)と、実行に関する補足のメタデータが表示されます。コンテナの名前はランダムに生成されますが、docker run --name [コンテナ名] hello-world で指定することもできます。

ビルド

単純な node アプリケーションに基づく Docker イメージをビルドしましょう。次のコマンドを実行して test という名前のフォルダを作成し、このフォルダに移動します。

mkdir test && cd test

DockerFile を作成します。

cat > Dockerfile <<EOF
# 上位イメージとして正式な Node ランタイムを使用します
FROM node:6
# コンテナの作業ディレクトリを /app に設定します
WORKDIR /app
# 現行ディレクトリの内容を /app のコンテナにコピーします
ADD . /app
# コンテナのポート 80 で外部からアクセスできるようにします
EXPOSE 80
# コンテナの起動時に node を使用して app.js を実行します
CMD ["node", "app.js"]
EOF

このファイルは、Docker デーモンにイメージのビルド方法を指示するものです。

  • 最初の行で、ベースとなる上位イメージを指定します。この例では、node バージョン 6 の正式な Docker イメージです。
  • 2 行目でコンテナの作業(現行)ディレクトリを設定します。
  • 3 行目では、現行ディレクトリの内容("." で示す)をコンテナに追加します。
  • 次にコンテナのポートを公開してこのポートでの接続を受け入れ、最後に node コマンドを実行してアプリケーションを起動します。

次に node アプリケーションを作成し、その後はイメージのビルドに進みます。

次のコマンドを実行して node アプリケーションを作成します。

cat > app.js <<EOF
const http = require('http');
const hostname = '0.0.0.0';
const port = 80;
const server = http.createServer((req, res) => {
    res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World\n');
});
server.listen(port, hostname, () => {
    console.log('Server running at http://%s:%s/', hostname, port);
});
process.on('SIGINT', function() {
    console.log('Caught interrupt signal and will exit');
    process.exit();
});
EOF

これは、ポート 80 でリッスンし、「Hello World」を返す単純な HTTP サーバーです。

ではイメージのビルドに進みましょう。

前述したように、“.” は現行ディレクトリを示すため、Dockerfile が含まれるディレクトリ内から次のコマンドを実行する必要があります。

docker build -t node-app:0.1 .

このコマンドが完了するまでに数分かかる場合があります。完了すると、次のような出力が表示されます。

Sending build context to Docker daemon 3.072 kB
Step 1 : FROM node:6
6: Pulling from library/node
...
...
...
Step 5 : CMD node app.js
 ---> Running in b677acd1edd9
 ---> f166cd2a9f10
Removing intermediate container b677acd1edd9
Successfully built f166cd2a9f10

-t は、name:tag 構文を使用してイメージに名前とタグを付けることを意味します。イメージの名前は node-appタグ0.1 です。Docker イメージをビルドする際には、タグの指定を強くおすすめします。指定しないと、タグはデフォルトで latest になり、新しいイメージと古いイメージを区別するのが難しくなります。また、上記の Dockerfile の各行で、イメージのビルドに伴って中間コンテナレイヤが生成されている点もご確認ください。

次のコマンドを実行して、ビルドしたイメージを確認します。

docker images

出力は次のようになります。

REPOSITORY     TAG      IMAGE ID        CREATED            SIZE
node-app       0.1      f166cd2a9f10    25 seconds ago     656.2 MB
node           6        5a767079e3df    15 hours ago       656.2 MB
hello-world    latest   1815c82652c0    6 days ago         1.84 kB

node はベースイメージで、ビルドしたイメージは node-app です。node を削除する場合は、先に node-app を削除する必要があります。イメージのサイズは VM と比較すると相対的に小さくなっており、node:slimnode:alpine といった他のバージョンの node イメージはさらに小さいため、簡単に移植できます。コンテナのサイズを小さくする方法は、上級者向けトピックに詳しく記載されています。こちらの公式リポジトリですべてのバージョンを確認できます。

実行

このモジュールでは次のコードを使用して、ビルドしたイメージに基づいてコンテナを実行します。

docker run -p 4000:80 --name my-app node-app:0.1

(コマンド出力)

Server running at http://0.0.0.0:80/

--name フラグを使用すると、必要に応じてコンテナに名前を付けることができます。-p で、ホストのポート 4000 をコンテナのポート 80 に割り当てることを Docker に指示します。これで http://localhost:4000 のサーバーにアクセスできるようになります。ポートのマッピングが適用されていないと、localhost のコンテナにアクセスできません。

別のターミナルを開き(Cloud Shell で [+] アイコンをクリック)、サーバーをテストします。

curl http://localhost:4000

(コマンド出力)

Hello World

コンテナは、最初のターミナルが稼働している限り実行されます。コンテナをバックグラウンドで実行する(ターミナルのセッションに関連付けない)場合は、-d フラグを指定する必要があります。

最初のターミナルを閉じてから、次のコマンドを実行してコンテナを停止、削除します。

docker stop my-app && docker rm my-app

次のコマンドを実行してバックグラウンドでコンテナを起動します。

docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps

(コマンド出力)

CONTAINER ID   IMAGE          COMMAND        CREATED         ...  NAMES
xxxxxxxxxxxx   node-app:0.1   "node app.js"  16 seconds ago  ...  my-app

docker ps の出力で、コンテナが実行されていることがわかります。ログを確認する場合は、docker logs [コンテナ ID] を実行します。

docker logs [コンテナ ID]

(コマンド出力)

Server running at http://0.0.0.0:80/

アプリケーションを修正してみましょう。Cloud Shell で、このラボで作成したテスト ディレクトリを開きます。

cd test

任意のテキスト エディタ(nano や vim など)で app.js を編集し、「Hello World」を別の文字列に置き換えます。

....
const server = http.createServer((req, res) => {
    res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
        res.end('Welcome to Cloud\n');
});
....

新しいイメージをビルドして、タグ 0.2 を指定します。

docker build -t node-app:0.2 .

(コマンド出力)

Step 1/5 : FROM node:6
 ---> 67ed1f028e71
Step 2/5 : WORKDIR /app
 ---> Using cache
 ---> a39c2d73c807
Step 3/5 : ADD . /app
 ---> a7087887091f
Removing intermediate container 99bc0526ebb0
Step 4/5 : EXPOSE 80
 ---> Running in 7882a1e84596
 ---> 80f5220880d9
Removing intermediate container 7882a1e84596
Step 5/5 : CMD node app.js
 ---> Running in f2646b475210
 ---> 5c3edbac6421
Removing intermediate container f2646b475210
Successfully built 5c3edbac6421
Successfully tagged node-app:0.2

ステップ 2 では、既存のキャッシュ レイヤを使用しています。app.js に変更を加えているため、ステップ 3 以降ではレイヤが修正されています。

新しいイメージ バージョンで別のコンテナを実行します。80 の代わりにホストのポート 8080 を割り当てる方法に注目してください。ホストポート 4000 はすでに使われているため、使用できません。

docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps

(コマンド出力)

CONTAINER ID     IMAGE             COMMAND            CREATED
xxxxxxxxxxxx     node-app:0.2      "node app.js"      53 seconds ago      ...
xxxxxxxxxxxx     node-app:0.1      "node app.js"      About an hour ago   ...

コンテナをテストします。

curl http://localhost:8080

(コマンド出力)

Welcome to Cloud

それでは、自分で作った最初のコンテナをテストしてみましょう。

curl http://localhost:4000

(コマンド出力)

Hello World

デバッグ

コンテナのビルドと実行について理解できたところで、デバッグの演習に進みましょう。

docker logs [コンテナ ID] を使用して、コンテナのログを確認できます。コンテナの実行中にログの出力を監視する場合は、-f オプションを使用します。

docker logs -f [コンテナ ID]

(コマンド出力)

Server running at http://0.0.0.0:80/

実行中のコンテナ内で対話型 Bash セッションを開始する必要がある場合は、docker exec を使用してください。別のターミナルを開き(Cloud Shell で [+] アイコンをクリック)、次のコマンドを入力します。

docker exec -it [コンテナ ID] bash

-it フラグを使用することで、pseudo-tty を割り当てて stdin を開いたままにし、コンテナとやり取りすることができます。bash は Dockerfile で指定された WORKDIR ディレクトリ(/app)で実行されることに注意してください。これ以降は、デバッグするコンテナ内に対話型のシェル セッションがあります。

(コマンド出力)

root@xxxxxxxxxxxx:/app#

ディレクトリを確認します。

ls

(コマンド出力)

Dockerfile  app.js
root@xxxxxxxxxxxx:/app#

Bash セッションを終了します。新しいターミナルで、次のように入力します。

exit

Docker inspect を使用して、Docker 内でコンテナのメタデータを調べることができます。

docker inspect [コンテナ ID]

(コマンド出力)

[
    {
        "Id": "xxxxxxxxxxxx....",
        "Created": "2017-08-07T22:57:49.261726726Z",
        "Path": "node",
        "Args": [
            "app.js"
        ],
...

返された JSON の特定のフィールドを調査するには、--format を使用します。次に例を示します。

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [コンテナ ID]

(出力例)

192.168.9.3

以下のリソースでデバッグの詳細を必ずご確認ください。

公開

次は、イメージを Google Container Registry(gcr)にプッシュします。その後、すべてのコンテナとイメージを削除して新規の環境をシミュレートしてから、コンテナを pull して実行します。これによって、Docker コンテナの移植性がわかります。

gcr がホストする非公開レジストリにイメージを push する場合、レジストリ名を使ってイメージにタグを付ける必要があります。形式は [ホスト名]/[プロジェクト ID]/[イメージ]:[タグ] です。

gcr の場合

  • [ホスト名]= gcr.io
  • [プロジェクト ID]= プロジェクトの ID
  • [イメージ]= イメージ名
  • [タグ]= 任意の文字列タグ(指定しない場合はデフォルトで「latest」に設定されます)

プロジェクト ID は次のコマンドを実行して確認できます。

gcloud config list project

(コマンド出力)

[core]
project = [プロジェクト ID]
Your active configuration is: [default]

node-app:0.2 にタグを付けます。[プロジェクト ID] は実際の構成に置き換えてください。

docker tag node-app:0.2 gcr.io/[プロジェクト ID]/node-app:0.2
docker images

(コマンド出力)

REPOSITORY                      TAG         IMAGE ID          CREATED
node-app                        0.2         76b3beef845e      22 hours ago
gcr.io/[プロジェクト ID]/node-app    0.2         76b3beef845e      22 hours ago
node-app                        0.1         f166cd2a9f10      26 hours ago
node                            6           5a767079e3df      7 days ago
hello-world                     latest      1815c82652c0      7 weeks ago

このイメージを gcr に push します。[プロジェクト ID] を忘れずに置き換えてください。

docker push gcr.io/[プロジェクト ID]/node-app:0.2

コマンド出力(実際の出力とは異なる場合があります)

The push refers to a repository [gcr.io/[プロジェクト ID]/node-app]
057029400a4a: Pushed
342f14cb7e2b: Pushed
903087566d45: Pushed
99dac0782a63: Pushed
e6695624484e: Pushed
da59b99bbd3b: Pushed
5616a6292c16: Pushed
f3ed6cb59ab0: Pushed
654f45ecb7e3: Pushed
2c40c66f7667: Pushed
0.2: digest: sha256:25b8ebd7820515609517ec38dbca9086e1abef3750c0d2aff7f341407c743c46 size: 2419

ウェブブラウザのイメージ レジストリにアクセスし、イメージが gcr に存在していることを確認します。コンソールで [ツール] > [Container Registry] に移動するか、http://gcr.io/[プロジェクト ID]/node-app にアクセスしてください。以下のようなページが表示されます。

8afb07930833e781.png

このイメージをテストするために、新しい VM を起動して ssh で接続し、gcloud をインストールしてみましょう。わかりやすいように、すべてのコンテナとイメージを削除して新規の環境をシミュレートします。

すべてのコンテナを停止して削除します。

docker stop $(docker ps -q)
docker rm $(docker ps -aq)

node イメージを削除する前に、(node:6 の)下位のイメージを削除する必要があります。[プロジェクト ID] は置き換えてください。

docker rmi node-app:0.2 gcr.io/[プロジェクト ID]/node-app node-app:0.1
docker rmi node:6
docker rmi $(docker images -aq) # remove remaining images
docker images

(コマンド出力)

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

この時点で新規の疑似環境が用意できたことになります。イメージを pull して実行します。[プロジェクト ID] を忘れずに置き換えてください。

docker pull gcr.io/[プロジェクト ID]/node-app:0.2
docker run -p 4000:80 -d gcr.io/[プロジェクト ID]/node-app:0.2
curl http://localhost:4000

(コマンド出力)

Welcome to Cloud

完了したタスクをテストする

[進行状況を確認] をクリックして、実行したタスクを確認します。コンテナ イメージが正常に公開されている場合は、評価スコアが表示されます。

コンテナ イメージを Container Registry に公開する

これで、コンテナの移植性を実際に確認できました。ホスト(オンプレミスまたは VM)に Docker がインストールされていれば、一般公開レジストリまたは非公開レジストリからイメージを pull し、そのイメージに基づいてコンテナを実行できます。Docker 以外には、ホストにインストールする必要のあるアプリケーションの依存関係はありません。

まとめ

Docker の概要については以上です。演習の内容を振り返ってみましょう。

  • Docker Hub の公開イメージに基づいてコンテナを実行しました。
  • 独自のコンテナ イメージをビルドし、Google Container Registry に push しました。
  • 実行中のコンテナをデバッグする方法を学びました。
  • Google Container Registry から pull したイメージに基づいてコンテナを実行しました。

6d0798e24a18671b.png

クエストの終了

このセルフペース ラボは、Qwiklabs の Kubernetes in the Google Cloud クエストの一部です。クエストとは、学習パスを構成する一連のラボです。完了すると、その成果が認められて上のバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクすることができます。このラボを終えたら、このクエストに登録して、すぐにクレジットを受け取れます。受講可能なその他の Qwiklabs のクエストもご確認ください。

次のラボの受講

Hello Node Kubernetes に進んでクエストを続けるか、以下のおすすめをご確認ください。

次のステップと詳細情報

Google Cloud Training & Certification

Google Cloud 技術を最大限に活用できるようになります。このクラスでは、必要な技術力とベスト プラクティスを習得し、継続的に学習することができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、仮想環境など、多忙なスケジュールに対応できるオプションが用意されています。認定資格を取得することで、Google Cloud の技術のスキルと知識を証明できます。

マニュアルの最終更新日: 2019 年 6 月 12 日
ラボの最終テスト日: 2019 年 6 月 12 日

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。