個人的備忘録：Dockerユーザーなら知っておきたい「docker exec」の実用テクニックをまとめて実際に使ってみた

## はじめに
`docker exec` は、実行中のコンテナ内でコマンドを実行できる便利なコマンドです。

コンテナのシェルに入ったり、特定のスクリプトを実行したりする際に役立ちます。

:::note info
**コンテナを再起動せずにデバッグや設定変更ができるため、開発や運用の効率が向上します。**
:::

本記事では、`docker exec` の基本的な使い方やオプションについて解説します。

## 書こうと思ったきっかけ
Docker を使用していると、実行中のコンテナ内でコマンドを実行したい場面が多々あります。

:::note warn
***例えば、ログを確認したり、設定ファイルを編集したりする際に、簡単にコンテナへアクセスできる方法が必要です。***
:::

`docker exec` はそのような場面で役立つため、基本的な使い方をまとめることにしました。

## Docker exec とは？
`docker exec` コマンドは、**すでに実行中のコンテナ内でコマンドを実行する**ためのコマンドです。

https://qiita.com/yosisa/items/a5670e4da3ff22e9411a

***コンテナのシェルに入る、特定のスクリプトを実行するなどの用途で使用されます。***

このコマンドを利用することで、コンテナを再起動せずに設定の変更やデバッグを行うことができます。

## 基本構文
```sh
docker exec [オプション] コンテナ名(またはID) コマンド
```

**よく使うオプション**
| オプション | 説明 |
|-----------|------|
| `-it`     | インタラクティブモード（標準入力を開く + TTYを有効化） |
| `-d`      | デタッチモード（バックグラウンド実行） |
| `-u ユーザー名` | 特定のユーザーで実行する |

## 使用例

### **1. コンテナ内のシェルに入る**
```sh
docker exec -it my_container /bin/sh
```

**実際のコマンド画面**

![Screenshot 2025-02-13 at 9.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/94306179-5801-4179-8960-793caaa176d2.png)

または、コンテナがUbuntuやDebianベースなら
```sh
docker exec -it my_container /bin/bash
```

**実際のコマンド画面**

![Screenshot 2025-02-13 at 9.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b6b51ad8-9dda-4905-be64-66722f3ed41f.png)

→ `my_container` のシェルを開き、対話的に操作できるようになります。

### **2. コンテナ内で特定のコマンドを実行**
```sh
docker exec my_container ls -l
```

**実際のコマンド画面**

![Screenshot 2025-02-13 at 9.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/90190c7e-e78f-428a-b731-5f8d8ef7291b.png)

→ `my_container` 内で `ls -l` を実行し、結果をホスト側に出力します。

### **3. コンテナ内のファイルを確認**
```sh
docker exec my_container cat /etc/os-release
```

**実際のコマンド画面**

![Screenshot 2025-02-13 at 9.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ddcdd102-df6b-4c06-b0af-53e7bc5edf23.png)

→ `my_container` 内の `/etc/os-release` を表示し、OSの情報を確認できます。

### **4. `root` ユーザーでコマンドを実行**
```sh
docker exec -u root -it my_container bash
```

**実際のコマンド画面**

![Screenshot 2025-02-13 at 9.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2ba794cb-5422-4e41-a58e-fed7ac9837af.png)

→ root権限でコンテナ内のシェルを開きます。

### **5. バックグラウンドで実行**
```sh
docker exec -d my_container touch /tmp/testfile
```
→ `my_container` 内で `/tmp/testfile` を作成し、バックグラウンドで実行。

### **6. 環境変数を設定してコマンドを実行**
```sh
docker exec -e MY_VAR=value my_container env
```
→ `MY_VAR=value` を環境変数として設定し、コンテナ内で `env` コマンドを実行。

## 注意点

1. **コンテナが起動している必要がある**  
   `docker exec` は **すでに実行中のコンテナ** に対してコマンドを実行するため、停止中のコンテナには使えません。停止中のコンテナに対して実行したい場合は、`docker start` で起動する必要があります。

2. **対話型シェルを開く場合は `-it` を忘れずに**  
   `-it` をつけないと、シェルの入力がうまく動作しないことがあります。

3. **コンテナの `ENTRYPOINT` や `CMD` に影響を与えない**  
   `docker exec` で実行したコマンドは、コンテナの `ENTRYPOINT` や `CMD` とは無関係に動作します。

## 関連コマンド
| コマンド | 用途 |
|---------|------|
| `docker ps` | 実行中のコンテナ一覧を表示 |
| `docker inspect <コンテナ名>` | コンテナの詳細情報を取得 |
| `docker logs <コンテナ名>` | コンテナのログを表示 |
| `docker attach <コンテナ名>` | 実行中のコンテナにアタッチ |
| `docker start <コンテナ名>` | 停止しているコンテナを起動 |
| `docker stop <コンテナ名>` | コンテナを停止 |

## まとめ
- `docker exec` は**実行中のコンテナ内でコマンドを実行**するために使う
- `-it` オプションを付けると、対話的にシェルを操作できる
- `-u root` で特定のユーザーとして実行可能
- `-e` オプションを使うと環境変数を指定できる
- **コンテナが起動中でないと使えない**

実際に試して、コンテナの操作をスムーズに行いましょう！