新卒インフラエンジニア向け「Kubernetes 実践教科書① CKAD アプリケーション開発編」の第2回です。前回は 第1回 で AlmaLinux 10 に Docker CE を導入しました。今回は Docker の基本操作を実機で確認します。イメージの取得からコンテナの起動・停止・削除、ログ確認とコンテナ内デバッグ、ポート公開によるブラウザアクセス、そしてデータ永続化(Volume と bind mount)までを順に扱い、コンテナのライフサイクルを手を動かして習得します。
動作確認バージョン:AlmaLinux 10.2 / Docker CE 29.6.0 / nginx:1.27-alpine(2026-06-22 時点)
今ここマップ(全 19 回中の現在地)
現在地は第 1 部「コンテナと Docker」の第 2 回です。前回導入した Docker をここで使いこなせるようにします。
- 第 1 部 コンテナと Docker(第 1〜4 回)← 今ここ
- 第 2 部 Kubernetes 基礎(第 5〜6 回)
- 第 3 部 アプリリソース(第 7〜11 回)
- 第 4 部 ワークロード戦略(第 12〜14 回)
- 第 5 部 セキュリティ基礎(第 15〜16 回)
- 第 6 部 パッケージ管理と HTTPS 公開(第 17〜19 回)
この回のゴール
- イメージの取得とコンテナの起動・停止・削除・ログ確認を一人で実施できる。
- ポート公開(
-p)でホストからコンテナのサービスにアクセスできる。 - Volume と bind mount の違いを説明し、使い分けできる。
イメージとコンテナの関係
Docker を扱う上で最初に押さえるのが「イメージ」と「コンテナ」の区別です。イメージはアプリと実行環境を固めた読み取り専用のテンプレート(設計図)で、コンテナはそのイメージから起動した実行中の実体です。1 つのイメージから複数のコンテナを起動できます。
まずイメージを取得します。本記事では軽量な Web サーバーである Nginx の Alpine 版イメージを使います。
実行コマンド:
$ docker pull nginx:1.27-alpine
取得したイメージは docker images で一覧できます。
実行コマンド:
$ docker images
実行結果(例):
IMAGE ID DISK USAGE CONTENT SIZE
nginx:1.27-alpine 65645c7bb6a0 73MB 21.9MB
IMAGE 列にリポジトリ名とタグ(nginx:1.27-alpine)がまとめて表示されます(この一覧の表示形式は Docker のバージョンにより異なります)。タグはイメージのバージョンを示し、nginx だけを指定すると暗黙に latest が選ばれますが、再現性のため本シリーズでは常にタグを明示します(タグ戦略は第4回で詳しく扱います)。
コンテナのライフサイクル
コンテナには状態(ライフサイクル)があります。おおまかには次の流れです。
- Created:作成済みだがまだ起動していない
- Running:実行中
- Paused:一時停止中(プロセスは凍結)
- Stopped(Exited):停止済み(設定とファイルは残る)
- Removed:削除済み(コンテナは消える)
本記事では実務で多用する遷移(起動 → 停止 → 再開 → 削除)を扱います。Created は docker create(起動せず作成のみ)、Paused は docker pause / docker unpause で到達しますが、日常運用での使用頻度は低めです。

