docker run と docker exec、何が違うの?
Dockerを学び始めると、必ず出てくるのが docker run と docker exec の2つのコマンドです。どちらも「コンテナの中でコマンドを実行する」ように見えるため、初心者の方が混乱しやすいポイントの一つです。
しかし、この2つは役割がまったく異なるコマンドです。違いを正しく理解しないまま使っていると、意図せず新しいコンテナを量産してしまったり、エラーに悩まされたりすることになります。
この記事では、docker run と docker exec の違いを比較表や実行例を使ってわかりやすく解説します。
結論:run は「作って起動」、exec は「入って実行」
まず結論から押さえましょう。
- docker run:イメージから新しいコンテナを作成して起動するコマンド
- docker exec:すでに動いているコンテナの中で追加のコマンドを実行するコマンド
つまり、docker run はコンテナの「誕生」に関わるコマンドで、docker exec はすでに生まれて動いているコンテナに「お邪魔する」コマンドです。
docker run と docker exec の比較表
| 比較項目 | docker run | docker exec |
|---|---|---|
| 目的 | 新しいコンテナを作成して起動する | 実行中のコンテナ内でコマンドを実行する |
| 対象 | Dockerイメージ | 実行中のコンテナ |
| コンテナの作成 | ✅ する(新しいコンテナが作られる) | しない(既存のコンテナを使う) |
| -it オプション | 使える(対話シェルで起動) | 使える(対話シェルに接続) |
| exit した時の挙動 | コンテナが停止する | コンテナは動き続ける |
| 内部的な動作 | docker create + docker start と同等 | メインプロセス(PID 1)とは別のプロセスを起動 |
💡 exit時の挙動が違う理由
docker run -it で起動したシェルはコンテナのメインプロセス(PID 1)です。そのため、exit するとメインプロセスが終了し、コンテナごと停止します。一方、docker exec で起動したシェルはメインプロセスとは別の追加プロセスです。exit してもPID 1には影響しないため、コンテナは動き続けます。
docker run の使い方と実行例
docker run は、Dockerイメージからコンテナを新しく作成して起動するコマンドです。
基本構文
docker run [オプション] イメージ名 [コマンド]
実行例1:Ubuntuコンテナを作って対話シェルに入る
docker run -it ubuntu bash
このコマンドでは以下のことが起きます。
ubuntuイメージから新しいコンテナが作成される- コンテナが起動し、
bashがメインプロセス(PID 1)として実行される -itオプションにより、対話的にシェルを操作できる
exit と入力すると bash が終了し、コンテナも停止します。
docker run -it の詳しい解説はこちらの記事をご覧ください。
実行例2:コンテナをバックグラウンドで起動する
docker run -d --name my-nginx nginx
-d オプションを使うと、コンテナがバックグラウンド(デタッチモード)で起動します。Webサーバーやデータベースなど、常時起動しておきたいコンテナでよく使います。
docker run -d について詳しくはこちらの記事で解説しています。
docker exec の使い方と実行例
docker exec は、すでに実行中のコンテナの中でコマンドを実行するためのコマンドです。
基本構文
docker exec [オプション] コンテナ名 コマンド
実行例1:実行中のコンテナに入る
# まずコンテナをバックグラウンドで起動
docker run -d --name my-ubuntu ubuntu sleep infinity
# 実行中のコンテナに入る
docker exec -it my-ubuntu bash
このとき、docker exec で起動した bash はメインプロセス(sleep infinity)とは別のプロセスです。exit しても sleep infinity は動き続けるため、コンテナは停止しません。
実行例2:コンテナ内でコマンドだけ実行する
# コンテナ内のファイル一覧を確認
docker exec my-ubuntu ls /var/log
# コンテナ内の環境変数を確認
docker exec my-ubuntu env
対話シェルに入らなくても、コマンドの結果だけを取得できます。ログの確認や設定ファイルのチェックなどに便利です。
初心者がよくする間違い
間違い1:停止中のコンテナに docker exec しようとする
$ docker exec -it my-container bash
Error response from daemon: container xxxxxxx is not running
docker exec は実行中のコンテナにしか使えません。停止中のコンテナに対して実行するとエラーになります。
この場合は、先に docker start でコンテナを起動してから docker exec を実行してください。
# コンテナを起動してから exec する
docker start my-container
docker exec -it my-container bash
⚠️ OCI runtime exec failed エラーが出る場合
「OCI runtime exec failed」というエラーが出る場合は、コンテナの状態以外にも原因がある可能性があります。詳しくはOCI runtime exec failed エラーの対処法をご覧ください。
間違い2:同じコンテナを使いたいのに docker run してしまう
「さっき作ったコンテナの中を見たい」と思って docker run を実行すると、まったく新しいコンテナが作られてしまいます。以前のコンテナに入れたデータや設定は、新しいコンテナには存在しません。
# ❌ これは新しいコンテナが作られてしまう
docker run -it ubuntu bash
# ✅ 既存のコンテナに入りたいなら exec を使う
docker exec -it my-ubuntu bash
docker run を繰り返すと、不要なコンテナがどんどん増えていきます。docker ps -a で一覧を確認して、不要なものは削除しましょう。
コンテナがすぐに終了(Exited)してしまう場合は、コンテナがすぐ終了する原因と対処法も参考にしてください。
使い分けフローチャート
迷ったときは、以下の流れで判断してください。
新しい環境が必要?
├─ はい → docker run(イメージからコンテナを新規作成)
│
└─ いいえ(既存のコンテナを使いたい)
│
コンテナは動いている?
├─ はい → docker exec(コンテナに入る)
│
└─ いいえ → docker start → docker exec
ポイントは「新しいコンテナが必要かどうか」です。既存のコンテナを使いたいなら docker exec、新しく作りたいなら docker run を使いましょう。
Dockerの主要コマンドを一覧で確認したい方は、Docker主要コマンドまとめもあわせてご覧ください。
まとめ
この記事では、docker run と docker exec の違いを解説しました。
- docker run:イメージから新しいコンテナを作成して起動する。
exitするとコンテナが停止する - docker exec:実行中のコンテナ内で追加のコマンドを実行する。
exitしてもコンテナは動き続ける - 停止中のコンテナに
docker execはできない。docker startしてから使う - 既存のコンテナに入りたいのに
docker runを使うと、新しいコンテナが作られてしまう
この2つの違いをしっかり理解しておくと、Dockerの操作で迷うことがぐっと減ります。ぜひ実際に手を動かして、動作の違いを確認してみてください。



コメント