インフラエンジニアのためのDocker入門シリーズ第3回です。前回はRocky Linux 9へのDockerインストールを行いました。今回はいよいよDockerの基本コマンドを実際に手を動かしながら覚えていきます。
Dockerの概念からまだ学びたい方は、第1回:Dockerとは?コンテナ技術の基本とメリットからご覧ください。
- Dockerコマンドの体系(新旧コマンドの対応)と、コンテナのライフサイクル操作(run / stop / rm / exec / logs)
docker inspect --formatを使った実務で役立つ情報取得テクニック- Rocky Linux 9 + SELinux Enforcing環境でバインドマウントする際の
:z/:Zオプションと、--restartポリシー4種の使い分け
Dockerコマンドの体系を整理する(新旧コマンド対応表)
Dockerには歴史的な経緯で「旧コマンド」と「新コマンド(管理コマンド)」の2種類の書き方が存在します。Docker 1.13以降、docker <オブジェクト> <操作> という形式が推奨されています。
| 操作内容 | 旧コマンド | 新コマンド(推奨) |
|---|---|---|
| コンテナ起動 | docker run | docker container run |
| コンテナ一覧 | docker ps | docker container ls |
| コンテナ停止 | docker stop | docker container stop |
| コンテナ削除 | docker rm | docker container rm |
| コンテナ内実行 | docker exec | docker container exec |
| ログ確認 | docker logs | docker container logs |
| 詳細情報 | docker inspect | docker container inspect |
| イメージ一覧 | docker images | docker image ls |
| イメージ取得 | docker pull | docker image pull |
本記事では広く使われている旧コマンド形式で解説しますが、新コマンドでも全く同じ動作になります。チームの規約に合わせて使い分けてください。
コンテナのライフサイクルと基本操作
コンテナには「作成 → 起動 → 実行中 → 停止 → 削除」というライフサイクルがあります。各段階に対応するコマンドを順に見ていきます。
イメージからコンテナを作成し起動します。Dockerで最も使用頻度の高いコマンドです。
# Nginxコンテナをバックグラウンドで起動
$ docker run -d --name web01 -p 8080:80 nginx:latest
a1b2c3d4e5f6...
# 対話モードでRocky Linuxコンテナに入る
$ docker run -it --rm rockylinux:9 /bin/bash
[root@f7a8b9c0d1e2 /]# cat /etc/rocky-release
Rocky Linux release 9.5 (Blue Onyx)
[root@f7a8b9c0d1e2 /]# exit
# 環境変数付きでMySQLコンテナを起動
$ docker run -d --name db01 \
-e MYSQL_ROOT_PASSWORD=MySecret123 \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
mysql:8.0| オプション | 意味 | 使用例 |
|---|---|---|
-d | バックグラウンド実行 | -d |
--name | コンテナ名を指定 | --name web01 |
-p | ポートフォワーディング | -p 8080:80 |
-v | ボリュームマウント | -v /host:/container |
-e | 環境変数の設定 | -e MYSQL_ROOT_PASSWORD=pass |
--rm | 停止時に自動削除 | --rm |
-it | 対話モード(TTY割当) | -it /bin/bash |
実行中のコンテナを一覧表示します。-a を付けると停止中も含めて表示できます。
# 実行中のコンテナのみ表示
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest "..." 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp web01
# 停止中を含む全コンテナ表示
$ docker ps -a
# コンテナIDのみ表示(スクリプトで便利)
$ docker ps -q# コンテナを停止(SIGTERMを送信し、10秒後にSIGKILL)
$ docker stop web01
# コンテナを削除(停止済みのみ削除可能)
$ docker rm web01
# 実行中のコンテナを強制削除
$ docker rm -f web01
# 停止中のコンテナを一括削除
$ docker container prune# 停止中のコンテナを起動
$ docker start db01
# コンテナを再起動(stop → start)
$ docker restart db01
# 停止までの猶予時間を指定(デフォルト10秒)
$ docker restart -t 30 db01コンテナの中を調べる
docker exec — コンテナ内でコマンド実行
実行中のコンテナに対してコマンドを実行します。トラブルシューティングや設定確認で非常によく使います。
# コンテナ内でbashシェルを起動(対話モード)
$ docker exec -it web01 /bin/bash
root@a1b2c3d4e5f6:/# nginx -v
nginx version: nginx/1.27.4
root@a1b2c3d4e5f6:/# exit
# コンテナ内のファイルを直接確認(非対話)
$ docker exec web01 cat /etc/nginx/nginx.conf
# コンテナ内のプロセス確認
$ docker exec web01 ps auxdocker exec は実行中のコンテナにしか使えません。停止中のコンテナの中身を調べたい場合は docker cp でファイルをコピーするか、docker start で起動してから exec します。
docker logs — ログの確認
コンテナの標準出力・標準エラー出力に出力されたログを確認します。
# ログを全件表示
$ docker logs web01
# 末尾20行のみ表示
$ docker logs --tail 20 web01
# リアルタイムでログを追跡(tail -f と同じ感覚)
$ docker logs -f web01
# タイムスタンプ付きで表示
$ docker logs -t web01
2026-04-05T03:12:45.123456789Z 172.17.0.1 - - "GET / HTTP/1.1" 200 615 ...docker inspect — 詳細情報の取得と –format 活用
コンテナやイメージの詳細情報をJSON形式で取得します。--format オプションでGoテンプレートを指定して必要な情報だけを抜き出すのが実務のコツです。
# コンテナのIPアドレスを取得
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web01
172.17.0.2
# マウント情報を確認
$ docker inspect --format='{{json .Mounts}}' web01 | python3 -m json.tool
# 再起動ポリシーを確認
$ docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' web01
# ログファイルのパスを確認
$ docker inspect --format='{{.LogPath}}' web01
# 環境変数を一覧表示
$ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' web01{{json .フィールド名}} でJSON形式に指定し、python3 -m json.tool にパイプすると読みやすく整形できます。監視スクリプトやCI/CDパイプラインでコンテナ情報を自動取得する際に重宝します。
Rocky Linux 9 + SELinux環境での注意点
Rocky Linux 9はデフォルトでSELinuxがEnforcingモードで有効になっています。Dockerでバインドマウントを使う際、SELinuxのラベル不一致が原因で Permission denied が発生するケースが非常に多いです。Rocky Linuxの基本的な操作に不安がある方は sudo と su の違い・使い分けガイド も合わせてご覧ください。
バインドマウント時の :z / :Z オプション
# SELinuxが有効か確認
$ getenforce
Enforcing
# :z / :Z なしでバインドマウント → Permission deniedになりがち
$ mkdir -p /opt/web/html
$ echo "Hello Docker" > /opt/web/html/index.html
$ docker run -d --name web02 -p 8081:80 -v /opt/web/html:/usr/share/nginx/html nginx:latest
# コンテナ内からファイルにアクセスできない
$ curl http://localhost:8081/
# → 403 Forbidden が返ってくるこれはSELinuxのセキュリティコンテキストが合っていないためです。解決するには :z または :Z サフィックスを付けます。
| オプション | SELinuxラベル | 用途 |
|---|---|---|
:z(小文字) | container_file_t(共有) | 複数コンテナで同じボリュームを共有する場合 |
:Z(大文字) | container_file_t(プライベート) | 1つのコンテナだけがアクセスする場合(推奨) |
# :Z オプション付きでマウント(単一コンテナ向け)
$ docker run -d --name web03 -p 8082:80 \
-v /opt/web/html:/usr/share/nginx/html:Z \
nginx:latest
$ curl http://localhost:8082/
Hello Docker
# SELinuxラベルが変更されたことを確認
$ ls -Z /opt/web/html/
system_u:object_r:container_file_t:s0:c123,c456 index.html:Z を / や /etc などシステムディレクトリに適用すると、ホストOS自体が正常に動作しなくなります。必ず専用のディレクトリに対してのみ使用してください。
Permission denied エラーの対処手順
$ getenforce
EnforcingEnforcing と表示されればSELinuxが有効です。
$ sudo ausearch -m avc -ts recent
type=AVC msg=audit(...): avc: denied { read } ...
scontext=system_u:system_r:container_t ...
tcontext=unconfined_u:object_r:default_t ...denied と container_t が確認できればSELinuxが原因です。
$ docker rm -f web02
$ docker run -d --name web02 -p 8081:80 \
-v /opt/web/html:/usr/share/nginx/html:Z \
nginx:latestSELinuxを Permissive や Disabled に変更するのは最終手段です。本番環境ではEnforcingを維持したまま :z / :Z で対処するのがベストプラクティスです。
運用で役立つ –restart ポリシー比較
サーバー再起動時やDockerデーモン再起動時に、コンテナを自動で起動させるかどうかを制御するのが --restart ポリシーです。systemd のサービス管理に慣れている方は Linuxのサービス・プロセス管理 と比較しながら読むと理解が深まります。
| ポリシー | 異常終了時 | 手動停止後の再起動 | 推奨用途 |
|---|---|---|---|
no(デフォルト) | 再起動しない | 起動しない | テスト・一時作業用 |
always | 常に再起動 | 起動する | 絶対に止めたくないサービス |
unless-stopped | 常に再起動 | 起動しない | 通常の本番サービス(推奨) |
on-failure[:N] | N回まで再起動 | 起動しない | バッチ処理・リトライ制御 |
# unless-stopped を設定(本番環境で推奨)
$ docker run -d --name web-prod --restart unless-stopped -p 80:80 nginx:latest
# on-failure で最大5回までリトライ
$ docker run -d --name batch01 --restart on-failure:5 my-batch-image
# 既存コンテナのポリシーを後から変更
$ docker update --restart unless-stopped web01
# 設定の確認
$ docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' web-prod
unless-stoppedalways と unless-stopped の違いは、docker stop で手動停止した後にDockerデーモンが再起動した場合の動作です。always は手動停止したコンテナも起動しますが、unless-stopped は手動停止を尊重します。本番環境では unless-stopped が基本です。
よくある疑問
- docker rm と docker rmi の違いは?
docker rmはコンテナの削除、docker rmiはイメージの削除です。コンテナを削除してもイメージは残ります。容量を完全に解放したい場合は両方を実行するか、docker system pruneを使います。- コンテナを停止せずに削除できる?
docker rm -f コンテナ名で強制削除できます。ただしDBコンテナなどではデータが壊れる可能性があります。通常はdocker stop→docker rmの順番が安全です。- SELinuxを無効にしてはいけないの?
本番環境では無効化すべきではありません。
:z/:Zオプションで対処できるケースがほとんどです。どうしても解決しない場合はaudit2whyコマンドで原因を調べてから対応します。
まとめ
docker run/stop/rm/exec/logsがコンテナ操作の基本5コマンドdocker inspect --formatを使えば、IPアドレスやマウント情報をピンポイントで取得できる- Rocky Linux 9(SELinux Enforcing)ではバインドマウント時に
:z/:Zを忘れずに付ける - 本番環境のコンテナには
--restart unless-stoppedを設定しておく
次回の第4回では、DockerイメージとDockerfileの書き方を解説します。自分だけのカスタムイメージを作成する方法を学びましょう。
インフラエンジニアのためのDocker入門シリーズ
- 前回: 第2回 — Rocky Linux 9にDockerをインストールする
- 今回: 第3回 — Dockerの基本コマンドを覚える(この記事)
- 次回: 第4回 — DockerイメージとDockerfileの書き方(近日公開)
参考書籍
Dockerをより深く学びたい方には以下の書籍がおすすめです。
開発系エンジニアのためのDocker絵とき入門
イラストを多用した分かりやすい解説で、Dockerの概念からコマンド操作まで体系的に学べます。コマンドに苦手意識がある方の最初の1冊に最適です。
Docker実践ガイド 第3版
インフラエンジニア向けに本番運用を見据えた内容が充実しています。ネットワーク設計やセキュリティなど、実務で必要になる知識を網羅した一冊です。

コメント