初心者エンジニア必見！Dockerコマンドチートシート&トラブルシューティング&ベストプラクティス

# はじめに

Dockerは、ソフトウェア開発や運用において、アプリケーションの環境を迅速かつ効率的に整えるためのツールとして、近年多くのエンジニアに活用されています。

Dockerコマンド自体は多くのサイトにてまとめられていますが、ここでは使用率が高そうなコマンドを一挙紹介します。なるべくこの記事だけで完結するように、コンパクトにまとめました。
また、初心者が陥りがちなエラーもリストアップし、トラブルシューティングも載せています。
さらに、初心者が行うべきベストプラクティスもまとめました。ぜひ参考にしてみてください！

:::note info
弊社Nucoでは、他にも様々なお役立ち記事を公開しています。よかったら、Organizationのページも覗いてみてください。
また、Nucoでは一緒に働く仲間も募集しています！興味をお持ちいただける方は、[こちら](https://www.wantedly.com/companies/company_8285417)まで。
:::

https://recruit.nuco.co.jp/?qiita_item_id=%5Bid%5D

# Dockerとは

![Docker](https://www.docker.com/ja-jp/wp-content/uploads/2023/08/logo-guide-logos-1.svg "Docker")

Dockerは、ソフトウェアの開発からデプロイまでを効率化するためのコンテナ技術をベースにしたプラットフォームです。
従来の仮想マシンとは異なり、軽量で高速な動作が特徴であり、アプリケーションとその依存関係を一つのパッケージにまとめ、どの環境でも一貫した動作を実現します。

## コンテナ

コンテナは、アプリケーションの実行に必要なライブラリや設定ファイルなどの環境を一つにまとめたパッケージです。これにより、開発環境やテスト環境、本番環境など異なる環境でも同じ挙動を保証できます。
また、コンテナはホストOSのカーネルを共有するため、従来の仮想マシンに比べてオーバーヘッドが少なく、起動や停止が非常に高速です。

## 利点

+ 軽量で高速: 仮想マシンに比べ、リソースの消費が少なく起動時間も短い
+ 環境の一貫性: 開発、テスト、本番など異なる環境間でも一貫した動作を保証
+ 移植性: 一度作成したDockerイメージを、どのプラットフォームでも再現可能
+ スケーラビリティ: 複数のコンテナを組み合わせて、複雑なアプリケーションも容易にスケールアップ・スケールダウンできる
+ コミュニティとエコシステム: Docker Hubなどのリポジトリを活用し、公開されているイメージを簡単に取得して利用可能

このように、Dockerはソフトウェア開発と運用における**環境の一貫性**や**効率性**を高めるツールとして、モダンな開発フローに欠かせない存在となっています。
これから紹介するチートシートでは、Dockerを使いこなすための基本コマンドや操作方法をコンパクトにまとめていますので、ぜひ参考にしてください。

# Dockerコマンドチートシート

## 主要コマンド
### Docker起動
~~~ python
  systemctl start docker  # Linux
  open -a Docker  # macOS
~~~
#### 役割
Dockerデーモン（Dockerサービス）を起動するコマンドです。LinuxやmacOSでは、Dockerはバックグラウンドで動作するため、このサービスを起動しないとDockerコマンドを使うことができないです。

#### 使用するシチュエーション
サーバーやPCの起動直後、Dockerデーモンがまだ動いていない場合に使用します。例えば、新しくコンテナを作成しようとした際にエラーが発生し、
~~~ python
  Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
~~~
と表示される場合は、Dockerが起動していない可能性があります。この場合、まずデーモンを手動で起動する必要があります。


### Dockerのバージョン確認
~~~ python
  docker version
~~~

#### 役割
インストールされているDockerのバージョン（クライアントとサーバー両方）を確認するためのコマンドです。クライアントはユーザーが使うコマンドラインインターフェース、サーバーはDockerデーモンのバージョンを示します。

#### 使用するシチュエーション
Dockerを初めてインストールした際、または既存の環境が最新バージョンかどうかを確認したいときに使用します。例えば、特定の機能やオプションが動作しない場合、バージョンが古い可能性があります。Dockerのバージョンに依存する機能を使用する場合には、まずこのコマンドでバージョン確認を行います。


### Dockerデーモンのシステム情報を確認

~~~ python
  docker info
~~~

#### 役割
Dockerの全体的なステータスを確認するコマンドです。Dockerデーモンがどのように設定されているか（使用しているストレージドライバ、ネットワーク情報、コンテナの総数など）が詳細に表示されます。

#### 使用するシチュエーション
Docker環境が正しく構成されているか、またはリソースの使用状況を確認したいときに使用します。特に、複数のコンテナやイメージが**どれくらいシステムリソースを消費しているのか**を把握したい場合に有効です。問題が発生した際に、システム全体のリソース状態を確認するために使用することもあります。


## コンテナの操作
### 稼働中のコンテナ 一覧表示
~~~ python
  docker ps
~~~

#### 役割
現在稼働中のコンテナを一覧表示するコマンド。各コンテナのID、名前、稼働時間、公開されているポートなどの情報が確認できます。

#### 使用するシチュエーション
稼働中のコンテナがどのくらい動いているのか、どのポートを使用しているのかを確認したいときに使用します。複数のコンテナを同時に稼働させている場合に、各コンテナのステータスやIDを調べるのに便利です。
コンテナが起動していない場合は、一覧に何も表示されません。その際は次に紹介するコマンドを使用しましょう。

### 停止中のコンテナも含めた全てを表示

~~~ python
  docker ps -a
~~~

#### 役割
稼働中、停止中、すべてのコンテナを一覧表示するコマンドです。過去に実行されたコンテナや終了したコンテナの状態を確認できます。

#### 使用するシチュエーション
停止したコンテナやエラーで終了したコンテナのログやステータスを確認する際に使用します。コンテナが起動していない場合、**原因を特定するためにまずこのコマンドで全てのコンテナをリストアップ**します。

### コンテナを作成・実行

~~~ python
  docker run <イメージの名前>
~~~

#### 役割
指定したイメージを基に、新しいコンテナを作成して実行するコマンドです。イメージを指定するだけで、すぐにコンテナを起動できます。

#### 使用するシチュエーション
Docker Hubから取得したイメージを基に、簡単なテストを行いたいときに使用します。例えば、`docker run nginx` とすると、Nginxのデフォルト設定でWebサーバーが起動します。
イメージが存在しない場合は `Unable to find image` が表示されます。イメージがローカルにない場合は、自動的にDocker Hubからプル（ダウンロード）されます。

### コンテナをバックグラウンドで実行

~~~ python
  docker run -d <イメージの名前>
~~~

#### 役割
コンテナをバックグラウンドで（detachedモードで）実行します。ターミナルを占有せずにコンテナを実行し続けたい場合に使います。

#### 使用するシチュエーション
 Webサーバーやデータベースなど、**長時間実行し続けるアプリケーションをバックグラウンドで動かしたいとき**に使用します。例えば、`docker run -d nginx` とすれば、Nginxサーバーがバックグラウンドで起動します。

### ホストのIPをコンテナのIPとマッピングしながらコンテナを実行

~~~ python
  docker run -p <ホストポート>:<コンテナポート> <イメージの名前>
~~~

#### 役割
ホストマシンの特定のポートを、コンテナ内のポートにマッピングします。これにより、ホストマシンのIPアドレスを使ってコンテナ内のアプリケーションにアクセスできます。

#### 使用するシチュエーション
WebサーバーやAPIサーバーを起動して、外部からアクセスできるようにしたいときに使用します。例えば、`docker run -p 8080:80 nginx` とすれば、ホストのポート8080でNginxにアクセスできます。

`port is already allocated`と表示される場合は、指定したホストポートがすでに別のプロセスで使用されてしまっているため、別のポート番号を指定するか、該当するプロセスを停止しましょう。


### コンテナを停止

~~~ python
  docker stop <コンテナID>
~~~

#### 役割
実行中のコンテナを安全に停止させます。停止したコンテナは`docker start`コマンドで再起動できます。

#### 使用するシチュエーション
コンテナが不要になったり、リソースを解放したいときにコンテナを停止します。例えば、テスト環境のWebサーバーを停止する際に使用します。

### 停止したコンテナを開始

~~~ python
  docker start <コンテナID>
~~~

#### 役割
停止したコンテナを再び起動します。すでに作成済みのコンテナを再利用できるため、**新たにコンテナを作成するよりも高速**です。

#### 使用するシチュエーション
開発中のアプリケーションが停止してしまった場合や、一時的に停止したコンテナを再起動したいときに使用します。

### 停止したコンテナを削除

~~~ python
  docker rm <コンテナID>
~~~

#### 役割
停止したコンテナを完全に削除します。コンテナを削除することで、**ディスクスペースを解放**できます。実行中のコンテナは削除できないため、事前に停止する必要があります。

#### 使用するシチュエーション
もう使わないコンテナを整理したい場合や、ディスク容量を確保するために不要なコンテナを削除したいときに使用します。

### コンテナを再起動

~~~ python
  docker restart <コンテナID>
~~~

#### 役割
実行中のコンテナを一度停止し、すぐに再起動します。停止から起動までの一連の操作をワンコマンドで行うため、**アプリケーションのリフレッシュや環境の再設定に便利**です。

#### 使用するシチュエーション
コンテナ内のアプリケーションが一時的に不安定になったときや、設定変更を反映させたい場合に使用します。

## イメージ
### イメージの一覧表示

~~~ python
  docker images
~~~

#### 役割
ローカルに保存されているすべてのDockerイメージの一覧を表示します。イメージの名前、タグ、イメージID、作成日時、サイズが確認できます。

#### 使用するシチュエーション
どのイメージがローカルに存在するかを確認したいときに使用します。特に、複数のバージョンやタグが存在する場合、正しいイメージを選ぶのに役立ちます。

### Docker Hubからイメージを検索

~~~ python
  docker search <イメージの名前>
~~~

#### 役割
Docker Hubで指定した名前のイメージを検索します。検索結果には、関連するイメージのリストが表示され、それぞれのスター数や説明も確認できます。

#### 使用するシチュエーション
特定のアプリケーションやサービス（例えば、nginx や mysql）の公式イメージやカスタムイメージを探したいときに使用します。どのイメージを使用するか**選ぶ際の参考に**します。


### Docker Hubからイメージをダウンロード（pull）

~~~ python
  docker pull <イメージの名前>
~~~

#### 役割
Docker Hubから指定したイメージをダウンロード（プル）します。イメージはローカルに保存され、以後はそのイメージを使ってコンテナを作成できます。

#### 使用するシチュエーション
初めて使用するイメージや、ローカルに存在しない最新のイメージを取得したいときに使用します。例えば、`docker pull nginx` でNginxの最新イメージを取得します。
エラーとして
~~~ python
  Error response from daemon: pull access denied for <イメージ名>
~~~
が表示された場合は、イメージ名が正しいか、アクセスが可能かを確認し、プライベートリポジトリの場合は認証が必要となることを理解しておきましょう。

### Dockerfileからイメージを作成

~~~ python
  docker build -t <イメージの名前> .
~~~

#### 役割
Dockerfileからカスタムイメージをビルドします。指定した設定に従って、アプリケーションやサービスが動作するための環境を作成し、その環境をイメージとして保存します。

#### 使用するシチュエーション
アプリケーションの依存関係や設定をDockerfileで定義し、独自のカスタムイメージを作成したいときに使用します。例えば、独自のアプリケーションをコンテナで動作させるためのカスタム環境を構築する際に役立ちます。

~~~ python
  failed to solve with frontend dockerfile.v0: failed to build LLB
~~~
と表示された場合は、Dockerfileの文法やパスが正しいか、また依存関係が正しく設定されているか確認しましょう。

### イメージにタグ付け

~~~ python
  docker tag <イメージID> <新しいイメージの名前>:<タグ>
~~~

#### 役割
既存のイメージに新しい名前とタグを付けるコマンドです。これにより、同じイメージでも異なるバージョンや環境に対応した管理が可能になります。

#### 使用するシチュエーション
ローカルでビルドしたイメージに新しい名前やバージョンタグを付けて整理したいときに使用します。例えば、アプリケーションのステージング環境や本番環境ごとに異なるタグを付ける場合に便利です。

### イメージを削除

~~~ python
  docker rmi <イメージID>
~~~

#### 役割
指定したイメージをローカルから削除します。不要になったイメージを削除することで、ディスクスペースを節約できます。

#### 使用するシチュエーション
もう使用しないイメージや、ディスクスペースを解放したい場合に使用します。ただし、そのイメージを使用しているコンテナが存在する場合、**まずそのコンテナを削除する必要**があります。

~~~ python
  conflict: unable to delete <イメージID> (cannot be forced)
~~~
とエラーが表示された場合は、イメージが実行中のコンテナに関連付けられているかを確認し、まずそのコンテナを停止して削除します。その後再度`docker rmi`を実行しましょう。


## コンテナの管理
### コンテナのログを表示

~~~ python
  docker logs <コンテナID>
~~~

#### 役割
指定したコンテナのログを表示するコマンドです。アプリケーションが出力する標準出力（`stdout`）や標準エラー（`stderr`）の内容を確認できます。

#### 使用するシチュエーション
コンテナ内のアプリケーションが正しく動作しているか、エラーが発生していないかを確認したいときに使用します。特に、起動時の問題やアプリケーションのクラッシュの原因を特定するのに役立ちます。

ログが空で何も表示されない場合、**アプリケーションがログを出力していない可能性**があります。その場合はアプリケーションが正しく起動しているか、設定ファイルでログの出力が有効になっているかを確認してください。

### コンテナのログをリアルタイムでフォロー

~~~ python
  docker logs -f <コンテナID>
~~~

#### 役割
指定したコンテナのログをリアルタイムで追跡します。コンテナ内で新しく発生したログが逐次表示されます。

#### 使用するシチュエーション
アプリケーションの動作をリアルタイムで監視したいときに使用します。デプロイ直後や新しいリクエストが来たときに、エラーや異常が発生していないか確認するのに便利です。

リアルタイムで表示されない場合は、コンテナが停止しているか、ログの出力がない可能性があるため、`docker ps` でコンテナが実行中か確認し、アプリケーションが動作しているかも確認してみましょう。

### 実行中のコンテナに接続

~~~ python
  docker exec -it <コンテナID> /bin/bash
~~~

#### 役割
実行中のコンテナにシェル（通常は`bash`）を介して接続し、コンテナ内部にアクセスするコマンドです。コンテナ内で直接操作が可能です。

#### 使用するシチュエーション
コンテナ内のファイルを確認したり、手動でコマンドを実行したいときに使用します。たとえば、アプリケーションの設定ファイルを直接編集したり、コンテナ内部のログファイルを確認する場合に役立ちます。

`executable file not found`が表示される場合、`/bin/bash` がコンテナ内に存在しない可能性があります。その場合は、`/bin/sh` など他のシェルを試すか、対象のコンテナに適切なシェルがインストールされているか確認します。

### コンテナからホストへコピー

~~~ python
  docker cp <コンテナID>:<コンテナ内のパス> <ホスト側のパス>
~~~

#### 役割
コンテナ内のファイルやディレクトリをホストマシンにコピーするコマンドです。これにより、コンテナ内のデータを簡単に取得できます。

#### 使用するシチュエーション
コンテナ内のログファイルや設定ファイルをホストに保存したいときや、データをバックアップしたいときに使用します。例えば、アプリケーションが生成した結果ファイルや、コンテナ内で手動で生成したファイルを取得したいときに便利です。

もしパスが見つからない場合は、指定したコンテナ内のパスが間違っている可能性があります。その場合は `docker exec` を使ってコンテナ内の正確なパスを確認し、再度コピーコマンドを実行する必要があります。

## Dockerネットワーク
### ネットワークの一覧表示

~~~ python
  docker network ls
~~~

#### 役割
ローカルに存在するすべてのDockerネットワークを一覧表示します。各ネットワークの名前、ID、ドライバ（bridge、hostなど）などの情報が確認できます。

#### 使用するシチュエーション
現在どのネットワークが存在するか、コンテナがどのネットワークに接続されているかを確認したいときに使用します。特に、**複数のコンテナを連携させて動かしている場合**、ネットワーク設定を確認する際に便利です。

ネットワークがリストに表示されない場合、特定のネットワークが作成されていないか、コンテナが起動していない可能性があります。必要に応じて、`docker network create` を使用して新しいネットワークを作成しましょう。

### ネットワークの作成

~~~ python
  docker network create <ネットワークの名前>
~~~

#### 役割
指定した名前で新しいDockerネットワークを作成します。デフォルトでは、`bridge` ドライバが使用されますが、他のドライバ（`host`、`overlay` など）も選択可能です。

#### 使用するシチュエーション
複数のコンテナが同じネットワーク内で通信できるように、カスタムネットワークを作成する際に使用します。例えば、Webサーバーとデータベースコンテナを同じネットワークに配置し、外部からのアクセスを制限しつつコンテナ間の通信を確保する場合に便利です。

ここでネットワーク名が重複していた場合、エラーが発生します。他のネットワークと重複しないユニークな名前を指定するか、`docker network ls` で既存のネットワーク名を確認しましょう。

### ネットワークにコンテナを接続

~~~ python
  docker network connect <ネットワークの名前> <コンテナID>
~~~

#### 役割
既存のネットワークに、指定したコンテナを接続するコマンドです。これにより、複数のコンテナが同じネットワークを介して通信できるようになります。

#### 使用するシチュエーション
新しく起動したコンテナを、すでに存在するネットワークに追加したいときに使用します。例えば、追加のWebサーバーコンテナを既存のデータベースネットワークに接続して、スケールアップを図る場合に便利です。

ネットワークまたはコンテナが存在しない場合、`No such network` や `No such container` といったエラーが発生します。解決策としては、 `docker network ls` や `docker ps -a` を使って、指定したネットワークやコンテナが存在するか確認するものがあります。

## Docker Compose
### Docker Composeでコンテナをバックグラウンドで作成・起動

~~~ python
  docker-compose up -d
~~~

#### 役割
`docker-compose.yml` ファイルで定義された複数のサービス（コンテナ）を一括でバックグラウンド（デタッチドモード）で起動します。**ターミナルを占有せずにコンテナが動作**します。

#### 使用するシチュエーション
複数のコンテナ（例：Webサーバーとデータベース）を同時に起動し、それぞれをバックグラウンドで動作させたいときに使用します。例えば、`docker-compose.yml` で定義されたアプリケーションを実行するための環境を一括でセットアップし、バックグラウンドで実行させる際に便利です。

依存するサービスが正しく起動できない場合、関連するコンテナがすぐに停止してしまうことがあります。`docker-compose logs` でログを確認し、問題の原因となっているサービスや設定を特定しましょう。

### Docker Composeでコンテナを停止

~~~ python
  docker-compose down
~~~

#### 役割
`docker-compose.yml` で定義されたすべてのサービス（コンテナ）を停止し、ネットワークやボリュームなどの関連リソースを削除します。

#### 使用するシチュエーション
全てのサービスを停止し、関連するリソースも完全にクリーンアップしたいときに使用します。テスト環境や一時的に使用する開発環境を停止して、リソースを解放する際に便利です。

### Docker Composeでコンテナ開始前にイメージを構築

~~~ python
  docker-compose up --build
~~~

#### 役割
`docker-compose.yml` ファイルに基づいて、コンテナを開始する前に関連するイメージを再ビルドします。これにより、コードや設定の変更を反映した新しいイメージが作成され、最新の環境でコンテナが実行されます。

#### 使用するシチュエーション
アプリケーションのコードや設定ファイルを変更した後、その変更を反映させてコンテナを起動したいときに使用します。例えば、アプリケーションの依存関係を追加したり、環境設定を変更した場合に、再ビルドして変更を反映します。

もしビルドエラーが発生する場合、`Dockerfile` や依存パッケージの設定が正しくない可能性があります。`Dockerfile` や `docker-compose.yml` の記述を確認し、必要な依存関係が正しく設定されているかチェックしてみましょう。

### Docker Composeで特定のサービスのみ再起動

~~~ python
  docker-compose restart <サービスの名前>
~~~

#### 役割
`docker-compose.yml` で定義されたサービスのうち、指定したサービス（コンテナ）を再起動します。すべてのサービスを再起動せず、特定のものだけをリフレッシュできます。

#### 使用するシチュエーション
Webサーバーやデータベースなど、特定のサービスだけを再起動したいときに使用します。例えば、アプリケーションサーバーの設定を変更した後、Webサーバーのみ再起動したい場合に便利です。


## 詳細表示
### コンテナの詳細を取得

~~~ python
  docker inspect <コンテナID>
~~~

#### 役割
指定したコンテナの詳細な情報（設定、状態、ネットワーク構成、マウントされているボリュームなど）をJSON形式で出力するコマンドです。コンテナに関するほぼすべてのメタデータが含まれています。

#### 使用するシチュエーション
コンテナの設定や状態を詳細に確認したいときに使用します。例えば、ネットワーク設定やマウントされているディレクトリの確認、特定のコンテナの実行時の設定情報を確認する際に便利です。

### リソース使用統計情報（CPU、メモリなど）を取得

~~~ python
  docker stats
~~~

#### 役割
現在稼働中のコンテナのリソース使用状況（CPU使用率、メモリ使用量、ネットワークI/O、ディスクI/Oなど）をリアルタイムで表示します。各コンテナのリソース消費を監視できます。

#### 使用するシチュエーション
コンテナのパフォーマンスを監視したいときや、リソースが不足しているか確認する際に使用します。特に、複数のコンテナが同時に稼働している場合、**各コンテナのリソース消費をチェックして問題が発生していないか確認**するために便利です。

## ボリューム
### ボリュームの一覧表示

~~~ python
  docker volume ls
~~~

#### 役割
Dockerで作成されたすべてのボリュームを一覧表示します。ボリュームはコンテナ間でデータを共有したり、コンテナが削除されてもデータを永続化するために使用されます。

#### 使用するシチュエーション
どのボリュームが現在存在しているか、または使用中かを確認したいときに使用します。特に、特定のボリュームを削除したいときや、複数のコンテナで共有されているボリュームを確認する場合に便利です。

一覧に何も表示されない場合は、新しいボリュームを次のコマンドで作成しましょう。

### ボリュームの作成

~~~ python
  docker volume create <ボリュームの名前>
~~~

#### 役割
新しいボリュームを作成し、データの永続化やコンテナ間でデータを共有するために利用します。ボリュームはDockerが自動で管理し、ホストマシン上にデータを保存します。

#### 使用するシチュエーション
データベースのデータや設定ファイルなど、コンテナが停止または削除されても保持しておきたいデータを保存するためにボリュームを作成します。たとえば、MySQLコンテナのデータを永続化するために `docker volume create` でボリュームを作成します。

### `docker run`中にボリュームをコンテナに接続する

~~~ python
  docker run -v <ボリュームの名前>:<コンテナ内のパス> <イメージの名前>
~~~

#### 役割
コンテナを起動するときに、指定したボリュームをコンテナ内の特定のディレクトリにマウントします。これにより、コンテナが読み書きするデータをボリュームに保存することができます。

#### 使用するシチュエーション
例えば、MySQLなどのデータベースコンテナで、データを永続化したいときに使用します。
~~~ python
  docker run -v my_volume:/var/lib/mysql mysql
~~~
のように、データベースのデータをホスト上に保存し、コンテナが削除されてもデータが残るようにします。

### ボリュームの削除

~~~ python
  docker volume rm <ボリュームの名前>
~~~

#### 役割
指定したボリュームを削除します。ボリュームが削除されると、そのボリュームに保存されていたデータも削除されます。使用中のボリュームは削除できません。

#### 使用するシチュエーション
もう使用しないボリュームや不要になったデータを削除してディスクスペースを解放したいときに使用します。ただし、使用中のボリュームは`Volume is in use`と表示され、削除できないため、事前にボリュームを使用しているコンテナを停止または削除する必要があります。

## その他便利コマンド

### 未使用のデータを一括削除

~~~ python
  docker system prune
~~~

#### 役割
未使用のコンテナ、停止中のコンテナ、不要なネットワーク、キャッシュなど、使用されていないDockerのデータを一括で削除します。ただし、実行中のコンテナや関連するデータは削除されません。

#### 使用するシチュエーション
長期間使用していないコンテナやネットワークが残っていて、ディスクスペースを圧迫している場合に、**システム全体のクリーンアップを行いたいとき**に使用します。特に、開発中に頻繁にコンテナやイメージを作成・削除する場合、不要なデータがたまってしまうことがあります。

### 未使用のイメージ、コンテナ、ボリューム、ネットワークを一括削除

~~~ python
  docker system prune -a
~~~

#### 役割
未使用のイメージ、コンテナ、ボリューム、ネットワークを一括で削除するコマンドです。`-a` オプションを付けることで、使用されていない全てのイメージやボリュームも削除されます。

#### 使用するシチュエーション
不要なイメージやボリュームも含めて、システム全体を徹底的にクリーンアップしたいときに使用します。特に、開発やテストで大量のイメージやボリュームを作成している場合、ディスクスペースを一気に解放するのに便利です。

### 起動中の全てのコンテナを停止

~~~ python
  docker stop $(docker ps -q)
~~~

#### 役割
現在起動中のすべてのコンテナを一括で停止します。`docker ps -q` で取得したすべてのコンテナIDを使って、それらをまとめて停止します。

#### 使用するシチュエーション
 複数のコンテナが同時に稼働している場合、手動で個別に停止する手間を省くために一括停止したいときに使用します。例えば、開発環境をまとめてシャットダウンする場合に便利です。

コンテナがすでに停止している場合は、特にエラーは発生せずスキップされます。

### 全てのコンテナを一括削除

~~~ python
  docker rm $(docker ps -a -q)
~~~

#### 役割
停止中のコンテナも含めて、すべてのコンテナを一括で削除します。`docker ps -a -q` で取得した全てのコンテナIDを使って、それらをまとめて削除します。

#### 使用するシチュエーション
不要になったすべてのコンテナを一気に削除して、環境を整理したいときに使用します。特に、開発環境で複数のテスト用コンテナがある場合、一括削除することで手間を省けます。

エラーとして、実行中のコンテナが削除できないため発生することもあります。まず `docker stop $(docker ps -q)` で全てのコンテナを停止した後、再度削除コマンドを実行しましょう。

## ここに乗っていないコマンドは

使用率が高いものをここではまとめました。その他のコマンドは以下の公式ドキュメントを参照してみてください。

https://docs.docker.com/reference/

https://docs.docker.jp/engine/reference/index.html

# よくあるトラブルシューティング
ここからはDockerの初心者がよく遭遇するであろうエラーをまとめ、その解決方法をリスト化しました。
これらのトラブルシューティング方法を知っておくことで、問題に対して迅速に対応できるようになります。また、エラーの原因を特定するために役立つコマンドの使い方も紹介していきます。

## コンテナが起動しない
+ エラー例
~~~ python
  docker: Error response from daemon: Cannot start container ...
~~~  
+ 解決方法
    + コンテナが正しく設定されているかを確認（ポートの競合やイメージのバージョンなど）
    + `docker logs <コンテナID>`でログを確認し、エラーメッセージの詳細を確認

## ネットワーク関連のエラー
+ エラー例
~~~ python
  port is already allocated
~~~  
~~~ python
  network bridge not found
~~~
+ 解決方法
    + ホストマシンでポートが既に使用されている場合、他のポートを指定してコンテナを起動
    + `docker ps -a`を使って、どのコンテナが特定のポートを使用しているか確認

## パーミッションエラー
+ エラー例
 `permission denied`によりコンテナやボリュームにアクセスできない
+ 解決方法
    + Dockerコマンドを`sudo`なしで実行したい場合は、ユーザーを docker グループに追加
        ~~~  python
            sudo usermod -aG docker $USER
        ~~~
    + 変更を適用するために、システムを再起動するか、ログアウトと再ログインを行う

## イメージのダウンロードが遅い
+ エラー例
イメージのプル`docker pull`が遅い
+ 解決方法
ミラーサーバーを設定することで、イメージのダウンロード速度を改善することが可能

## ディスクスペースの不足
+ エラー例
~~~ python
  no space left on device
~~~
+ 解決方法
    + 古いイメージや不要なコンテナ、ボリュームを削除
        ~~~ python
          docker system prune -a
        ~~~
    + このコマンドで未使用のイメージ、コンテナ、ネットワーク、ボリュームをすべて一括でクリーンアップ可能

## 問題発見に役立つコマンド
先ほどまとめたチートシートの中から、トラブルシューティングに役立つコマンドのみをまとめます。
+ `docker ps`：現在稼働中のコンテナの一覧を表示
問題が発生したコンテナが実行中かどうかを確認できる
+ `docker ps -a`：停止中のコンテナも含めたすべてのコンテナを一覧表示し、過去に起動していたコンテナの状況を確認できる
+ `docker logs <コンテナID>`：特定のコンテナのログを表示
アプリケーションやコンテナのエラー情報を確認する際非常に有用
+ `docker inspect <コンテナID>`：コンテナの詳細情報（設定、状態、ネットワーク情報など）を取得し、問題の原因を深掘りする際役立つ

Dockerの問題を素早く解決するためには、まずエラーメッセージを正確に読み取り、原因を特定することが重要です。上記のコマンドを活用し、迅速に問題の原因を見つけて対処しましょう。

# Dockerのベストプラクティス
Dockerを効率的に使いこなすためには、Dockerfileの作成方法やコンテナの最適化、セキュリティ対策を意識することが重要です。ここでは、実践で役立つベストプラクティスをいくつか紹介し、安定かつ安全なコンテナ運用をサポートします。

## 効率的なDockerfileの作成方法
Dockerfileを効率的に作成するためのポイントをいくつか挙げます。これにより、ビルドの高速化や、イメージサイズの削減が可能になります。

### キャッシュを活用
Dockerfileの各ステップはキャッシュされます。変更が頻繁に起こる部分はなるべく下部に置くことで、再ビルド時にキャッシュが有効に働き、ビルド時間を短縮できます。
~~~ python
  # 変更が少ない部分は上部に
  FROM node:14
  RUN apt-get update && apt-get install -y build-essential

  # アプリケーションファイルの追加は下部に
  ADD . /app
~~~

### マルチステージビルドを使う
マルチステージビルドは、ビルド環境と実行環境を分けることで、不要なファイルや依存関係を本番イメージに含めず、最終的なイメージサイズを小さくできます。
~~~ python
  # ビルド用イメージ
  FROM golang:1.16 AS build
  WORKDIR /app
  COPY . .
  RUN go build -o main .

  # 実行用イメージ
  FROM alpine:latest
  WORKDIR /app
  COPY --from=build /app/main .
  CMD ["./main"]
~~~

### 最小限のベースイメージを使用
`alpine`のような軽量なベースイメージを使うことで、不要なパッケージを含まず、最小限のサイズに抑えることができます。
~~~ python
  FROM alpine:latest
~~~

## コンテナの最適化
コンテナのパフォーマンスを向上させるためのコツをいくつか紹介します。

### コンテナのリソース制限を設定
CPUやメモリの使用量を制限することで、コンテナが過剰にリソースを消費することを防ぎ、システム全体の安定性を向上させます。
~~~ python
  docker run -d --memory="512m" --cpus="1.0" myapp
~~~

### 不要なコンテナやイメージをクリーンアップ
定期的に不要なコンテナ、イメージ、ボリュームを削除してディスクスペースを確保します。
~~~ python
  docker system prune -a
~~~

## セキュリティに関する注意点
Dockerを使う際には、セキュリティも重要な要素です。以下のポイントに注意して、安全な運用を目指しましょう。

### 特権モードでの実行を避ける
コンテナを特権モード`--privileged`で実行すると、ホストのカーネルに直接アクセスできてしまうため、セキュリティリスクが高まります。必要がない限り、このオプションは使わないようにしましょう。

### 最小限の権限でコンテナを実行
必要以上の権限でコンテナを実行しないよう、`--user`オプションを使って特定のユーザーでコンテナを起動するように設定します。
~~~ python
  docker run -d --user 1000:1000 myapp
~~~

### 定期的なイメージの更新
使用しているベースイメージや依存パッケージに脆弱性がないかを定期的に確認し、必要に応じて最新バージョンに更新します。

### 不要なパッケージを削除
不要なパッケージやツールをDockerイメージに含めないようにしましょう。これにより、攻撃されるリスクを低減させ、イメージサイズの削減にもつながります。

## 安全なコンテナ運用のためのヒント
### コンテナのネットワークを分離
各コンテナが独立したネットワークで動作するように設定し、不要な通信を制限します。これにより、コンテナ間の通信が安全に保たれます。
~~~ python
  docker network create --subnet 192.168.0.0/16 my_network
  docker run --net my_network --ip 192.168.0.2 myapp
~~~

### Docker Bench for Security
Dockerのベストプラクティスに沿ってセキュリティをチェックするためのツール「Docker Bench for Security」を活用し、運用環境が適切に保護されているか確認します。

https://github.com/docker/docker-bench-security


# おわりに

Dockerの基本コマンドや使い方を押さえることで、開発環境のセットアップやアプリケーションの管理がスムーズに行えます。ぜひこのチートシート、トラブルシューティングとベストプラクティスを活用してDockerを使いこなし、開発の生産性をさらに高めていきましょう！


:::note info
弊社Nucoでは、他にも様々なお役立ち記事を公開しています。よかったら、Organizationのページも覗いてみてください。
また、Nucoでは一緒に働く仲間も募集しています！興味をお持ちいただける方は、[こちら](https://www.wantedly.com/companies/company_8285417)まで。
:::

https://recruit.nuco.co.jp/?qiita_item_id=%5Bid%5D