> For the complete documentation index, see [llms.txt](https://engineer.toggle.co.jp/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://engineer.toggle.co.jp/chapter-1-toggle-holdings-engineer-101/ji-chu-yan-xiu/docker.md).

# Docker

## **Dockerの基本**

### **コンテナ仮想化とDockerの役割**

* コンテナ仮想化: コンテナ仮想化は、アプリケーションやサービスを独立した環境で実行するための仮想化技術です。コンテナは軽量で独立しており、異なる環境での再現性とポータビリティを提供します。
* Dockerの役割: Dockerは、コンテナ仮想化を実現するためのオープンソースプラットフォームです。Dockerは、アプリケーションやサービスをコンテナとしてパッケージ化し、簡単かつ効率的に配布、展開、実行することができます。

### **イメージとコンテナの概念**

* イメージ: イメージは、Dockerコンテナの起点となる静的なファイルシステムと実行するための設定を含んだファイルです。イメージはコンテナの元となるテンプレートであり、アプリケーションやサービスの実行環境を定義します。
* コンテナ: コンテナは、イメージの実行可能なインスタンスです。イメージを基にして作成され、独立した環境でアプリケーションやサービスを実行します。コンテナは他のコンテナやホストシステムと隔離されており、リソースの制限やネットワークの設定などを持つ独自のランタイム環境を持ちます。

### **Dockerのアーキテクチャと主要なコンポーネント**

* Dockerデーモン (Docker Daemon): Dockerデーモンは、Dockerエンジンのバックエンドであり、コンテナの管理や操作を担当します。Dockerデーモンはホスト上で実行され、Dockerコマンドの実行やイメージの作成、コンテナの起動などの機能を提供します。
* Dockerクライアント: Dockerクライアントは、Dockerデーモンに対してコマンドを発行するためのインターフェースです。Dockerコマンドラインインターフェース（CLI）やDocker APIを介してDockerデーモンと通信します。
* Dockerレジストリ: Dockerレジストリは、Dockerイメージの保存と共有のための中央リポジトリです。公式のDocker Hubやプライベートなレジストリを利用して、イメージのプルやプッシュを行うことができます。

以上がDockerの基本的な概念と役割、アーキテクチャと主要なコンポーネントです。これらを理解することで、Dockerの利用と操作についてより深く学ぶことができます。

## **Dockerのインストールとセットアップ**

以下では、Dockerのインストールとセットアップに関する項目をコマンドやコード例を交えて説明します。

### **Dockerのインストール方法と環境設定**

UbuntuでDockerをインストールする手順は以下の通りです。

1. パッケージインデックスの更新:

```bash
sudo apt update
```

2. 必要なパッケージをインストール:

```bash
sudo apt install docker.io
```

3. Dockerデーモンの起動と自動起動の設定:

```bash
sudo systemctl start docker
sudo systemctl enable docker
```

これにより、ユーザーがDockerコマンドを実行できるようになります。

### **Docker CLIの概要と基本的なコマンドの使用方法**

Docker CLIは、Dockerコマンドラインインターフェースの略であり、Dockerコマンドを使用してDockerの操作を行います。

* Dockerバージョンの確認:

```bash
docker version
```

* Dockerイメージの取得:

```bash
docker pull <イメージ名>
```

* イメージの一覧表示:

```bash
docker images
```

* コンテナの起動:

```bash
docker run <オプション> <イメージ名>
```

* 起動中のコンテナの一覧表示:

```bash
docker ps
```

* コンテナの停止:

```bash
docker stop <コンテナID>
```

* コンテナの削除:

```bash
docker rm <コンテナID>
```

## **コンテナの作成と管理**

以下では、コンテナの作成と管理に関する項目をコマンドやコード例を交えて説明します。

### **Dockerfileの作成とイメージのビルド**

Dockerfileは、Dockerイメージをビルドするためのテキストファイルです。以下はDockerfileの作成とイメージのビルドの手順です。

1. Dockerfileの作成:

```docker
# ベースイメージの指定
FROM <ベースイメージ>

# 追加のパッケージのインストールや設定など、イメージの構成を記述
RUN <コマンド1>
RUN <コマンド2>
...

# コンテナの実行時に実行されるコマンドの指定
CMD <コマンド>
```

2. Dockerイメージのビルド:

```bash
docker build -t <イメージ名>:<タグ> <Dockerfileのパス>
```

### **イメージのタグ付けとバージョン管理**

Dockerイメージには、タグを付けることができます。タグを使用することで、イメージのバージョン管理や特定のバージョンのイメージを指定してコンテナを作成することができます。

* イメージのタグ付け:

```bash
docker tag <現在のイメージ名>:<現在のタグ> <新しいイメージ名>:<新しいタグ>
```

* イメージのリネーム:

<pre class="language-bash"><code class="lang-bash"><strong>docker image tag &#x3C;現在のイメージ名>:&#x3C;現在のタグ> &#x3C;新しいイメージ名>:&#x3C;新しいタグ>
</strong></code></pre>

### **コンテナの作成と起動オプションの設定**

コンテナの作成と起動には、`docker run`コマンドを使用します。以下はコンテナの作成と起動オプションの設定の例です。

* コンテナの作成と起動:

```bash
docker run -d --name <コンテナ名> -p <ホストポート>:<コンテナポート> <イメージ名>:<タグ>
```

* ボリュームのマウント:

```bash
docker run -d --name <コンテナ名> -v <ホストディレクトリ>:<コンテナディレクトリ> <イメージ名>:<タグ>
```

### **コンテナの監視とログの管理**

コンテナの監視とログの管理には、`docker logs`コマンドやDockerの監視ツールを使用します。

* コンテナのログの表示:

```bash
docker logs <コンテナ名>
```

* コンテナのリアルタイムログの表示:

```bash
docker logs -f <コンテナ名>
```

* コンテナの監視ツールの使用:

Dockerには、Prometheus、Grafana、cAdvisorなどのツールを使用してコンテナの監視を行うことができます。

以上がコンテナの作成と管理に関する説明です。これらの手順やコマンドを使用することで、Dockerを使用したコンテナの作成や管理、ログの監視などを行うことができます。

## **ネットワーキングとストレージの管理**

以下では、ネットワーキングとストレージの管理に関する項目をコマンドやコード例を交えて説明します。

### **コンテナ間のネットワーキングと接続**

Dockerでは、コンテナ間のネットワーキングを簡単に設定することができます。以下は、コンテナ間のネットワーキングと接続の例です。

* ユーザー定義ネットワークの作成:

```bash
docker network create <ネットワーク名>
```

* コンテナの作成とネットワークへの接続:

```bash
docker run -d --name <コンテナ名> --network=<ネットワーク名> <イメージ名>:<タグ>
```

### **ポートマッピングとホストとの連携**

Dockerでは、コンテナ内のポートとホストマシンのポートをマッピングすることができます。以下は、ポートマッピングとホストとの連携の例です。

* ホストとコンテナのポートのマッピング:

```bash
docker run -d --name <コンテナ名> -p <ホストポート>:<コンテナポート> <イメージ名>:<タグ>
```

### **ボリュームの管理と永続化データの扱い**

Dockerでは、ボリュームを使用してデータを永続化することができます。以下は、ボリュームの管理と永続化データの扱いの例です。

* ボリュームの作成:

```bash
docker volume create <ボリューム名>
```

* コンテナの作成とボリュームのマウント:

```bash
docker run -d --name <コンテナ名> -v <ボリューム名>:<コンテナ内のマウントパス> <イメージ名>:<タグ>
```

これにより、コンテナ内のデータがボリュームに永続化されます。

以上がネットワーキングとストレージの管理に関する説明です。これらの手順やコマンドを使用することで、コンテナ間のネットワーキングやポートマッピング、ボリュームの管理と永続化データの扱いを行うことができます。

## **Docker Composeを使用した複数コンテナの管理**

以下では、Docker Composeを使用した複数コンテナの管理に関する項目をコマンドやコード例を交えて説明します。

### **Docker Composeの概要と基本的な構成**

Docker Composeは、複数のDockerコンテナを定義し、管理するためのツールです。Docker Composeでは、YAML形式のファイルを使用してコンテナの構成を記述します。

```yaml
version: "3"
services:
  <サービス名1>:
    image: <イメージ名1>:<タグ>
    <その他の設定>

  <サービス名2>:
    image: <イメージ名2>:<タグ>
    <その他の設定>
```

### **複数のコンテナの定義と連携**

Docker Composeでは、複数のコンテナを定義し、それらのコンテナ間の連携を設定することができます。

```yaml
version: "3"
services:
  <サービス名1>:
    image: <イメージ名1>:<タグ>
    <その他の設定>

  <サービス名2>:
    image: <イメージ名2>:<タグ>
    depends_on:
      - <サービス名1>
    <その他の設定>
```

### **環境変数の管理と共有ネットワークの設定**

Docker Composeでは、環境変数の管理やコンテナ間でのネットワークの共有を設定することができます。

* 環境変数の設定:

```yaml
version: "3"
services:
  <サービス名>:
    image: <イメージ名>:<タグ>
    environment:
      - VAR1=value1
      - VAR2=value2
```

* 共有ネットワークの設定:

```yaml
version: "3"
services:
  <サービス名1>:
    image: <イメージ名1>:<タグ>
    networks:
      - <ネットワーク名>

  <サービス名2>:
    image: <イメージ名2>:<タグ>
    networks:
      - <ネットワーク名>

networks:
  <ネットワーク名>:
    driver: bridge
```

以上がDocker Composeを使用した複数コンテナの管理に関する説明です。これらの手順やコード例を使用することで、Docker Composeを利用して複数のコンテナを定義し、連携させることができます。

## **Dockerイメージのカスタマイズと拡張**

以下では、Dockerイメージのカスタマイズと拡張に関する項目をコマンドやコード例を交えて説明します。

### **ベースイメージの選択とカスタムイメージの作成**

Dockerでは、ベースイメージを使用してカスタムイメージを作成することができます。ベースイメージは、作成するイメージの基盤となるイメージです。

* ベースイメージの指定とカスタムイメージの作成:

```docker
FROM <ベースイメージ>
<追加の設定やパッケージのインストールなど>
```

### **マルチステージビルドの利用と効果的なイメージの最適化**

マルチステージビルドは、Dockerイメージを効果的に最適化するための手法です。複数のステージを使ってビルドプロセスを分割し、不要なファイルや依存関係を含まない軽量な最終イメージを作成することができます。

```docker
FROM <ベースイメージ> as build
<ビルドプロセスの実行>

FROM <別のベースイメージ> as final
COPY --from=build /app/output /app/output
<必要な設定や実行ファイルのコピーなど>
```

### **Dockerfileのベストプラクティスとセキュリティ考慮事項**

* Dockerfileのベストプラクティス:
  * 不要なパッケージやファイルを削除する
  * ランダムなユーザーを使用する
  * キャッシュを最大限に活用する
  * 複数のRUNステートメントを結合する
* セキュリティ考慮事項:
  * イメージの署名と検証
  * 安全なDockerイメージのベースイメージの選択
  * コンテナ内のセキュリティパッチの適用

以上がDockerイメージのカスタマイズと拡張に関する説明です。これらの手順やベストプラクティスを使用することで、ベースイメージの選択やカスタムイメージの作成、マルチステージビルドの利用、Dockerfileのベストプラクティスとセキュリティ考慮事項を実践することができます。

## **デバッグとトラブルシューティング**

以下では、Dockerのデバッグとトラブルシューティングに関する項目をコマンドやコード例を交えて説明します。

### **Dockerのログとデバッグツールの活用**

Dockerはログを生成し、問題解決に役立つ情報を提供します。コンテナのログを表示するコマンドやログの保存先を確認するコマンドを使用できます。

* コンテナのログ表示例:

```bash
# コンテナのログを表示
docker logs <コンテナ名>

# フォローモードでコンテナのログを表示
docker logs -f <コンテナ名>
```

Dockerにはさまざまなデバッグツールもあります。例えば、Docker Inspectコマンドを使用してコンテナの詳細情報を取得したり、Docker Execコマンドを使用してコンテナ内でコマンドを実行したりすることができます。

### **コンテナ内のシェルへのアクセスとデバッグ手法**

コンテナ内で問題が発生した場合、シェルにアクセスしてコンテナ内でコマンドを実行することができます。これにより、コンテナ内の状態を調査し、デバッグを行うことができます。

* コンテナ内のシェルへのアクセス例:

```bash
# コンテナ内のシェルにアクセス
docker exec -it <コンテナ名> /bin/bash
```

### **一般的な問題とトラブルシューティングのヒント**

Dockerの使用中によく遭遇する問題とトラブルシューティングのヒントをいくつか紹介します。

* イメージの見つからないエラー:
  * Docker Hubからイメージを取得する前に、イメージが存在することを確認してください。
  * ローカルにイメージが存在する場合、イメージ名とタグが正しいことを確認してください。
* ポートの競合エラー:
  * 起動するコンテナのポートがホスト上の他のプロセスと競合していないか確認してください。
  * ポートマッピングを変更して競合を回避することができます。
* ボリュームのマウントエラー:
  * ボリュームをマウントする際に正しいパスを指定しているか確認してください。
  * ホスト上のディレクトリが存在しない場合は作成してください。

これらは一般的な問題とそのトラブルシューティングのヒントの一部です。問題の解決には、具体的なエラーメッセージの確認やドキュメントの参照が重要です。

以上がDockerのデバッグとトラブルシューティングに関する説明です。これらの手法を使用してログの活用、コンテナ内でのデバッグ、一般的な問題のトラブルシューティングを行うことができます。

## **セキュリティとベストプラクティス**

以下では、Dockerのセキュリティとベストプラクティスに関する項目をコマンドやコード例を交えて説明します。

### **Dockerセキュリティの基本原則**

* 最小特権の原則: コンテナ内で実行されるプロセスには必要最低限の権限を与えることが重要です。特権モードの使用は避け、必要な権限を制限しましょう。
* イメージの信頼性: イメージの信頼性を確保するために、公式のDockerイメージや信頼できるソースからイメージを取得することをお勧めします。また、自身でイメージをビルドする場合は、安全な方法で行いましょう。
* セキュリティパッチの適用: Dockerホストおよびコンテナ内のパッケージやランタイムのセキュリティパッチを定期的に適用することが重要です。

### **イメージの脆弱性スキャンとセキュリティツールの利用**

* イメージの脆弱性スキャン: イメージ内のパッケージの脆弱性を特定するために、脆弱性スキャンツールを使用しましょう。例えば、TrivyやClairなどのツールがあります。
* セキュリティツールの利用: Dockerホストやコンテナ内でセキュリティツールを実行して脆弱性や侵入の検知、ログの監視などを行うことでセキュリティを強化しましょう。

### **ネットワークセキュリティとアクセス制御の考慮事項**

* ポートの公開制限: コンテナが公開するポートを制限し、不要なポートは閉じましょう。ホストとのポートマッピングを必要最低限に制限することも重要です。
* ネットワークセグメンテーション: コンテナを異なるネットワークに分割し、必要な接続のみを許可することでセキュリティを向上させましょう。

### **実践的なシナリオと応用**

* Docker Secretsの利用: 機密情報（パスワードやAPIキーなど）を安全に扱うために、Docker Secretsを使用しましょう。
* Multi-Stage Buildの活用: マルチステージビルドを使用して、イメージサイズを最小化し、セキュリティを向上させましょう。
* Dockerのセキュリティイベント監視: Dockerホストやコンテナ内でのセキュリティイベントの監視を実施し、異常なアクティビティを検出することでセキュリティを強化しましょう。

## **学習リソース**

Dockerを学んだ後の学習リソースとして以下を挙げます:

1. Docker公式ドキュメント: Dockerの公式ドキュメントには詳細な情報とチュートリアルが提供されています。<https://docs.docker.com/>
2. Docker Deep Dive (書籍): Nigel Poultonによる詳細なDocker解説書です。<https://www.amazon.com/Docker-Deep-Dive-Nigel-Poulton/dp/1521822808>
3. Docker公式ブログ: Dockerの最新情報やベストプラクティスに関する記事が掲載されています。<https://www.docker.com/blog/>

これらの学習リソースを活用して、Dockerの理解を深めてください。
