Docker コマンドをまとめる 🐳

## はじめに

忘れっぽいお茶目な自分のためにメモ ✍️

ちなみに私はこの本で Docker をお勉強しました。
とりあえず Docker 使えるようになりたいぜって人におすすめ

https://www.amazon.co.jp/Docker-%E4%BB%AE%E6%83%B3%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-Web%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%82%BF%E3%83%BC%EF%BC%86%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E4%BD%9C%E6%A5%AD%E3%81%8C%E3%81%AF%E3%81%8B%E3%81%A9%E3%82%8B%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%AA%E3%83%96%E3%83%AD%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9/dp/4295015318

当時は Kindle で無料だった気がするのですが、今は unlimited 会員なら無料になってますね。

## 基本公式

```bash
docker 対象 操作
```

## 具体例

### 1. `container` 系

`run`, `start`, `stop`, `rm` など

Docker Compose 使うからあまり使わない（主観）

#### コンテナを作って起動する

コンテナを作成し、同時に起動する。

`httpd` イメージから `apache01` という名前のコンテナを作り、バックグラウンドで実行する。ホストの 8080 番ポートをコンテナの 80 番ポートにマッピング（ポートフォワーディング）する。

```bash
docker container run --name apache01 -p 8080:80 -d httpd
```

| オプション | 意味                       |
| ---------- | -------------------------- |
| `--name`   | コンテナに名前をつける     |
| `-p`       | ポート番号を指定する       |
| `-d`       | バックグラウンドで実行する |

#### コンテナを停止する

`apache01` という名前のコンテナを停止する。

```bash
docker container stop apache01
```

#### コンテナを起動する

`run` で作成済みのコンテナを起動する。

`apache01` という名前のコンテナを起動する。

```bash
docker container start apache01
```

#### コンテナを削除する

`apache01` という名前のコンテナを削除する。

```bash
docker container rm apache01
```

#### コンテナ一覧を表示する

実行中のコンテナ一覧を表示する。

```bash
docker container ls
```

停止中のコンテナも含めて全部見たいときは

```bash
docker container ls -a
```

### 2. `compose` 系

`up`, `run`, `start`, `stop`, `down` など

#### イメージのビルド

イメージのビルドだけして、コンテナの実行はしない。

```bash
docker compose build
```

キャッシュを使わずにイメージをビルドしたかったら

```bash
docker compose build --no-cache
```

#### コンテナを作って実行する

コンテナを作成し、実行する。
イメージがなかったらビルドもしてくれる。

`-d` オプションを使うとバックグラウンドで実行する。

```bash
docker compose up -d
```

イメージのビルドもしたかったら

```bash
docker compose up -d --build
```

#### コンテナを停止する

```bash
docker compose stop
```

#### コンテナを起動する

`up` で作成済みのコンテナを起動する。

```bash
docker compose start
```

#### コンテナを停止して削除する

```bash
docker compose down
```

イメージも削除したかったら

```bash
docker compose down --rmi all
```

ボリュームも削除したかったら

```bash
docker compose down -v
```

:::note
`rm` でもコンテナを削除できる。`-s` オプションを使うと停止もできる。
しかし、紐づくネットワークを削除しない。
:::

#### コンテナ一覧を表示する

Compose プロジェクトの実行中のコンテナ一覧を表示する。

```bash
docker compose ps
```

停止中のコンテナも含めて全部見たいときは

```bash
docker compose ps -a
```

#### コンテナのログを出力する

`container01` という名前のコンテナのログを出力する。

`-f` オプションでログを出力し続ける。

```bash
docker compose logs -f container01
```

#### コンテナ内でコマンドを実行する

`container01` という名前のコンテナ内で `bash` を立ち上げる。

```bash
docker compose exec container01 bash
```

#### ホストとコンテナでファイルをやりとりする

##### コンテナ → ホスト

`container01` コンテナの `path/to/file` をホストのカレントディレクトリにコピーする。

```bash
docker compose cp container01:path/to/file .
```

##### ホスト → コンテナ

ホストの `file` を `container01` コンテナの `path/to/file` にコピーする。

```bash
docker compose cp file container01:path/to/file
```

### 3. `image` 系

`build`, `ls`, `pull`, `push`, `rm` など

#### イメージをビルドする

カレントディレクトリの Dockerfile からイメージをビルドする。

```bash
docker image build .
```

#### イメージの一覧を表示する

```bash
docker image ls
```

#### イメージを削除する

`image01` という名前のイメージを削除する。

```bash
docker image rm image01
```

`rmi` というエイリアスもある。

```bash
docker rmi image01
```

`docker compose down --rmi all` で削除することも多い。

#### 未使用のイメージを一括削除

```bash
docker image prune
```

### 4. `network` 系

`create`, `ls`, `rm` など

compose.yaml で作って（定義して）、`docker compose down` で削除することが多いため、`create`, `rm` はあまり使わない印象 🤔

#### ネットワークの一覧を表示する

```bash
docker network ls
```

#### 未使用のネットワークを一括削除

```bash
docker network prune
```

### 5. `volume` 系

`create`, `ls`, `rm` など

compose.yaml で作る（定義する）ことが多いため、`create` はあまり使わない印象 🤔

#### ボリュームの一覧を表示する

```bash
docker volume ls
```

#### ボリュームを削除する

`volume01` という名前のボリュームを削除する。

```bash
docker volume rm volume01
```

`docker compose down -v` で削除することも多い。

:::note
バインドマウントは、コンテナ内 or ホストから直接削除する。
`docker compose down -v` でも削除できる。
:::

#### 未使用のボリュームを一括削除

```bash
docker volume prune
```

## おわりに

Docker のコマンドはたくさんあって混乱しがち。
サブコマンドが導入される前のものも含めると...😵‍💫

個人的によく使うものは網羅したつもりなので、困ったらここを見にくる。