【第3回】Docker基本コマンド一覧と実践例|Rocky Linux 9で学ぶコンテナ操作

インフラエンジニアのための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 rundocker container run
コンテナ一覧docker psdocker container ls
コンテナ停止docker stopdocker container stop
コンテナ削除docker rmdocker container rm
コンテナ内実行docker execdocker container exec
ログ確認docker logsdocker container logs
詳細情報docker inspectdocker container inspect
イメージ一覧docker imagesdocker image ls
イメージ取得docker pulldocker image pull

本記事では広く使われている旧コマンド形式で解説しますが、新コマンドでも全く同じ動作になります。チームの規約に合わせて使い分けてください。

コンテナのライフサイクルと基本操作

コンテナには「作成 → 起動 → 実行中 → 停止 → 削除」というライフサイクルがあります。各段階に対応するコマンドを順に見ていきます。

STEP
docker run — コンテナの作成と起動

イメージからコンテナを作成し起動します。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
STEP
docker ps — コンテナ一覧の確認

実行中のコンテナを一覧表示します。-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
STEP
docker stop / rm — 停止と削除
# コンテナを停止(SIGTERMを送信し、10秒後にSIGKILL)
$ docker stop web01

# コンテナを削除(停止済みのみ削除可能)
$ docker rm web01

# 実行中のコンテナを強制削除
$ docker rm -f web01

# 停止中のコンテナを一括削除
$ docker container prune
STEP
docker start / restart — 再起動
# 停止中のコンテナを起動
$ 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 aux

docker 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 エラーの対処手順

STEP
SELinuxの状態を確認する
$ getenforce
Enforcing

Enforcing と表示されればSELinuxが有効です。

STEP
監査ログで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 ...

deniedcontainer_t が確認できればSELinuxが原因です。

STEP
:Z を付けてコンテナを再作成する
$ docker rm -f web02
$ docker run -d --name web02 -p 8081:80 \
  -v /opt/web/html:/usr/share/nginx/html:Z \
  nginx:latest

SELinuxを PermissiveDisabled に変更するのは最終手段です。本番環境では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-stopped

alwaysunless-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 stopdocker 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入門シリーズ

参考書籍

Dockerをより深く学びたい方には以下の書籍がおすすめです。

開発系エンジニアのためのDocker絵とき入門
イラストを多用した分かりやすい解説で、Dockerの概念からコマンド操作まで体系的に学べます。コマンドに苦手意識がある方の最初の1冊に最適です。

Docker実践ガイド 第3版
インフラエンジニア向けに本番運用を見据えた内容が充実しています。ネットワーク設計やセキュリティなど、実務で必要になる知識を網羅した一冊です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次