Docker
Dockerとは
Dockerは、アプリケーションを実行環境ごとコンテナというパッケージにまとめる技術です。「自分のPCでは動いたのに本番で動かない」問題を、環境ごと配布することで解決します。
アプリにはコード本体だけでなく、ランタイム・ライブラリ・OSのパッケージという一式が要ります。従来はこれを手順書で本番側に再現していたため、版の違いや入れ忘れが事故になりました。Dockerは動く状態をまるごとイメージへ固めて配り、受け取った側は組み立て直さずそのまま起動します。
FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "start"]
同じ Dockerfile からは誰の手元でも同じイメージができる — これが再現性の正体です。
初学者向けポイント
- イメージ = コンテナの設計図(読み取り専用)。コンテナ = イメージから起動した実行中のプロセス
- 仮想マシンと違いOSを丸ごと起動しないため、軽くて速い(起動は秒単位)
- コンテナの中身は [[Linux]]。カーネルの機能(namespace / cgroups)でプロセスを隔離している
仮想マシンとの違い
| 観点 | 仮想マシン | コンテナ |
|---|---|---|
| 隔離の単位 | OSごと | プロセスごと |
| 起動時間 | 分単位 | 秒単位 |
| サイズ | GB単位 | MB単位〜 |
| オーバーヘッド | 大きい | 小さい |
代償として、コンテナはホストのカーネルを共有するため別系統のOSは動かせません。使い分けの基準は [[仮想マシンとハイパーバイザ]]、隔離される単位は [[プロセスとスレッド]] が扱います。
用語の地図
Dockerの語は作る→置く→動かすの順に並べると関係が見えます。
| 段階 | 語 | 指すもの |
|---|---|---|
| 作る | Dockerfile / レイヤー | 作り方の手順書と、命令ごとの差分 |
| 置く | レジストリ / タグ | 保管庫と、その中の1つを指す名前 |
| 動かす | コンテナ / ボリューム | 実行中のプロセスと、消したくないデータの置き場 |
| つなぐ | ポート公開 / Compose | 外からの経路と、複数コンテナをまとめる宣言 |
作る — 1命令が1レイヤーになり、変わらないレイヤーは再利用されます。例が package*.json を先にコピーしているのはこのためです。
置く — イメージは手元にしかないため、本番へ渡すにはレジストリを経由します。タグと latest の危うさは [[コンテナレジストリとイメージ管理]] へ。
動かす — コンテナは使い捨てが前提です。削除すれば中のファイルも消えるため、DBのデータはボリュームへ出します([[ストレージの種類]])。外から届くのはポートを公開したときだけ([[ポート番号]])、接続先やAPIキーはイメージに焼かず環境変数で渡します([[シークレット管理]])。
つなぐ — 複数コンテナの組み合わせ・ポート・環境変数は compose.yaml に [[YAML]] で宣言します。
よく使うコマンド
docker build -t my-app . # イメージをビルド
docker run -p 3000:3000 my-app # コンテナを起動
docker compose up # 複数コンテナをまとめて起動
コードを直しても、イメージを作り直すまでコンテナの中身は変わりません。
次に読む記事の地図
次の一歩は何に困っているかで選びます。
中の仕組み — 隔離を支えるのは [[Linux]] カーネル、隔離される単位は [[プロセスとスレッド]]、OSごと仮想化する方式との比較は [[仮想マシンとハイパーバイザ]]。
本番へ渡す — 置き場と受け渡しは [[コンテナレジストリとイメージ管理]]、ビルドとpushの自動化は [[CI/CD]]、切り替えと戻し方は [[デプロイ戦略]]。
数が増えたら — 配置と復旧を宣言で任せるのが [[Kubernetes]]、サービス単位に分ける設計が [[マイクロサービス]]。
どこで動かすか — マネージドな実行環境は [[クラウドコンピューティング]]、常時起動が要らない処理は [[サーバーレス・Lambda]]、土台をコードで用意するのが [[IaC]]。
関連技術とのつながり
- [[Linux]] — コンテナ技術の土台となるOS
- [[Kubernetes]] — 大量のコンテナを管理・運用する基盤
- [[コンテナレジストリとイメージ管理]] — イメージを置き、本番へ渡す保管庫
- [[仮想マシンとハイパーバイザ]] — OSごと仮想化する方式との使い分け
Q: Dockerのイメージとコンテナの関係として正しいのはどれ?
- [ ] イメージは実行中のプロセスで、コンテナはその設計図
- [x] イメージは読み取り専用の設計図で、コンテナはそこから起動した実行中のプロセス
- [ ] イメージとコンテナは同じものの別名
解説: イメージ=設計図(読み取り専用)、コンテナ=イメージから起動した実行中のプロセスです。
Q: コンテナが仮想マシンより軽くて速い理由は?
- [ ] 常に高性能なサーバー上で動くから
- [ ] データを圧縮して保存するから
- [x] OSを丸ごと起動せず、プロセス単位で隔離するから
解説: コンテナはOSごとではなくプロセスごとに隔離するため、秒単位で起動できます。
Q: コンテナのプロセス隔離に使われているLinuxカーネルの機能は?
- [x] namespace / cgroups
- [ ] systemd / cron
- [ ] iptables / ssh
解説: コンテナの中身はLinuxで、namespaceとcgroupsというカーネル機能でプロセスを隔離しています。
Q: コンテナを削除すると、その中に書き込んだファイルはどうなる?
- [x] 一緒に消える。残したいデータはボリュームとして外に出す
- [ ] イメージへ書き戻され、次に起動したコンテナにも引き継がれる
- [ ] レジストリへ自動的にバックアップされる
解説: コンテナは使い捨てが前提です。DBのデータなど残したいものはボリュームに置き、コンテナの寿命と切り離します。