本記事には広告(アフィリエイトリンク)が含まれます。

Docker基本操作入門|CKAD対策 第2回

広告

新卒インフラエンジニア向け「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 で到達しますが、日常運用での使用頻度は低めです。

コンテナの状態遷移(イメージから Running、stop/start で Stopped と往復、pause/unpause で Paused、rm で Removed)と各操作コマンドの対応図
図1:コンテナのライフサイクルと操作コマンド

コンテナをバックグラウンドで起動します。-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 prunedocker image prune で不要分を整理します。

動いているコンテナを観察する

コンテナの状態を確認するコマンド群を押さえます。これらは第6回以降に学ぶ kubectlget / 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 番がコンテナ内 nginx の 80 番へ転送される仕組みの図
図2:ポート公開(-p 8080:80)の仕組み

-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 のボリュームマウントへ発展します。コンテナとデータを分離する考え方をここで掴んでおきます。

やってみよう

本記事の内容を実機で再現します。次の手順を順に実行してください。

  1. docker pull nginx:1.27-alpine でイメージを取得し、docker images で確認する。
  2. docker run -d --name web -p 8080:80 nginx:1.27-alpine で起動する。
  3. docker ps で稼働を確認し、curl http://localhost:8080/ またはブラウザでアクセスする。
  4. docker logs web でアクセスログを確認し、docker exec -it web sh でコンテナ内に入る(exit で戻る)。
  5. docker stop webdocker ps -a で停止状態を確認し、docker rm web で削除する。
  6. 名前付き Volume をマウントしたコンテナを起動 → そのコンテナを削除 → 同じ Volume をマウントした新しいコンテナを起動し、Volume の内容が引き継がれることを確認する。

理解度チェック

次の各文が正しいか(○)誤りか(×)を判断してください。解答は下にまとめています。

  1. イメージは読み取り専用のテンプレートで、1 つのイメージから複数のコンテナを起動できる。
  2. docker ps は停止中のコンテナも含めてすべて表示する。
  3. コンテナを docker stop すると、そのコンテナは即座に削除される。
  4. -p 8080:80 はホストの 8080 番をコンテナの 80 番へ転送する指定である。
  5. docker exec -it は稼働中のコンテナの中でコマンドを実行する。
  6. 名前付き Volume は Docker が管理する領域、bind mount はホストの任意パスを直接マウントする。
  7. コンテナ内に書き込んだデータは、コンテナを削除しても自動的に残る。

解答

  • 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

第2部:Kubernetes 基礎

第3部:アプリリソース

第4部:ワークロード戦略

第5部:セキュリティ基礎

第6部:パッケージ管理 + HTTPS 公開

広告
kubernetes
スポンサーリンク