概要
Docker は、コンテナ内のアプリケーションを開発、リリース、実行するためのオープン プラットフォームです。Docker を使用すると、コードのビルド、テスト、デプロイを高速化し、コードの開発から実行までのサイクルを短縮できます。Docker は、カーネル コンテナ化機能と、アプリケーションの管理およびデプロイをサポートするワークフローとツールを組み合わせることでこれらを実現します。
Docker では、Dockerfile と呼ばれるスクリプトを使用して、アプリケーションのビルドプロセスを表現できます。Dockerfile は、複雑ではあるが柔軟性のある下位レベルのアプローチです。Dockerfile は、ソースコードをコンテナ イメージに変換する方法を詳しく説明するマニフェストです。
Docker コンテナは Cloud Run と Kubernetes で直接使用できるため、これらのプラットフォームで簡単に実行できます。Docker の基本を学ぶことで、コンテナ化アプリケーションを開発するスキルが身に付きます。
目標
このラボでは、次の方法について学びます。
- Docker コンテナをビルド、実行、デバッグする。
- Docker イメージを Google Cloud のコンテナ イメージ リポジトリである Artifact Registry に push する。
- Artifact Registry から Docker イメージを pull する。
設定
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
Qwiklabs にシークレット ウィンドウでログインします。
-
ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
-
準備ができたら、[ラボを開始] をクリックします。
-
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
-
[Google Console を開く] をクリックします。
-
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
-
利用規約に同意し、再設定用のリソースページをスキップします。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

