はじめに
Turbonomicには、kubernetesのリソース管理もできます!kubernetesを理解する上で必須となるDockerを理解するために、IBM Bobに作成してもらった手順書をもとに手を動かしていきたいと思います。
Dockerとは
定義:
- アプリケーションをコンテナという単位でパッケージ化する技術
- 「どこでも同じように動く」環境を実現
Dockerの基本概念

参考:https://docs.docker.jp/v1.12/engine/understanding-docker.html
┌─────────────────────────────────────┐
│ Docker Image(イメージ) │
│ - アプリケーションのテンプレート │
│ - 読み取り専用 │
│ - Dockerfileから作成 │
└─────────────────────────────────────┘
↓ docker run
┌─────────────────────────────────────┐
│ Docker Container(コンテナ) │
│ - イメージから作成された実行環境 │
│ - 読み書き可能 │
│ - 独立したプロセス │
└─────────────────────────────────────┘
DockerHostに常駐するDockerデーモンが、クライアントから「docker build」を受けるとDockerイメージをもとにDocker Containerをその都度作成すると理解しました。
ステップ1: Dockerのインストール
macOS
# Homebrewでインストール
brew install --cask docker
# または Docker Desktop をダウンロード
# https://www.docker.com/products/docker-desktop
# インストール確認
docker --version
# 出力例: Docker version 24.0.6, build ed223bc
docker-compose --version
# 出力例: Docker Compose version v2.23.0
DockerとDocker Comoposeの違い

参考:https://www.kagoya.jp/howto/cloud/container/dockercompose/
(この記事が個人的にわかりやすかったです!)
- Dockerが、コンテナ技術の基盤となるプラットフォーム。1つのコンテナを動かすためのもの。
- Docker Composeは、複数のコンテナを定義・管理するためのオーケストレーションツール。
ステップ2: Dockerfileの作成
2-1. Dockerfileを作成
# プロジェクトディレクトリに移動
cd /Users/hinanokawahori/projects/web-app-comparison
# Dockerfileを作成
nano Dockerfile
2-2. Dockerfileの内容
# ベースイメージを指定
FROM node:18-alpine
# 作業ディレクトリを設定
WORKDIR /app
# package.jsonとpackage-lock.jsonをコピー
COPY package*.json ./
# 依存関係をインストール
RUN npm ci --only=production
# アプリケーションのソースコードをコピー
COPY . .
# ポート3000を公開
EXPOSE 3000
# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node -e "require('http').get('http://localhost:3000/api/status', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
# アプリケーションを起動
CMD ["npm", "start"]
2-3. .dockerignoreファイルの作成
# .dockerignoreを作成
nano .dockerignore
内容:
node_modules
npm-debug.log
.git
.gitignore
.env
.DS_Store
README.md
.github
「.dockerignoreファイルとは?」とBobに質問するとこう答えてくれた。
.dockerignoreは、Dockerイメージをビルドする際に、ビルドコンテキストから除外するファイルやディレクトリを指定するファイルです。.gitignoreのDocker版と考えるとわかりやすいです。
ステップ3: Dockerイメージのビルド
# イメージをビルド
docker build -t web-app:latest .
# 出力例:
# [+] Building 15.2s (11/11) FINISHED
# => [internal] load build definition from Dockerfile
# => => transferring dockerfile: 456B
# => [internal] load .dockerignore
# => => transferring context: 123B
# => [internal] load metadata for docker.io/library/node:18-alpine
# => [1/5] FROM docker.io/library/node:18-alpine
# => [internal] load build context
# => => transferring context: 12.34kB
# => [2/5] WORKDIR /app
# => [3/5] COPY package*.json ./
# => [4/5] RUN npm ci --only=production
# => [5/5] COPY . .
# => exporting to image
# => => exporting layers
# => => writing image sha256:abc123...
# => => naming to docker.io/library/web-app:latest
# イメージを確認
docker images
# 出力例:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# web-app latest abc123def456 2 minutes ago 150MB


イメージのビルドが完了し、選択したDockerImageも確認できた!
ステップ4: Dockerコンテナの実行
# コンテナを起動
docker run -d -p 3000:3000 --name web-app-container web-app:latest
# オプションの説明:
# -d: バックグラウンドで実行
# -p 3000:3000: ホストの3000番ポートをコンテナの3000番ポートにマッピング
# --name: コンテナに名前を付ける
# 実行中のコンテナを確認
docker ps
# 出力例:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# abc123def456 web-app:latest "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:3000->3000/tcp web-app-container
# ブラウザでアクセス
# http://localhost:3000
- docker runの後に表示されている64文字の16進数文字列は、 コンテナの完全なID(Full Container ID) 。
- docker psコマンドでは、使用しているイメージやコンテナの状態(今はhealthy)、ポートマッピング(ホストのマシンとコンテナ内のポートを紐づける仕組み)やコンテナ名がわかる。
まとめ
ここまでの一連の作業を、IBM Bobに可視化してもらいました。
テキスト図の部分は、実際にやってみた手順と同じで全体像あっていると思っています。誤りあればお教えください🙇♀️
Dockerファイル、DockerImageなど座学で学んだ内容のつながりや、新しい知識であるポートマッピングの理解ができました。次は、Docker Composeを使って複数Dockerを管理していきたいと思います。
┌─────────────────────────────────────────────────────────────────────┐
│ ホストマシン (macOS) │
│ /Users/hinanokawahori/projects/web-app-comparison │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ローカルファイルシステム │ │
│ │ │ │
│ │ 📁 web-app-comparison/ │ │
│ │ ├── 📄 Dockerfile ← ここで作成! │ │
│ │ ├── 📄 .dockerignore │ │
│ │ ├── 📄 package.json │ │
│ │ ├── 📄 server.js │ │
│ │ └── 📁 node_modules/ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ docker build -t web-app:latest . │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Docker Engine (Dockerデーモン) │ │
│ │ │ │
│ │ 1️⃣ ビルドコンテキストを読み込む │ │
│ │ ↓ │ │
│ │ 2️⃣ Dockerfileの指示に従ってイメージを作成 │ │
│ │ ↓ │ │
│ │ 📦 Dockerイメージ (web-app:latest) │ │
│ │ - ローカルのファイルがパッケージ化される │ │
│ │ - 読み取り専用のテンプレート │ │
│ │ - サイズ: 150MB │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ docker run -d -p 3000:3000 ... │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 🐳 Dockerコンテナ (web-app-container) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 隔離された実行環境 │ │ │
│ │ │ │ │ │
│ │ │ 📁 /app/ │ │ │
│ │ │ ├── 📄 package.json ← イメージからコピー │ │ │
│ │ │ ├── 📄 server.js ← イメージからコピー │ │ │
│ │ │ └── 📁 node_modules/ ← イメージからコピー │ │ │
│ │ │ │ │ │
│ │ │ 🚀 Node.jsプロセス │ │ │
│ │ │ ポート3000で待機中 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↑ │
│ ポートマッピング (3000:3000) │
│ ↑ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 🌐 ブラウザ (localhost:3000) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘


