@k2works/claude-code-booster 4.6.0 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/assets/.claude/README.md +2 -0
- package/lib/assets/.claude/skills/creating-journal/SKILL.md +129 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +332 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +776 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +457 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +869 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +576 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +611 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +612 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +509 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +537 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +631 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +598 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +454 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +337 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +315 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +288 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +247 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +132 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +294 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +265 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +521 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +510 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-01-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-02-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-03-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-04-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-05-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-06-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-07-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-08-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-09-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-10-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-11-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-12-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/overview-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/index.md +82 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +211 -0
- package/lib/assets/docs/article/index.md +3 -1
- package/lib/assets/mkdocs.yml +1 -0
- package/package.json +1 -1
|
@@ -96,6 +96,7 @@ Claude Code をより効率的に使うための基本設定テンプレート
|
|
|
96
96
|
| `generating-slides` | インセプションデッキから PowerPoint スライドを生成。 |
|
|
97
97
|
| `git-commit` | 意味のある変更単位ごとにコミットを作成。Conventional Commits 準拠。 |
|
|
98
98
|
| `creating-adr` | Architecture Decision Record の作成を支援。 |
|
|
99
|
+
| `creating-journal` | その日の Skill 実行と意思決定を物語形式で `docs/journal/YYYYMMDD.md` に保存。コミットメッセージには載らない判断と学びを記録。 |
|
|
99
100
|
| `creating-release-report` | リリース完了報告書を作成。release_plan・iteration_report・git log・CHANGELOG からデータ収集。 |
|
|
100
101
|
| `creating-iteration-report` | イテレーション完了報告書を作成。iteration_plan・release_plan・テスト結果からデータ収集。 |
|
|
101
102
|
|
|
@@ -210,6 +211,7 @@ Claude Code をより効率的に使うための基本設定テンプレート
|
|
|
210
211
|
│ ├── tracking-progress/SKILL.md
|
|
211
212
|
│ ├── syncing-github-project/SKILL.md
|
|
212
213
|
│ ├── planning-releases/SKILL.md
|
|
214
|
+
│ ├── creating-journal/SKILL.md
|
|
213
215
|
│ ├── creating-release-report/SKILL.md
|
|
214
216
|
│ ├── creating-iteration-report/SKILL.md
|
|
215
217
|
│ ├── orchestrating-analysis/SKILL.md
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: creating-journal
|
|
3
|
+
description: その日の Skill 実行と意思決定を物語形式で `docs/journal/YYYYMMDD.md` に保存する。git log や diff から自動生成する `gulp journal:generate` とは別物で、こちらは「なぜそうしたか」「どこで詰まったか」「次回どう活かすか」といったコミットメッセージには載らない**判断と学びを残す**ためのスキル。「今日の作業をジャーナルに保存」「ここまでの作業の流れをジャーナルに」「skill の使用記録を残したい」「今日の振り返りを書く」「開発ジャーナルを作成」「セッション内容を記録」のような依頼で必ず発動する。一日の終わり、長いセッションの区切り、リリース直後、IT 完了時など「ここまでをまとめておきたい」場面でも積極的に提案する。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 開発ジャーナル作成
|
|
7
|
+
|
|
8
|
+
その日のセッションで実行した Skill、対応した指摘、踏んだ落とし穴、得られた学びを `docs/journal/YYYYMMDD.md` として保存する。
|
|
9
|
+
|
|
10
|
+
ジャーナルの価値は、**git log と CHANGELOG には残らない「判断の経緯」を残す**ことにある。「なぜ lts-24 に上げたか」「HLint の `within` をなぜ撤回したか」「Sprint 0 指摘 42 件をどう優先順位付けしたか」といった、コミットメッセージでは収まらない物語が、未来の自分とチームの意思決定速度を高める。
|
|
11
|
+
|
|
12
|
+
## ファイル命名
|
|
13
|
+
|
|
14
|
+
`docs/journal/<YYYYMMDD>.md` (例: `docs/journal/20260626.md`)
|
|
15
|
+
|
|
16
|
+
セッションをまたぐ場合でも 1 日 1 ファイル。同じ日に追記が発生したら既存ファイルに追記する (上書きしない)。
|
|
17
|
+
|
|
18
|
+
## 必須セクション (この順序)
|
|
19
|
+
|
|
20
|
+
```markdown
|
|
21
|
+
# YYYY-MM-DD 開発ジャーナル
|
|
22
|
+
|
|
23
|
+
(1〜2 文のリード文。今日何をしたかを 1 段落で要約)
|
|
24
|
+
|
|
25
|
+
## ハイライト
|
|
26
|
+
|
|
27
|
+
- (最重要の成果 3〜5 個を箇条書き)
|
|
28
|
+
|
|
29
|
+
## Skill 実行の時系列
|
|
30
|
+
|
|
31
|
+
### 1. `<skill-name>` — <短い見出し>
|
|
32
|
+
(何を入力し、何を出力したか。主要成果物の表)
|
|
33
|
+
|
|
34
|
+
### 2. `<skill-name>` — <短い見出し>
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
## 学び
|
|
38
|
+
|
|
39
|
+
- (次回再発させたくない発見、再利用したい知見)
|
|
40
|
+
|
|
41
|
+
## 主要コミット
|
|
42
|
+
|
|
43
|
+
| ハッシュ | コミット |
|
|
44
|
+
| :--- | :--- |
|
|
45
|
+
| `xxxxxxxx` | <メッセージ 1 行目> |
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
フェーズが長い場合は「Skill 実行の時系列」を **「分析フェーズ Skill 実行の時系列」「運用フェーズ Skill 実行の時系列」** のように分割する。今回 (2026-06-26) はこの形を採用した。
|
|
49
|
+
|
|
50
|
+
## 作成手順
|
|
51
|
+
|
|
52
|
+
### 1. 既存ジャーナルを確認
|
|
53
|
+
|
|
54
|
+
`docs/journal/<today>.md` が既にあるか確認する。あれば**追記**する (上書き禁止)。なければ新規作成。
|
|
55
|
+
|
|
56
|
+
### 2. このセッションで使った Skill を時系列で抽出
|
|
57
|
+
|
|
58
|
+
会話履歴を遡り、`/<skill>` 形式の起動、`Skill` ツール呼び出し、Skill のオーケストレーションを抽出する。連続する関連 Skill は 1 つの節にまとめてよい。
|
|
59
|
+
|
|
60
|
+
抽出すべきメタ情報:
|
|
61
|
+
|
|
62
|
+
- 入力 (どの手順書/ドキュメント/与件を参照したか)
|
|
63
|
+
- 主要成果物 (生成 or 更新したファイルパス)
|
|
64
|
+
- 重要な意思決定 (技術選定、優先順位、撤回したルール等)
|
|
65
|
+
- ハマったポイントと対処 (これが将来の検索キーになる)
|
|
66
|
+
|
|
67
|
+
### 3. ハイライトを抽出
|
|
68
|
+
|
|
69
|
+
その日の成果のうち **3〜5 個** だけ選ぶ。「重要な決定」「新規導入」「指標の達成」を優先する。コミット数や行数といったプロセス指標ではなく、**読者にとっての意味**で選ぶ。
|
|
70
|
+
|
|
71
|
+
### 4. 学びを書く
|
|
72
|
+
|
|
73
|
+
「次回再発させたくない発見」「再利用したい知見」を 3〜7 個。汎化して書く (このプロジェクト固有の話だけにならないように)。
|
|
74
|
+
|
|
75
|
+
例として今日のジャーナル (`20260626.md`) には以下が記録されている:
|
|
76
|
+
|
|
77
|
+
- HLint の `within` は直感に反するホワイトリストなので、アーキテクチャ規約は専用ツールに乗せる
|
|
78
|
+
- macOS の BSD `ar` + GHC 9.8 の組み合わせは地雷
|
|
79
|
+
- `stack build --pedantic` はスタブ期間中は不適合
|
|
80
|
+
|
|
81
|
+
### 5. 主要コミットを git log から抽出
|
|
82
|
+
|
|
83
|
+
このセッション中のコミットを `git log --oneline` で抽出し、テーブル化する。フェーズ別に分けるとさらに読みやすい。
|
|
84
|
+
|
|
85
|
+
### 6. コミット
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
docs(journal): YYYY-MM-DD のセッション記録を追加
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
または既存ファイルへの追記の場合は:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
docs(journal): YYYY-MM-DD のジャーナルに <セクション名> を追記
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`creating-iteration-report` / `creating-release-report` 等の他レポート系 Skill とは別系統 (それらはフォーマル文書、ジャーナルは作業ログ) なので、コミットスコープも分けて運用する。
|
|
98
|
+
|
|
99
|
+
## 書き方の指針
|
|
100
|
+
|
|
101
|
+
### 「物語」として書く
|
|
102
|
+
|
|
103
|
+
時系列・因果関係を保つ。「指摘 42 件を対応 → ハマった YAML 構文 → 撤回 → IT1 に委譲」のように **何が起きて何をしたか**の流れがわかるようにする。単なる箇条書きの羅列にしない。
|
|
104
|
+
|
|
105
|
+
### 証拠として残す
|
|
106
|
+
|
|
107
|
+
ファイルパス・コミットハッシュ・バージョン番号・件数を具体的に書く。「いっぱい修正した」ではなく「16 + 16 + 10 = 42 件対応」と書く。これが将来のジャーナル検索性を決める。
|
|
108
|
+
|
|
109
|
+
### 「ハマったポイント」を恥ずかしがらずに書く
|
|
110
|
+
|
|
111
|
+
ジャーナルの価値の半分は失敗の記録にある。「3 回目の修正でようやく CI が安定した」「YAML 構文を間違えていた」を**省略しない**。同じ罠に二度落ちないために残す。
|
|
112
|
+
|
|
113
|
+
### コミットメッセージとの違いを意識する
|
|
114
|
+
|
|
115
|
+
コミットメッセージは「この変更は何を達成したか」を書く。ジャーナルは「**なぜそうしたか、何を諦めたか、次回どう活かすか**」を書く。両者は補完関係。
|
|
116
|
+
|
|
117
|
+
## やらないこと
|
|
118
|
+
|
|
119
|
+
- **`gulp journal:generate` の置き換えではない** — あちらは git の diff/log から自動生成する補助。こちらは判断の物語を残す手動の作業。両方共存する
|
|
120
|
+
- **CHANGELOG ではない** — ユーザー向けの変更点リストは `CHANGELOG.md` で別管理
|
|
121
|
+
- **イテレーション報告書ではない** — フォーマルな完了報告書は `creating-iteration-report` で別管理
|
|
122
|
+
- **アーカイブのために書かない** — 「未来の誰か (主に自分) が読み返して役立つか」を判定基準にする。役立たない記録は省く
|
|
123
|
+
|
|
124
|
+
## 関連スキル
|
|
125
|
+
|
|
126
|
+
- `creating-iteration-report` — イテレーション完了時のフォーマル報告書 (ジャーナルとは別)
|
|
127
|
+
- `creating-release-report` — リリース完了時のフォーマル報告書
|
|
128
|
+
- `tracking-progress` — 進捗の定量分析
|
|
129
|
+
- `operating-docs` — ジャーナル追加後のインデックス更新 (`--update` で `docs/index.md` 同期)
|
package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# 第 1 章 コンテナと Docker の基礎
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
*コンテナはアプリケーションと依存関係を箱にまとめ、Docker イメージから実行環境を再現します。*
|
|
6
|
+
|
|
7
|
+
## はじめに
|
|
8
|
+
|
|
9
|
+
現代のアプリケーション開発において、コンテナはもはや欠かせない技術となりました。「自分の環境では動くのに、本番環境では動かない」という、開発者を長年悩ませてきた問題を、コンテナは根本から解決します。
|
|
10
|
+
|
|
11
|
+
この章では、書籍『Docker/Kubernetes 実践コンテナ開発入門(第 2 版)』の第 1 章に沿って、コンテナとは何か、Docker とは何か、なぜコンテナを使うのか、そしてローカルでコンテナを動かす環境をどう整えるのかを順に学びます。後続の章で扱う実用的なイメージ構築や Kubernetes へつなげるための土台となる、もっとも基礎的な内容です。
|
|
12
|
+
|
|
13
|
+
解説には、実際に動作するサンプルリポジトリのコードを引用します。引用元はその都度リポジトリ名とファイルパスで明示しますので、手元で同じものを確認しながら読み進めてください。
|
|
14
|
+
|
|
15
|
+
## 1.1 コンテナとは
|
|
16
|
+
|
|
17
|
+
コンテナとは、アプリケーションとその実行に必要な依存関係(ライブラリ、ランタイム、設定ファイルなど)を 1 つにまとめ、ホスト OS から隔離された状態で動かす仕組みです。アプリケーションを「箱(コンテナ)」に詰めて持ち運べるようにする、というイメージが名前の由来です。
|
|
18
|
+
|
|
19
|
+
### コンテナと仮想マシンの違い
|
|
20
|
+
|
|
21
|
+
コンテナを理解するうえでもっとも重要なのは、仮想マシン(VM)との違いです。両者はどちらも「隔離された実行環境」を提供しますが、その実現方法が大きく異なります。
|
|
22
|
+
|
|
23
|
+
仮想マシンは、ハイパーバイザーの上にゲスト OS を丸ごと動かします。ゲスト OS のカーネルを各 VM が個別に持つため、隔離は強固ですが、起動が遅く、メモリやディスクの消費も大きくなります。
|
|
24
|
+
|
|
25
|
+
一方コンテナは、ホスト OS のカーネルを共有しながら、プロセスをネームスペースや cgroups といった Linux カーネルの機能で隔離します。ゲスト OS を持たないぶん軽量で、起動はほぼ一瞬、1 台のホスト上に多数のコンテナを密に配置できます。
|
|
26
|
+
|
|
27
|
+
```plantuml
|
|
28
|
+
@startuml
|
|
29
|
+
title 仮想マシンとコンテナの構造の違い
|
|
30
|
+
|
|
31
|
+
rectangle "仮想マシン" {
|
|
32
|
+
rectangle "ハードウェア" as VM_HW
|
|
33
|
+
rectangle "ホスト OS" as VM_HOST
|
|
34
|
+
rectangle "ハイパーバイザー" as HV
|
|
35
|
+
rectangle "ゲスト OS A\n+ アプリ A" as VM_A
|
|
36
|
+
rectangle "ゲスト OS B\n+ アプリ B" as VM_B
|
|
37
|
+
VM_HW -down-> VM_HOST
|
|
38
|
+
VM_HOST -down-> HV
|
|
39
|
+
HV -down-> VM_A
|
|
40
|
+
HV -down-> VM_B
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
rectangle "コンテナ" {
|
|
44
|
+
rectangle "ハードウェア" as C_HW
|
|
45
|
+
rectangle "ホスト OS(カーネル共有)" as C_HOST
|
|
46
|
+
rectangle "コンテナエンジン" as ENGINE
|
|
47
|
+
rectangle "コンテナ A\n(アプリ A)" as C_A
|
|
48
|
+
rectangle "コンテナ B\n(アプリ B)" as C_B
|
|
49
|
+
C_HW -down-> C_HOST
|
|
50
|
+
C_HOST -down-> ENGINE
|
|
51
|
+
ENGINE -down-> C_A
|
|
52
|
+
ENGINE -down-> C_B
|
|
53
|
+
}
|
|
54
|
+
@enduml
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
両者の違いを整理すると次のようになります。
|
|
58
|
+
|
|
59
|
+
| 観点 | 仮想マシン | コンテナ |
|
|
60
|
+
| :--- | :--- | :--- |
|
|
61
|
+
| 隔離の単位 | ゲスト OS ごと | プロセス単位 |
|
|
62
|
+
| OS カーネル | ゲストごとに個別 | ホストと共有 |
|
|
63
|
+
| 起動時間 | 数十秒〜分 | 数百ミリ秒〜秒 |
|
|
64
|
+
| リソース消費 | 大きい | 小さい |
|
|
65
|
+
| 隔離の強度 | 強い | VM より弱い |
|
|
66
|
+
|
|
67
|
+
コンテナは軽量で素早く起動できる反面、ホストのカーネルを共有するという性質上、隔離の強度は仮想マシンに及びません。用途に応じて使い分けることが大切です。
|
|
68
|
+
|
|
69
|
+
### イメージとコンテナの関係
|
|
70
|
+
|
|
71
|
+
コンテナを語るうえで欠かせないのが「イメージ」という概念です。
|
|
72
|
+
|
|
73
|
+
- **イメージ(image)** … アプリケーションと依存関係をまとめた、読み取り専用のテンプレートです。コンテナの設計図にあたります。
|
|
74
|
+
- **コンテナ(container)** … イメージを起動して実行状態にしたものです。同じイメージから複数のコンテナを起動できます。
|
|
75
|
+
|
|
76
|
+
クラスとインスタンスの関係に例えると理解しやすいでしょう。イメージがクラス、コンテナがそのインスタンスにあたります。1 つのイメージから何個でも同じコンテナを生み出せるという点が、コンテナの再現性を支えています。
|
|
77
|
+
|
|
78
|
+
## 1.2 Docker とは
|
|
79
|
+
|
|
80
|
+
Docker は、コンテナを「作る・動かす・配布する」ための代表的なプラットフォームです。コンテナという技術自体は Linux カーネルの機能に基づきますが、それを誰でも扱える形に整え、広く普及させたのが Docker です。
|
|
81
|
+
|
|
82
|
+
### Docker のアーキテクチャ
|
|
83
|
+
|
|
84
|
+
Docker は単一のプログラムではなく、役割の異なる複数のコンポーネントが連携して動作します。
|
|
85
|
+
|
|
86
|
+
- **Docker クライアント(docker CLI)** … 利用者が `docker run` などのコマンドを打ち込む窓口です。
|
|
87
|
+
- **dockerd(Docker デーモン)** … クライアントからの要求を受け取り、イメージやコンテナ、ネットワークなどを管理する常駐プロセスです。
|
|
88
|
+
- **containerd** … コンテナのライフサイクル(生成・開始・停止・削除)を司る高レベルランタイムです。
|
|
89
|
+
- **runc** … OCI(Open Container Initiative)仕様に従い、実際にコンテナのプロセスを生成する低レベルランタイムです。
|
|
90
|
+
|
|
91
|
+
利用者のコマンドは「docker CLI → dockerd → containerd → runc」という流れで処理され、最終的に runc がカーネル機能を使ってコンテナを起動します。
|
|
92
|
+
|
|
93
|
+
```plantuml
|
|
94
|
+
@startuml
|
|
95
|
+
title Docker のアーキテクチャ
|
|
96
|
+
|
|
97
|
+
actor 利用者 as user
|
|
98
|
+
rectangle "docker CLI\n(クライアント)" as cli
|
|
99
|
+
rectangle "dockerd\n(デーモン)" as dockerd
|
|
100
|
+
rectangle "containerd\n(高レベルランタイム)" as containerd
|
|
101
|
+
rectangle "runc\n(低レベルランタイム)" as runc
|
|
102
|
+
rectangle "コンテナ" as container
|
|
103
|
+
|
|
104
|
+
user --> cli : docker run など
|
|
105
|
+
cli --> dockerd : API リクエスト
|
|
106
|
+
dockerd --> containerd : 管理を委譲
|
|
107
|
+
containerd --> runc : プロセス生成
|
|
108
|
+
runc --> container : 起動
|
|
109
|
+
@enduml
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
このように責務が分離されているおかげで、たとえば Kubernetes は dockerd を経由せず containerd を直接利用するといった構成も取れます。コンテナエコシステムの広がりは、この層構造に支えられています。
|
|
113
|
+
|
|
114
|
+
### イメージとレイヤ
|
|
115
|
+
|
|
116
|
+
Docker イメージは、複数の読み取り専用「レイヤ」が積み重なってできています。Dockerfile に書かれた命令(`FROM`、`RUN`、`COPY` など)の 1 つひとつが、おおむね 1 つのレイヤを生成します。
|
|
117
|
+
|
|
118
|
+
レイヤ構造には次の利点があります。
|
|
119
|
+
|
|
120
|
+
- **キャッシュの再利用** … 変更のないレイヤはビルド時に再利用され、ビルドが高速になります。
|
|
121
|
+
- **ストレージの節約** … 同じレイヤを複数のイメージで共有でき、ディスク使用量を抑えられます。
|
|
122
|
+
- **差分配布** … イメージを取得(pull)する際、すでに持っているレイヤはダウンロードを省略できます。
|
|
123
|
+
|
|
124
|
+
コンテナを起動すると、これらの読み取り専用レイヤの上に書き込み可能なレイヤが 1 枚追加されます。コンテナ内での変更はこの書き込みレイヤに記録され、元のイメージは変更されません。これがコンテナの再現性を保つ仕組みです。
|
|
125
|
+
|
|
126
|
+
### Dockerfile を読む
|
|
127
|
+
|
|
128
|
+
イメージのビルド手順を記述するのが Dockerfile です。最小のサンプルとして、`echo` リポジトリの `apps/echo/Dockerfile` を見てみましょう。
|
|
129
|
+
|
|
130
|
+
```dockerfile
|
|
131
|
+
FROM golang:1.21.6
|
|
132
|
+
|
|
133
|
+
LABEL org.opencontainers.image.source=https://github.com/gihyodocker/echo
|
|
134
|
+
|
|
135
|
+
WORKDIR /go/src/github.com/gihyodocker/echo
|
|
136
|
+
COPY main.go .
|
|
137
|
+
RUN go mod init
|
|
138
|
+
|
|
139
|
+
CMD ["go", "run", "main.go"]
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
各命令の意味は次のとおりです。
|
|
143
|
+
|
|
144
|
+
- `FROM golang:1.21.6` … ベースイメージとして Go 1.21.6 の公式イメージを指定します。すべてのイメージは必ず `FROM` から始まります。
|
|
145
|
+
- `LABEL ...` … イメージにメタデータ(ここではソースリポジトリの URL)を付与します。
|
|
146
|
+
- `WORKDIR ...` … 以降の命令を実行する作業ディレクトリを設定します。
|
|
147
|
+
- `COPY main.go .` … ホスト側の `main.go` をイメージ内の作業ディレクトリへコピーします。
|
|
148
|
+
- `RUN go mod init` … ビルド時にコマンドを実行します(ここでは Go モジュールの初期化)。
|
|
149
|
+
- `CMD ["go", "run", "main.go"]` … コンテナ起動時に実行するデフォルトコマンドを指定します。
|
|
150
|
+
|
|
151
|
+
この Dockerfile が動かすアプリケーションは、`apps/echo/main.go` に書かれた、HTTP リクエストに対して文字列を返すだけのシンプルな Web サーバです。
|
|
152
|
+
|
|
153
|
+
```go
|
|
154
|
+
func main() {
|
|
155
|
+
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
156
|
+
log.Println("Received request")
|
|
157
|
+
fmt.Fprintf(w, "Hello Container!!")
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
log.Println("Start server")
|
|
161
|
+
server := &http.Server{Addr: ":8080"}
|
|
162
|
+
// ... 中略(シグナルを受けてグレースフルシャットダウンする処理が続く)
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
ポート `8080` で待ち受け、`/` へのアクセスに `Hello Container!!` を返します。なお `apps/echo/README-ja.md` には、このサンプルについて次のような注意書きがあります。
|
|
167
|
+
|
|
168
|
+
> 通常、Go言語のアプリケーションはビルドしてできた実行ファイルをコンテナイメージに含めます。しかし、ここではコンテナイメージのビルド手順をシンプルに読者に伝えるために、実行ファイルを作らずに実行しています。
|
|
169
|
+
|
|
170
|
+
つまり `CMD` で `go run` を使うこの書き方は、学習用に手順を単純化したものです。実用的なビルド方法(実行ファイルを作成して軽量イメージに含める方法)は、第 3 章や第 10 章で扱います。
|
|
171
|
+
|
|
172
|
+
### さまざまなベースイメージ
|
|
173
|
+
|
|
174
|
+
ベースイメージは目的に応じて選びます。`container-kit` リポジトリには、用途の異なる補助コンテナの Dockerfile がまとまっています。たとえばデバッグ用コンテナ `apps/container-kit/containers/debug/Dockerfile` は次のようになっています。
|
|
175
|
+
|
|
176
|
+
```dockerfile
|
|
177
|
+
FROM ubuntu:23.10
|
|
178
|
+
|
|
179
|
+
LABEL org.opencontainers.image.source=https://github.com/gihyodocker/container-kit
|
|
180
|
+
|
|
181
|
+
RUN apt update -y
|
|
182
|
+
RUN apt install -y curl wget git zip telnet vim default-mysql-client iputils-ping net-tools dnsutils
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
これは Ubuntu をベースに、ネットワーク調査やデータベース接続確認に使うツール群をインストールしたものです。コンテナ環境の中に入って調査するための「踏み台」として使います。
|
|
186
|
+
|
|
187
|
+
一方、リバースプロキシ用の `apps/container-kit/containers/simple-nginx-proxy/Dockerfile` は、Nginx の公式イメージをベースにしています。
|
|
188
|
+
|
|
189
|
+
```dockerfile
|
|
190
|
+
FROM nginx:1.25.1
|
|
191
|
+
|
|
192
|
+
LABEL org.opencontainers.image.source=https://github.com/gihyodocker/container-kit
|
|
193
|
+
|
|
194
|
+
COPY ./etc/nginx /etc/nginx
|
|
195
|
+
RUN rm /etc/nginx/conf.d/default.conf
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
ミドルウェアの公式イメージをベースにして、自前の設定ファイルを `COPY` で重ねるという、実務でよく使うパターンです。このように、何を動かしたいかによってベースイメージは大きく変わります。
|
|
199
|
+
|
|
200
|
+
## 1.3 コンテナを利用する意義
|
|
201
|
+
|
|
202
|
+
なぜコンテナを使うのでしょうか。技術的な目新しさではなく、実際の開発・運用で得られる価値の観点から整理します。
|
|
203
|
+
|
|
204
|
+
### 環境の再現性
|
|
205
|
+
|
|
206
|
+
コンテナの最大の価値は、環境の再現性です。アプリケーションと依存関係をイメージにまとめておけば、開発者のマシン、テスト環境、本番環境のどこで動かしても同じように動作します。「自分の環境では動く」という属人的な状態から脱却できます。
|
|
207
|
+
|
|
208
|
+
### ポータビリティ(可搬性)
|
|
209
|
+
|
|
210
|
+
イメージはレジストリ(Docker Hub など)を介して配布できます。ビルドしたイメージをどこへでも持ち運び、同じものを起動できます。OS のバージョンや個々のマシンの設定差に振り回されることが減ります。
|
|
211
|
+
|
|
212
|
+
### 軽量さと起動の速さ
|
|
213
|
+
|
|
214
|
+
仮想マシンと違い、コンテナはホストのカーネルを共有するため軽量で、起動も高速です。これにより、必要なときに素早くコンテナを立ち上げ、不要になれば破棄するという使い捨ての運用がしやすくなります。
|
|
215
|
+
|
|
216
|
+
### スケーラビリティとオーケストレーションへの道
|
|
217
|
+
|
|
218
|
+
同じイメージから複数のコンテナを起動できる性質は、負荷に応じてコンテナ数を増減させる水平スケールと相性が抜群です。多数のコンテナを束ねて管理する仕組みがコンテナオーケストレーションであり、その代表が Kubernetes です。本書の後半(第 5 章以降)で扱う Kubernetes は、まさにこのコンテナの性質を最大限に活かすための基盤です。
|
|
219
|
+
|
|
220
|
+
### 用途を選ばない汎用性
|
|
221
|
+
|
|
222
|
+
コンテナは Web サーバのような常駐型アプリケーションだけのものではありません。一定時間で完了して終了する「ジョブ」もコンテナで表現できます。`apps/container-kit/containers/time-limit-job/Dockerfile` はその一例です。
|
|
223
|
+
|
|
224
|
+
```dockerfile
|
|
225
|
+
FROM ubuntu:23.10
|
|
226
|
+
|
|
227
|
+
LABEL org.opencontainers.image.source=https://github.com/gihyodocker/container-kit
|
|
228
|
+
|
|
229
|
+
ENV EXECUTION_SECONDS 5
|
|
230
|
+
|
|
231
|
+
COPY task.sh /usr/local/bin/
|
|
232
|
+
|
|
233
|
+
CMD ["sh", "-c", "task.sh"]
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
`ENV` で環境変数(実行秒数)を設定し、`task.sh` を実行するコンテナです。常駐サーバから使い捨てのバッチ処理まで、同じ仕組みで扱える汎用性もコンテナの大きな意義です。
|
|
237
|
+
|
|
238
|
+
## 1.4 ローカルコンテナ実行環境の構築
|
|
239
|
+
|
|
240
|
+
コンテナを学ぶには、まず手元の PC で Docker を動かせるようにする必要があります。
|
|
241
|
+
|
|
242
|
+
### ローカル環境構築の選択肢
|
|
243
|
+
|
|
244
|
+
ローカルでコンテナ実行環境を整える代表的な方法には、次のものがあります。
|
|
245
|
+
|
|
246
|
+
- **Docker Desktop** … Windows / macOS 向けの公式デスクトップアプリです。GUI と CLI が一式そろい、もっとも手軽に始められます。なお、一定規模以上の組織での商用利用にはライセンスが必要な点に注意してください。
|
|
247
|
+
- **Rancher Desktop** … オープンソースのデスクトップアプリです。コンテナエンジンとして dockerd(moby)または containerd を選択でき、Kubernetes をローカルで簡単に有効化できます。
|
|
248
|
+
- **Linux ネイティブ** … Linux 上では Docker Engine を直接インストールして利用できます。
|
|
249
|
+
|
|
250
|
+
いずれを選んでも、`docker` コマンドでコンテナを操作するという基本的な使い勝手は共通です。本シリーズでは、WSL2 や Rancher Desktop などを使ったローカル環境構築の詳しい手順を付録 A で扱います。この章では、環境が整ったあとに行う基本的な動作確認の流れだけを示します。
|
|
251
|
+
|
|
252
|
+
### 動作確認の基本コマンド
|
|
253
|
+
|
|
254
|
+
環境構築が済んだら、まず Docker が正しく動いているかを確認します。
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# Docker のバージョンを確認する
|
|
258
|
+
docker version
|
|
259
|
+
|
|
260
|
+
# Docker が動作しているか、簡単なイメージを実行して確認する
|
|
261
|
+
docker run hello-world
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
`docker run hello-world` を実行すると、Docker がイメージをローカルに探し、なければレジストリから取得(pull)したうえでコンテナを起動します。動作確認用のメッセージが表示されれば成功です(出力の具体的な内容は環境や Docker のバージョンによって異なります)。
|
|
265
|
+
|
|
266
|
+
### echo サンプルでイメージのビルドと実行を体験する
|
|
267
|
+
|
|
268
|
+
先ほど見た `echo` サンプルを使って、イメージのビルドからコンテナ実行までの一連の流れを確認しましょう。`apps/echo/Dockerfile` のあるディレクトリで、次のコマンドを順に実行します。
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
# Dockerfile からイメージをビルドする(-t でイメージ名を付ける)
|
|
272
|
+
docker build -t example/echo:latest .
|
|
273
|
+
|
|
274
|
+
# ビルドしたイメージの一覧を確認する
|
|
275
|
+
docker images
|
|
276
|
+
|
|
277
|
+
# イメージからコンテナを起動する(ホストの 8080 番をコンテナの 8080 番へ接続)
|
|
278
|
+
docker run -p 8080:8080 example/echo:latest
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
`docker build` の最後の `.`(ドット)は、ビルドコンテキスト(Dockerfile や `COPY` 対象が置かれた場所)として現在のディレクトリを指定するものです。`docker run` の `-p 8080:8080` は、ホスト側のポートとコンテナ側のポートを結びつけるオプションです。
|
|
282
|
+
|
|
283
|
+
コンテナが起動したら、別のターミナルから動作を確認します。
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
# 起動中のコンテナへリクエストを送る
|
|
287
|
+
curl http://localhost:8080/
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
`apps/echo/main.go` の実装どおり、`Hello Container!!` という応答が返ってきます。アプリケーションのソースを直接インストールせず、コンテナを起動するだけで動かせたことが、コンテナの再現性とポータビリティを体感できる瞬間です。
|
|
291
|
+
|
|
292
|
+
### よく使う基本コマンド
|
|
293
|
+
|
|
294
|
+
最後に、この先の章でも繰り返し使う基本コマンドをまとめておきます。
|
|
295
|
+
|
|
296
|
+
| コマンド | 役割 |
|
|
297
|
+
| :--- | :--- |
|
|
298
|
+
| `docker build -t 名前 .` | Dockerfile からイメージをビルドする |
|
|
299
|
+
| `docker images` | ローカルのイメージ一覧を表示する |
|
|
300
|
+
| `docker run イメージ` | イメージからコンテナを起動する |
|
|
301
|
+
| `docker ps` | 起動中のコンテナ一覧を表示する |
|
|
302
|
+
| `docker ps -a` | 停止中も含む全コンテナを表示する |
|
|
303
|
+
| `docker stop コンテナ` | コンテナを停止する |
|
|
304
|
+
| `docker rm コンテナ` | コンテナを削除する |
|
|
305
|
+
| `docker rmi イメージ` | イメージを削除する |
|
|
306
|
+
|
|
307
|
+
これらのコマンドの詳しい使い方や、`docker run` の各種オプション、Docker Compose による複数コンテナの扱いについては、次章で本格的に学びます。
|
|
308
|
+
|
|
309
|
+
## まとめ
|
|
310
|
+
|
|
311
|
+
この章では、コンテナと Docker のもっとも基礎的な部分を学びました。要点を整理します。
|
|
312
|
+
|
|
313
|
+
| トピック | キーポイント |
|
|
314
|
+
| :--- | :--- |
|
|
315
|
+
| コンテナとは | アプリと依存関係をまとめて隔離実行する仕組み。VM と違いホストのカーネルを共有し軽量 |
|
|
316
|
+
| イメージとコンテナ | イメージは設計図、コンテナはその実行インスタンス |
|
|
317
|
+
| Docker のアーキテクチャ | docker CLI → dockerd → containerd → runc の層構造 |
|
|
318
|
+
| イメージとレイヤ | 命令ごとにレイヤが積み重なり、キャッシュ・共有・差分配布を実現 |
|
|
319
|
+
| 利用の意義 | 再現性、ポータビリティ、軽量さ、スケーラビリティ、用途の汎用性 |
|
|
320
|
+
| ローカル環境構築 | Docker Desktop / Rancher Desktop などを利用。詳細手順は付録 A |
|
|
321
|
+
|
|
322
|
+
コンテナは「変更を楽に安全に行い、どこでも同じように動かす」という、よいソフトウェアづくりを支える土台です。次章では、`echo` サンプルを題材に、アプリケーションの実行・イメージ作成・コンテナ操作・Docker Compose による複数コンテナの管理を、実際にコマンドを動かしながら掘り下げていきます。
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
- 次章: [第 2 章 コンテナのデプロイ](02-container-deployment.md)
|
|
327
|
+
- 目次: [記事トップ](index.md)
|
|
328
|
+
|
|
329
|
+
### 参考
|
|
330
|
+
|
|
331
|
+
- 『Docker/Kubernetes 実践コンテナ開発入門(第 2 版)』 — 山田明憲
|
|
332
|
+
- サンプルコード: `apps/echo/`、`apps/container-kit/containers/`(`tmp/` 配下)
|