-
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
出力:
Credentialed accounts:
- @.com (active)
出力例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project =
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注:
gcloud ドキュメントの全文については、
gcloud CLI の概要ガイド
をご覧ください。
タスク 1. 環境を設定する
このラボでは、ラボ用に事前プロビジョニングされた別の VM でシェルコマンドを実行します。
-
VM で SSH セッションを開始するには、Cloud Shell で次のコマンドを実行します。
gcloud compute ssh lab-vm --zone={{{project_0.default_zone| Zone}}}
-
プロンプトが表示されたら、「Y」と入力して続行します。
-
パスフレーズは、Enter キーを押して使用しないようにします。
-
Enter キーをもう一度押します。
-
Docker で使用されるソケットに対する権限を、受講者ユーザーに付与します。
sudo chmod 666 /var/run/docker.sock
-
次のコマンドを実行して、プロジェクト ID とリージョンの環境変数を設定します。
PROJECT_ID={{{project_0.project_id| Project}}}
REGION={{{project_0.default_region| Region}}}
以下のタスクのすべてのラボコマンドを、Cloud Shell の SSH セッションで実行してください。
タスク 2. コンテナ イメージをビルドする
このタスクでは、Dockerfile を使用して Docker コンテナ イメージを作成します。
Dockerfile を作成する
-
テスト ディレクトリを作成し、そのディレクトリに移動します。
mkdir test && cd test
-
Dockerfile を作成します。
cat > Dockerfile <<EOF
# 上位イメージとして正式な Node ランタイムを使用します
FROM node:lts
# コンテナの作業ディレクトリを /app に設定します
WORKDIR /app
# 現行ディレクトリの内容を /app のコンテナにコピーします
COPY . /app
# コンテナのポート 80 を外部からアクセスできるようにします
EXPOSE 80
# コンテナの起動時に Node を使用して app.js を実行します
CMD ["node", "app.js"]
EOF
注: この手順では、まず親イメージまたはベースイメージを選択して、コンテナ イメージを組み立てます。これは、FROM 命令と Node の lts(長期サポート)バージョンの公式 Docker イメージで指定されます。
WORKDIR 命令セットは、Dockerfile で後続する追加の命令のコンテナ内の作業ディレクトリを設定します。このラボでは、/app ディレクトリをコンテナの作業ディレクトリとして使用します。
COPY 命令は、ソースの場所からコンテナ イメージのファイル システムの宛先パスにディレクトリまたはファイルをコピーします。ここでは、現在のディレクトリから /app にファイルをコピーします。
EXPOSE 命令は、コンテナのポートを公開して、そのポート(このラボではポート 80)で接続を受け入れるようにします。
最後に、CMD 命令は、実行中のコンテナでアプリケーションを実行するノードコマンドを提供します。
アプリケーションを開発する
次に、Node.js アプリケーションのコードを記述します。このアプリケーションは、ポート 80 でリクエストをリッスンし、静的メッセージで応答するシンプルな HTTP サーバーです。
-
アプリケーションのソースコードを含む app.js ファイルを作成します。
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('Welcome to your first Docker container!\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
注: アプリケーションは、コンテナが停止したときにメッセージをログに記録して正常に終了する SIGINT ハンドラ関数も実装しています。
-
アプリケーションのソースファイルの内容を確認します。
cat app.js
コンテナ イメージをビルドする
このサブタスクでは、docker build コマンドを使用して Dockerfile からコンテナ イメージをビルドします。
-
docker build コマンドを実行します。
docker build -t my-app:0.1 .
コマンド出力の一部を以下に示します。
=> [internal] load dockerignore
=> => transferring context: 2B
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 394B
=> [internal] load metadata for docker.io/library/node:lts
=> [1/3] FROM docker.io/library/node:lts@sha256:586cdef48f920dea2f47a954b8717601933aa1daa0a08264abf9144789abf8ae
=> => resolve docker.io/library/node:lts@sha256:586cdef48f920dea2f47a954b8717601933aa1daa0a08264abf9144789abf8ae
=> => sha256:b7483c70b94e9fbb68e91d64456ee147d120488f876d69efeae815ba164e8b54 2.21kB / 2.21kB
...
...
=> [internal] load build context
=> => transferring context: 912B
=> [2/3] WORKDIR /app
=> [3/3] COPY . /app
=> exporting to image
=> => exporting layers
=> => writing image sha256:8cf51a1aba351cf505cd6d8eefa966b
=> => naming to docker.io/library/my-app:0.1
注: このコマンドは、現在のディレクトリにある Dockerfile の手順からコンテナ イメージをビルドし、結果のイメージに指定された名前とバージョンでタグを付けます。Google では、新しいイメージ バージョンと古いイメージ バージョンを区別するためにタグを指定することをおすすめしています。
-
ビルドされたイメージのリストを表示します。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-app 0.1 8cf51a1aba35 10 minutes ago 997MB
注: このコマンドは、ベースイメージの node と、ビルドした my-app イメージを一覧表示します。イメージのサイズは、他の仮想マシン イメージと比較して相対的に小さくなっています。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
コンテナ イメージをビルドする
タスク 3. アプリケーションを実行してテストする
コンテナ イメージが正常にビルドされたら、アプリケーションを実行してテストし、期待どおりに動作することを確認できます。
コンテナを実行する
-
コンテナを実行するには、次のコマンドを実行します。
docker run -p 8080:80 --name my-app -d my-app:0.1
注: docker run コマンドは、指定された名前でコンテナを起動します。-p 引数は、ホストのポート 8080 をコンテナのポート 80 にマッピングし、リクエストが http://localhost:8080 のサーバーに到達できるようにします。-d 引数は、コンテナをバックグラウンドで実行します。
-
実行中のコンテナのリストを表示するには、次のコマンドを実行します。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46c209a1fd87 my-app:0.1 "docker-entrypoint.s…" 19 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp my-app
アプリケーションをテストする
-
アプリケーションをテストするには、curl コマンドを使用して HTTP リクエストを送信します。
curl http://localhost:8080
-
アプリケーションのレスポンスを確認します。
Welcome to your first Docker container!
-
docker stop コマンドを実行してコンテナを停止します。
docker stop [CONTAINER ID]
[CONTAINER ID] を、前のサブタスクで実行したコマンドの出力の CONTAINER ID の値に置き換えます。
タスク 4. コンテナを変更する
コンテナ化されたアプリケーションの複数のバージョンで、イメージ内の共通レイヤを共有できます。このタスクでは、コンテナ化されたアプリケーションの別のバージョンを作成し、両方のバージョンをテストします。
アプリケーション コードを変更する
-
test ディレクトリで、app.js ファイルの内容を更新します。
cat > app.js <<EOF
const http = require('http');
const url = require('url');
const hostname = '0.0.0.0';
const port = 80;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
console.log('Received request with URL: ?%s', req.url);
var q = url.parse(req.url, true).query;
res.end(q.user + ', Welcome to your first Docker container!\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
注: 変更されたアプリケーション コードでは、HTTP リクエストで渡された user クエリ パラメータの値がアプリケーションのレスポンスに追加されます。
-
cat コマンドを使用して、変更されたアプリケーション ソースファイルの内容を確認します。
cat app.js
コンテナ イメージを再ビルドする
-
新しいタグでイメージを再ビルドします。
docker build -t my-app:0.2 .
-
docker build コマンドの出力を確認します。
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 394B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/node:lts
=> [1/3] FROM docker.io/library/node:lts@sha256:586cdef48f920dea2f47a954b8717601933aa1daa0a08264abf9144789abf8ae
=> [internal] load build context
=> => transferring context: 691B
=> CACHED [2/3] WORKDIR /app
=> [3/3] COPY . /app
=> exporting to image
=> => exporting layers
=> => writing image sha256:5fc2d7a43c4678da17daf204ef4b071f2da869ead758864622d90d880a40c24b
=> => naming to docker.io/library/my-app:0.2
出力からわかるように、新しいコンテナ イメージでは、app.js ソースファイルに変更が加えられたため、ステップ 3 以下のレイヤのみが変更されています。
新しいコンテナを実行する
-
新しいコンテナを実行するには、次のコマンドを実行します。
docker run -p 8080:80 --name my-app-2 -d my-app:0.2
-
実行中のコンテナのリストを表示するには、次のコマンドを実行します。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7071749fe0f6 my-app:0.2 "docker-entrypoint.s…" 10 seconds ago Up 10 seconds 0.0.0.0:8081->80/tcp my-app-2
アプリケーションをテストする
-
アプリケーションをテストするには、curl を使用して HTTP リクエストを送信します。
curl http://localhost:8080?user=Learner
-
アプリケーションのレスポンスを確認します。
Learner, Welcome to your first Docker container!
注: レスポンスには、アプリケーションのイメージ バージョン 0.2 を実行しているコンテナへのリクエストで渡された user 引数の値が含まれています。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
コンテナを変更し、コンテナ イメージを再ビルドする。
タスク 5. トラブルシューティング
コンテナ化されたアプリケーションのトラブルシューティングには、簡単な手法がいくつかあります。このタスクでは、これらの方法の一部を確認します。
コンテナのログを表示する
-
まず、ログを表示する必要があるコンテナの ID を取得します。
docker ps
-
コンテナログを表示するには、docker logs コマンドを実行します。
docker logs [CONTAINER ID]
CONTAINER ID は、前のコマンドの出力からコンテナを一意に識別するコンテナ ID の最初の数文字に置き換えます。コンテナの実行中にログの出力を追う場合は、logs コマンドで -f オプションを使用します。
Server running at http://0.0.0.0:80/
Received request with URL: ?/?user=Learner
コンテナ内でシェルを起動する
実行中のコンテナ内でインタラクティブ シェルを起動して、トラブルシューティングを行うことができます。
-
インタラクティブな Bash セッションを開始するには、次のコマンドを実行します。
docker exec -it [CONTAINER ID] bash
root@7071749fe0f6:/app#
-
このシェル内から、コンテナのファイル システムや、アプリケーションが使用する可能性のあるその他のデータファイルを検査して、問題をトラブルシューティングできます。
ls
-
Bash シェルを終了します。
exit
コンテナのメタデータを調べる
-
コンテナのメタデータを表示するには、次のコマンドを実行します。
docker inspect [CONTAINER ID]
コマンド出力の一部を次に示します。
[
{
"Id": "7071749fe0f66b8b1953bbb6f28f159bd5dbeae079595675e2591d32d87ae5dc",
"Created": "2023-02-23T18:08:34.286519913Z",
"Path": "docker-entrypoint.sh",
"Args": [
"node",
"app.js"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1099,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-02-23T18:08:34.785098365Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5fc2d7a43c4678da17daf204ef4b071f2da869ead758864622d90d880a40c24b",
"ResolvConfPath": "/var/lib/docker/containers/7071749fe0f66b8b1953bbb6f28f159bd5dbeae079595675e2591d32d87ae5dc/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/
...
...
}
]
注: デフォルトでは、inspect コマンドは詳細なメタデータ情報を JSON 配列で提供します。--format 引数を使用して結果をフィルタし、出力の特定のフィールドを検査できます。
タスク 6. コンテナ イメージを公開する
Artifact Registry は、コンテナ イメージやソフトウェア パッケージなどのソフトウェア アーティファクトを非公開のリポジトリで保存、管理するための Google Cloud サービスです。
このタスクでは、コンテナ イメージを Artifact Registry に push して、ソフトウェア デリバリー ライフサイクルを構成するステージングや本番環境などの他の環境にデプロイできるようにします。
イメージ リポジトリを作成する
コンテナ イメージを Artifact Registry に push する前に、まずリポジトリを作成する必要があります。
-
Google Cloud コンソールのナビゲーション メニュー(
)で、[すべてのプロダクトを表示] をクリックします。次に、[CI / CD] カテゴリで、[Artifact Registry] > [リポジトリ] に移動します。
-
[リポジトリの作成] ページで、次の情報を入力します。残りの設定はデフォルト値のままにします。
|
プロパティ
|
値 (入力または選択)
|
|
名前
|
my-repo
|
|
形式
|
Docker
|
|
ロケーション タイプ
|
リージョン
|
|
リージョン
|
|
-
[作成] をクリックします。
リポジトリを使用するために Docker を認証する
リポジトリとの間でイメージを push または pull する前に、Artifact Registry のリポジトリに対するリクエストを認証するように Docker を構成する必要があります。
-
リージョン の Docker リポジトリの認証を設定するには、VM シェルで次のコマンドを実行します。
gcloud auth configure-docker ${REGION}-docker.pkg.dev
-
プロンプトが表示されたら、「Y」と入力します。
作成したリポジトリの完全な名前は、-docker.pkg.dev//my-repo です。
Docker イメージ リポジトリ名は、Artifact Registry では [location]-docker.pkg.dev という形式を使用します。
コンテナを Artifact Registry に push する
-
Artifact Registry がホストする限定公開レジストリにコンテナ イメージを push するには、まずリポジトリ名でイメージにタグを付ける必要があります。
docker build -t ${REGION}-docker.pkg.dev/${PROJECT_ID}/my-repo/my-app:0.2 .
-
ビルドした Docker イメージを一覧表示します。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-app 0.2 9b1ef4854d32 4 minutes ago 997MB
us-east1-docker.pkg.dev/qwiklabs-gcp-02-7c092125ce3a/my-repo/my-app 0.2 9b1ef4854d32 4 minutes ago 997MB
my-app 0.1 8cf51a1aba35 5 minutes ago 997MB
-
イメージを Artifact Registry に push するには、次のコマンドを実行します。
docker push ${REGION}-docker.pkg.dev/$PROJECT_ID/my-repo/my-app:0.2
このコマンドの出力は次のようになります。
The push refers to repository [east1-docker.pkg.dev/qwiklabs-gcp-02-7c092125ce3a/my-repo/my-app]
b29bce04ddbb: Pushed
9ba0e19073ee: Pushed
3c397285cb7e: Pushed
a8d01c684adc: Pushed
56c4ec92f013: Pushed
4c92897e605e: Pushed
0b6859e9fff1: Pushed
11829b3be9c0: Pushed
dc8e1d8b53e9: Pushed
9d49e0bc68a4: Pushed
8e396a1aad50: Pushed
0.2: digest: sha256:383ffb5213f92e33dedb49042c0f070a9f76f263621226de20499dffd863b3df size: 2628
-
コマンドが完了したら、Google Cloud コンソールのナビゲーション メニュー(
)で、[すべてのプロダクトを表示] をクリックします。次に、[CI / CD] カテゴリで、[Artifact Registry] > [リポジトリ] に移動します。
-
my-repo リポジトリをクリックして、my-app Docker コンテナ イメージを表示します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
コンテナ イメージを公開する。
タスク 7. コンテナ イメージを pull してテストする
このタスクでは、新しい環境から開始し、Artifact Registry からコンテナ イメージを pull してテストします。別の環境をシミュレートするために、このラボの前のタスクで作成したすべてのコンテナとイメージをシェル環境で停止して削除します。
コンテナを停止して削除する
-
実行中のすべてのコンテナを停止するには、次のコマンドを実行します。
docker stop $(docker ps -q)
-
すべてのコンテナを削除するには、次のコマンドを実行します。
docker rm $(docker ps -aq)
すべてのコンテナ イメージを削除する
-
レジストリタグ付きのコンテナ イメージを削除するには、次のコマンドを実行します。
docker rmi ${REGION}-docker.pkg.dev/$PROJECT_ID/my-repo/my-app:0.2
注: このコマンドでは、レジストリからコンテナ イメージは削除されません。
-
他のすべてのイメージを削除するには、次のコマンドを実行します。
docker rmi -f $(docker images -aq)
-
VM 環境にコンテナ イメージが存在しないことを確認します。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
これで、ローカル イメージのない新しいホスト環境が準備できました。
イメージをテストする
Artifact Registry からイメージを pull してテストします。
-
Artifact Registry からイメージを pull するには、次のコマンドを実行します。
docker pull ${REGION}-docker.pkg.dev/${PROJECT_ID}/my-repo/my-app:0.2
-
イメージを一覧表示するには、次のコマンドを実行します。
docker images
-
コンテナを実行するには、次のコマンドを実行します。
docker run -p 8080:80 -d ${REGION}-docker.pkg.dev/${PROJECT_ID}/my-repo/my-app:0.2
-
アプリケーションをテストするには、次のコマンドを実行します。
curl http://localhost:8080?user=Learner
注: このタスクでは、コンテナ化されたアプリケーションを Docker を使用して他の VM や環境で実行できるコンテナのポータビリティを示しています。ホストマシンにアプリケーションの依存関係をインストールする必要はありません。コンテナ イメージは、Docker からアクセスできる公開レジストリまたは限定公開レジストリでホストできます。
お疲れさまでした
Docker を使用したコンテナ作成の基本に関するこのラボは以上で終了です。このラボの内容:
- Docker でコンテナ イメージをビルドし、Docker コンテナを実行しました。
- Google Cloud のコンテナ イメージ リポジトリである Artifact Registry に Docker イメージを push しました。
- Artifact Registry から Docker イメージを pull し、新しい環境で実行して、コンテナのポータビリティを検証しました。
次のステップと詳細情報
Docker と Artifact Registry の詳細については、以下のドキュメントをご覧ください。
Copyright 2026 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。