コンテナをバックグラウンドで起動します。-d でデタッチ(背後で実行)、--name で名前を付けます。
実行コマンド:
$ docker run -d --name web nginx:1.27-alpine
停止と再開には docker stop / docker start を使います。停止してもコンテナは Stopped 状態で残り、設定やファイルは保持されます。
実行コマンド:
$ docker stop web
$ docker start web
コンテナの削除は docker rm です。稼働中のコンテナは直接削除できないため、docker stop で停止してから削除するか、docker rm -f で強制削除します。本記事では次の節で web を観察するため、ここでは起動したままにしておきます。
補足:停止中のコンテナや使われなくなったイメージはディスクに残り続けます。溜まってきたら docker system df で使用量を確認し、docker container prune や docker image prune で不要分を整理します。
動いているコンテナを観察する
コンテナの状態を確認するコマンド群を押さえます。これらは第6回以降に学ぶ kubectl の get / logs / exec と発想が共通しており、ここで身につけた操作はそのまま Kubernetes に移ります。
稼働中のコンテナは docker ps、停止中も含めた全コンテナは docker ps -a で一覧します。
実行コマンド:
$ docker ps
$ docker ps -a
実行結果(docker ps の例):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb81997598ec nginx:1.27-alpine "/docker-entrypoint.…" 11 seconds ago Up 11 seconds 80/tcp web
コンテナが標準出力に出したログは docker logs で確認します。アプリの起動状況やエラーを追う基本手段です。
実行コマンド:
$ docker logs web
実行結果(例・nginx の起動ログ):
2026/06/22 13:51:02 [notice] 1#1: start worker processes
2026/06/22 13:51:02 [notice] 1#1: start worker process 22
2026/06/22 13:51:02 [notice] 1#1: start worker process 23
コンテナの中に入って調べたいときは docker exec を使います。-it で対話的な端末を割り当て、シェルを起動します。Alpine ベースのため sh を使います。シェルを抜けてホストに戻るには exit を実行します。
実行コマンド:
$ docker exec -it web sh
コンテナの詳細なメタデータ(IP アドレス・マウント・環境変数など)は docker inspect で取得できます。出力は長い JSON のため、--format(-f)で必要な値だけ抜き出すと扱いやすくなります。コンテナの IP アドレスは、近年の Docker ではネットワークごとの情報配下(.NetworkSettings.Networks)に格納されるため、range で取り出します。
実行コマンド:
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
実行結果(例):
172.17.0.2
ポート公開でブラウザからアクセスする
コンテナ内の Nginx はコンテナの 80 番ポートで待ち受けますが、そのままではホストの外から到達できません。Docker 28 以降は、明示的に公開していないポートへの外部からのアクセスは既定で遮断されます。ホストからアクセスするには、起動時に -p でホスト側ポートとコンテナ側ポートを結びつけます。ポート公開はコンテナの作成時にしか設定できないため、前の節で -p なしで起動した web をいったん削除し、-p を付けて作り直します。
実行コマンド:
$ docker rm -f web
$ docker run -d --name web -p 8080:80 nginx:1.27-alpine

