Dockerをインストールしたら、まず docker run hello-world を実行するのが最初の一歩です。この記事では hello-world の出力を丁寧に読み解き、そこから nginx・ubuntu など実用的なイメージまで使いながら、コンテナのライフサイクル(起動→確認→停止→削除)を一通り体験します。
第1章(1-1〜1-4)で学んだアーキテクチャの知識がここで繋がります。コマンドを打つたびに「なぜこうなるのか」を確認しながら進んでください。
目次
- hello-world を動かす
- 出力を読む:Docker が何をしたのか
- コンテナを確認する:docker ps と docker ps -a
- イメージを確認する:docker images
- nginx を動かす:デタッチモードとポートマッピング
- ubuntu を動かす:インタラクティブモード
- コンテナのライフサイクル:stop・rm・rmi
- シミュレータで練習する
- 第1章のまとめ
1. hello-world を動かす
インストールが完了したら、最初にこれを実行します。
docker run hello-world
次のような出力が出れば成功です。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:1408fec50309afded17025ab0b8143a22...
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(linux/amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
「Hello from Docker!」が表示されれば、Dockerの全コンポーネント(CLI・Daemon・containerd・runc・Registry)が正しく連携しています。
2. 出力を読む:Docker が何をしたのか
hello-world の出力に書かれている「4つのステップ」は、1-2で学んだアーキテクチャそのものです。
| 出力に書かれているステップ | 1-2で学んだ対応コンポーネント |
|---|---|
| 1. Docker client contacted the Docker daemon. | docker CLI → REST API → dockerd |
| 2. The daemon pulled the image from Docker Hub. | dockerd → Registry API → Docker Hub |
| 3. The daemon created a new container from that image. | dockerd → containerd → runc → clone() + overlayfs + cgroup |
| 4. The daemon streamed that output to the client. | Container stdout → dockerd → docker CLI → 画面に表示 |
hello-world イメージの内部構造
hello-world は Docker の中で最も小さなイメージの一つです(約 13KB)。ベースイメージは scratch(完全に空のイメージ)で、メッセージを出力する実行ファイルだけが含まれています。
# イメージのサイズを確認
docker images hello-world
# → REPOSITORY TAG IMAGE ID CREATED SIZE
# → hello-world latest d2c94e258dcb 13 months ago 13.3kB
# hello-world コンテナの内部構造(Dockerfile)
# FROM scratch
# COPY hello /
# CMD ["/hello"]
# ← "hello" という実行ファイル1つだけが入っている
hello-world コンテナはメッセージを出力したら即座に終了します。コンテナは「削除」されたわけではなく、「Exited(停止済み)」状態で残っています。
docker ps には映りませんが、docker ps -a で確認できます。
3. コンテナを確認する:docker ps と docker ps -a
hello-world を実行した直後に docker ps を実行すると、何も表示されません。
# 実行中のコンテナのみ表示
docker ps
# → CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# → (何も表示されない)
これは hello-world がすでに終了しているからです。停止済みコンテナも含めて表示するには -a(all)オプションをつけます。
# すべてのコンテナ(停止済みも含む)を表示
docker ps -a
# → CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
# → 4a7f1c2b3d8e hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago eager_darwin
各カラムの意味を確認しておきましょう。
| カラム | 意味 | 例 |
|---|---|---|
CONTAINER ID |
コンテナの一意なID(先頭12文字) | 4a7f1c2b3d8e |
IMAGE |
元にしたイメージ名 | hello-world |
COMMAND |
コンテナ起動時に実行したコマンド | "/hello" |
STATUS |
コンテナの現在の状態 | Exited (0) ← 終了コード0(正常終了) |
NAMES |
自動生成されたコンテナ名(--nameで指定可) |
eager_darwin |
Exited (0) は正常終了を意味します。Exited (1) や Exited (137)(SIGKILL)の場合はエラーや強制終了です。docker logs でエラーの詳細を確認できます。
4. イメージを確認する:docker images
ローカルにダウンロード済みのイメージ一覧を確認します。
docker images
# → REPOSITORY TAG IMAGE ID CREATED SIZE
# → hello-world latest d2c94e258dcb 13 months ago 13.3kB
イメージとコンテナの関係を整理します。
イメージはコンテナを起動するたびに何度でも使えます。コンテナを削除してもイメージは残ります。
5. nginx を動かす:デタッチモードと名前付け
hello-world はすぐ終了するコンテナでしたが、nginx のような Web サーバーは起動し続けるのが前提です。ターミナルを占領されずにバックグラウンドで動かすには -d フラグを使います。
コマンドの構成
docker run -d -p 8080:80 --name my-nginx nginx
# ↑ ↑ ↑ ↑
# │ │ │ └ 使うイメージ名
# │ │ └─ コンテナに "my-nginx" という名前をつける
# │ └─ ポートの紐付け(詳細は第2章で解説)
# └─ バックグラウンドで起動(detach モード)
-d(detach)とは
通常の docker run はコンテナの出力をターミナルに流しっぱなしにします。-d をつけると Docker はコンテナIDだけを返してターミナルを即座に返してくれます。裏で nginx はずっと動き続けています。
docker run -d -p 8080:80 --name my-nginx nginx
# → 3b4c5d6e7f8a9b1c2d3e4f5a6b7c8d ← コンテナIDだけ表示されてプロンプトが返る
docker ps # バックグラウンドで動いているか確認
# → CONTAINER ID IMAGE STATUS NAMES
# → 3b4c5d6e7f8a nginx Up 10 seconds my-nginx
–name で名前をつける理由
名前をつけないとコンテナIDで操作しなければなりません。--name をつけると以降のコマンドで名前が使えて便利です。
# 名前なしの場合(IDで操作しなければならない)
docker stop 3b4c5d6e7f8a
# 名前ありの場合(わかりやすい)
docker stop my-nginx
-p 8080:80 はホストPCの 8080 番ポートをコンテナの 80 番に繋ぐ指定です。これにより http://localhost:8080 でブラウザからアクセスできます。仕組みの詳細は第2章「ポート・ボリューム」で改めて解説します。
ブラウザで http://localhost:8080 を開くと、こんな画面が表示されます:
この画面が出れば、nginx が正常に起動してホスト側の 8080 番ポートから見えている証拠です。(詳しいハンズオンは 2-8 で扱います)
docker logs — コンテナのログを確認する
-d で起動するとターミナルにログが出なくなります。ログを見たいときは docker logs を使います。
# コンテナのログを表示
docker logs my-nginx
# → /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
# → 2024/01/01 00:00:00 [notice] 1#1: using the "epoll" event method
# → 2024/01/01 00:00:00 [notice] 1#1: nginx/1.27.x
# リアルタイムでログを追う(Ctrl+C で終了)
docker logs -f my-nginx
docker exec — 起動中コンテナでコマンドを実行する
バックグラウンドで動いているコンテナの中で何かコマンドを実行したいときは docker exec を使います。
# nginx コンテナの中で nginx のバージョンを確認
docker exec my-nginx nginx -v
# → nginx version: nginx/1.27.x
# コンテナ内の /etc/nginx/nginx.conf を表示
docker exec my-nginx cat /etc/nginx/nginx.conf
6. ubuntu を動かす:インタラクティブモード
コンテナのシェルに入って操作するには -it(interactive + pseudo-TTY)フラグを使います。
# ubuntu のシェルに入る
docker run -it ubuntu bash
# → root@a3f2b1c4d5e6:/# ← コンテナ内のシェルプロンプト
コンテナ内でいくつか確認してみましょう。
# コンテナ内での操作
cat /etc/os-release # → Ubuntu 24.04 LTS など
hostname # → a3f2b1c4d5e6(コンテナID 先頭12文字)
ps aux # → PID 1: bash, PID 7: ps だけが見える
cat /proc/self/cgroup # → cgroupのパスが確認できる
# コンテナを抜ける(コンテナは停止する)
exit
コンテナ内で
ps aux を実行すると、プロセスが bash と ps の2つしか見えません(PID名前空間の分離)。hostname はコンテナ固有の値(UTS名前空間)。これらは 1-5 で学んだ名前空間による分離が実際に動いている証拠です。
–rm フラグでコンテナを使い捨てにする
テスト目的でコンテナを使ったあと自動で削除したい場合は --rm フラグが便利です。
# 終了と同時に自動削除
docker run --rm -it ubuntu bash
# → exit すると docker ps -a にも残らない
# Python のバージョンを確認して即削除
docker run --rm python:3.12-slim python --version
# → Python 3.12.x
# コンテナは自動削除される
7. コンテナのライフサイクル:stop・rm・rmi
コンテナには 作成 → 実行 → 停止 → 削除 というライフサイクルがあります。
docker run -d nginx → [Created] → [Running] docker stop my-nginx → [Running] → [Exited] docker start my-nginx → [Exited] → [Running] docker rm my-nginx → [Exited] → (削除) docker rmi nginx → [イメージ] → (削除) ※コンテナがなければ
停止・削除の一連の流れ
# ① コンテナを停止する(SIGTERM を送り、10秒後に SIGKILL)
docker stop my-nginx
# ② 停止したコンテナを削除する
docker rm my-nginx
# ① と ② をまとめて:
docker rm -f my-nginx # 実行中でも強制削除(SIGKILL)
# 停止済みのコンテナを全部まとめて削除
docker container prune # 確認プロンプトが出る
docker container prune -f # 確認なしで削除
# ③ イメージを削除する(そのイメージを使ったコンテナがない場合)
docker rmi nginx
# → Untagged: nginx:latest
# → Deleted: sha256:...
使用済みリソースをまとめてクリーンアップ
# 停止済みコンテナ・未使用イメージ・未使用ネットワーク・未使用ボリュームをまとめて削除
docker system prune
# 未使用イメージも含めてすべて削除(より強力)
docker system prune -a
# ディスク使用量を確認
docker system df
# → TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# → Images 3 1 892MB 877MB (98%)
# → Containers 2 1 1.2kB 1.1kB (92%)
# → Local Volumes 0 0 0B 0B
docker system prune -a は使用中でないイメージをすべて削除します。本番環境でキャッシュとして使っているイメージまで消えてしまうことがあります。実行前に docker system df で何が削除対象かを把握してから実行してください。
よく使うコマンド早見表
| コマンド | 説明 | よく使うオプション |
|---|---|---|
docker run |
コンテナを作成して起動 | -d バックグラウンド / -it 対話 / -p ポート / --rm 自動削除 / --name 名前指定 |
docker ps |
実行中コンテナ一覧 | -a 停止済みも表示 / -q IDのみ表示 |
docker logs |
コンテナのログを表示 | -f リアルタイム追尾 / --tail 50 最後の50行 |
docker exec |
実行中コンテナでコマンド実行 | -it bash シェルに入る |
docker stop |
コンテナを正常停止(SIGTERM) | -t 30 タイムアウト秒数(デフォルト10秒) |
docker rm |
停止済みコンテナを削除 | -f 実行中でも強制削除 |
docker images |
ローカルイメージ一覧 | -a 中間レイヤーも表示 |
docker rmi |
イメージを削除 | -f 強制削除 |
docker pull |
イメージをダウンロード | --platform アーキテクチャ指定 |
8. シミュレータで練習する
下のシミュレータでは、実際の Docker 環境と同じようにコマンドを入力してコンテナのライフサイクルを体験できます。以下の全10ステップを順番に入力して、イメージの取得からコンテナの起動・停止・削除までの一連の流れを体験してみましょう。
練習の流れ(全10ステップ)
docker run hello-world
docker ps -a
-a で停止中のコンテナも表示。STATUS が Exited になっているはずです。 docker images
hello-world イメージがローカルに保存されているのを確認します。 docker run -d --name web -p 8080:80 nginx
-d でバックグラウンド実行、--name で名前を付け、ポート 8080 を公開します。 docker ps
web コンテナが Up 状態で動いていることを確認します。 docker logs web
docker exec web ls /etc/nginx
docker stop web
docker ps -a で Exited に変わったか確認してみましょう。 docker rm web
docker ps -a でリストから消えたことを確認します。 docker rmi hello-world nginx
docker images で消えたことを確認すれば完了です。上のステップに書いてあるコマンドをそのままシミュレータのターミナルに入力してください。
help でサポートコマンド一覧、clear で画面をリセットできます。
9. 第1章のまとめ
第1章(1-1〜1-5)で学んだ内容を振り返ります。
| 記事 | 学んだこと | 核心 |
|---|---|---|
| 1-1 | VM vs コンテナの違い | ゲストOSの有無。コンテナはカーネルを共有するため軽い・速い |
| 1-5 | 名前空間・cgroups・overlayfs | コンテナの正体はLinuxカーネルの3機能で隔離されたプロセス |
| 1-2 | Dockerアーキテクチャ | CLI → dockerd → containerd → runc の分担と Docker Hub との連携 |
| 1-4 | インストールと初期設定 | Windows(WSL2)・macOS・Linuxそれぞれのインストール方法 |
| 1-5 | 基本コマンドの実践 | run・ps・logs・exec・stop・rm のライフサイクル |
第2章では、
docker pull・docker push・docker build・docker commit など、イメージを中心とした操作を体系的に学びます。「docker run の全オプション」や「ポートマッピング・ボリュームマウントの詳細」など、実際の開発で必要になるコマンドをすべてカバーします。
参考リンク
- docker run コマンドリファレンス(公式) — すべてのオプションの詳細説明
- hello-world イメージ(Docker Hub) — 動作確認用イメージのソースと説明
- nginx 公式イメージ(Docker Hub) — 設定ファイルのマウント方法など
- ubuntu 公式イメージ(Docker Hub) — バージョンタグ一覧
- docker system prune リファレンス(公式) — リソースのクリーンアップ方法


コメント