-p 8080:80 は「ホストの 8080 番 → コンテナの 80 番」という対応です(左がホスト、右がコンテナ)。これでホスト上の 8080 番がコンテナの Nginx に転送されます。動作を確認します。
実行コマンド:
$ curl -s http://localhost:8080/ | head -4
実行結果(例):
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
ブラウザを使える環境であれば http://<ホストのIP>:8080/ にアクセスすると Nginx の初期ページが表示されます。このポートマッピングの考え方は、第5回以降の kind クラスタでホスト OS からアクセスする仕組み(extraPortMappings)にもつながります。
データの永続化 — Volume と bind mount
コンテナを削除すると、コンテナ内に書き込んだデータは消えます。データを残すには、コンテナの外にデータを置く仕組みが必要です。Docker には主に 2 つの方式があります。
- 名前付き Volume:Docker が管理する専用領域。場所を意識せず使え、バックアップや共有がしやすい。本番のデータ保存に向く。
- bind mount:ホストの任意のディレクトリをコンテナ内に直接マウントする。ホスト上のファイルをそのまま見せたい開発用途に向く。
名前付き Volume を作成してコンテナにマウントします。
実行コマンド:
$ docker volume create webdata
$ docker run -d --name web-vol -p 8081:80 -v webdata:/usr/share/nginx/html nginx:1.27-alpine
bind mount はホストのパスを指定します(左がホストのパス、右がコンテナ内のパス)。
実行コマンド:
$ docker run -d --name web-bind -p 8082:80 -v /home/developer/site:/usr/share/nginx/html:ro nginx:1.27-alpine
末尾の :ro は読み取り専用マウントの指定です。Kubernetes でも同じ発想で、第9回の PersistentVolume(永続ストレージ)や第10回の ConfigMap のボリュームマウントへ発展します。コンテナとデータを分離する考え方をここで掴んでおきます。
やってみよう
本記事の内容を実機で再現します。次の手順を順に実行してください。
docker pull nginx:1.27-alpineでイメージを取得し、docker imagesで確認する。docker run -d --name web -p 8080:80 nginx:1.27-alpineで起動する。docker psで稼働を確認し、curl http://localhost:8080/またはブラウザでアクセスする。docker logs webでアクセスログを確認し、docker exec -it web shでコンテナ内に入る(exitで戻る)。docker stop web→docker ps -aで停止状態を確認し、docker rm webで削除する。- 名前付き Volume をマウントしたコンテナを起動 → そのコンテナを削除 → 同じ Volume をマウントした新しいコンテナを起動し、Volume の内容が引き継がれることを確認する。
理解度チェック
次の各文が正しいか(○)誤りか(×)を判断してください。解答は下にまとめています。
- イメージは読み取り専用のテンプレートで、1 つのイメージから複数のコンテナを起動できる。
docker psは停止中のコンテナも含めてすべて表示する。- コンテナを
docker stopすると、そのコンテナは即座に削除される。 -p 8080:80はホストの 8080 番をコンテナの 80 番へ転送する指定である。docker exec -itは稼働中のコンテナの中でコマンドを実行する。- 名前付き Volume は Docker が管理する領域、bind mount はホストの任意パスを直接マウントする。
- コンテナ内に書き込んだデータは、コンテナを削除しても自動的に残る。
解答
- 1. ○:イメージは設計図、コンテナはその実体。1 イメージから複数コンテナを起動できる。
- 2. ×:
docker psは稼働中のみ。停止中も見るにはdocker ps -aが必要。 - 3. ×:停止しても Stopped 状態で残る。削除には
docker rmが必要。 - 4. ○:左がホスト、右がコンテナ。ホスト 8080 → コンテナ 80。
- 5. ○:稼働中コンテナ内でコマンドを実行する。
-itで対話端末を割り当てる。 - 6. ○:Volume は Docker 管理領域、bind mount はホストパス直結。
- 7. ×:コンテナ内のデータは削除で消える。残すには Volume か bind mount を使う。
まとめ
本記事では、イメージとコンテナの違いを起点に、コンテナのライフサイクル(取得・起動・停止・削除)、状態確認(ps / logs / exec / inspect)、ポート公開によるブラウザアクセス、そして Volume と bind mount によるデータ永続化を確認しました。ここで身につけた操作と考え方は、第6回以降の kubectl 操作や、ストレージ・ネットワークの回にそのままつながります。
次回予告
次回(第3回)は Dockerfile を扱います。マルチステージビルドで Java(JDK 25 + Payara Micro)の自社アプリ Backend イメージを自分でビルドし、本シリーズを通して育てる模擬アプリ fanclub-api を初めて登場させます。
シリーズ一覧
第1部:コンテナと Docker
- 第1回 コンテナ技術概念 + Docker 環境準備
- 第2回 Docker 基本操作 ← 今ここ
- 第3回 Dockerfile + マルチステージ + JDK 25 / Payara Micro イメージビルド
- 第4回 コンテナレジストリ + イメージタグ戦略 + Trivy スキャン
第2部:Kubernetes 基礎
第3部:アプリリソース
- 第7回 Pod + Multi-container パターン
- 第8回 Service とネットワーキング
- 第9回 ストレージ(PVC + StatefulSet)+ PostgreSQL DB 追加
- 第10回 ConfigMap + Secret + ServiceAccount 基礎
- 第11回 Job + CronJob + DaemonSet
第4部:ワークロード戦略
- 第12回 Deployment + 3 Probe + Rolling Update + Probe デバッグ実践
- 第13回 Deployment 戦略補完(Blue/Green + Canary + Recreate)
- 第14回 ResourceQuota + LimitRange + Multi-tenant Namespace
