Dockerを始めるならこれ！初心者のための基礎知識講座

## はじめに
近年、ソフトウェア開発の現場では「Docker」という言葉を耳にする機会が増えています。
Dockerは、アプリケーションの実行環境を効率的に管理するための「コンテナ型仮想化技術」を提供するツールです。その利便性から、開発環境の構築やデプロイメントプロセスの簡略化に大きく貢献しています。

本記事では、Docker初心者の方向けに、基本的な概念や特徴、使い方についてわかりやすく解説します。


初めてDockerを学ぶ方が、その魅力を理解し、最初の一歩を踏み出せるようになればと思います。


## Dockerの基本概念

Dockerは、2013年に登場したオープンソースのコンテナ型仮想化技術です。
この技術を利用することで、アプリケーションやその依存関係を一つの「コンテナ」にまとめ、どのような環境でも一貫して動作するようにすることができます。

![docker-logo-blue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949447/97a846b4-9154-9c6c-cc6b-9be20165ddda.png)


### 従来の仮想化技術との違い

従来、仮想マシン（Virtual Machine, VM）を使った仮想化が一般的でした。
仮想マシンはホストOS上にゲストOSを丸ごと動かす仕組みであり、高い柔軟性を持つ一方で、以下のような課題がありました。

- ゲストOSを動かすために多くのリソースを消費する  
- 起動時間が長い  
- イメージファイルのサイズが大きい  

これに対してDockerは、ホストOSのカーネル（LinuxやWindowsなど）を共有する軽量な仕組みを採用しています。
そのため、以下のようなメリットがあります。

- **軽量で高速**: 仮想マシンに比べてリソース消費が少なく、コンテナの起動も非常に速い
- **移植性が高い**: 異なる環境間でも同じコンテナを利用できる
- **効率的**：複数のコンテナを同じホストOS上で実行できる  

### コンテナとは？

コンテナは、アプリケーションとその実行に必要なライブラリや設定をまとめたパッケージのようなものです。これにより、異なる環境でも一貫した動作が保証されます。
例えば、開発環境、本番環境、テスト環境が異なっていても、同じコンテナを使用することで同じ動作を期待できます。

### Dockerを支える技術

Dockerは、以下の技術を基盤として動作しています：

- **Linuxコンテナ（LXC）**：初期のDockerはLinuxのコンテナ技術を利用していましたが、現在は独自の仕組みを採用しています。  
- **Union File System（UnionFS）**：Dockerイメージを効率的に管理するためのファイルシステム。複数のレイヤーを一つのファイルシステムとして扱えます。  
- **CgroupsとNamespaces**：プロセスのリソース使用や隔離を実現する技術。  

## Dockerの主な特徴

Dockerは、コンテナ型仮想化技術として多くの利便性を提供します。
このセクションでは、Dockerの主な特徴を3つに分けて説明します。

### 1. 軽量で高速

Dockerのコンテナは、仮想マシンと比較して非常に軽量です。仮想マシンがOS全体をエミュレートするのに対して、DockerはホストOSのカーネルを共有します。
その結果、以下のような利点があります：

- **リソース効率が高い**：CPUやメモリの消費が少ない  
- **起動が速い**：コンテナの起動時間は数秒程度  

これにより、開発者がすぐに環境を構築して作業を開始できるようになります。

### 2. 移植性が高い

Dockerコンテナは、どのような環境でも同じように動作します。
これにより、「開発環境では動くが、本番環境では動かない」といった問題を解消できます。

- **一貫性のある環境**：アプリケーションとその依存関係を1つのコンテナにまとめることで、一貫性を保ちます。  
- **クロスプラットフォーム対応**：同じコンテナをLinux、Windows、macOSなどで実行可能です。  

### 3. スケーラビリティと効率性

Dockerは、スケーラブルなアプリケーションを構築するための柔軟な仕組みを提供します。
例えば、複数のコンテナを利用して異なる機能を分担させることで、効率的なシステム設計が可能です。

- **マイクロサービスに最適**：1つのアプリケーションを小さなサービスに分割し、それぞれを独立したコンテナで実行できます。  
- **リソースの効率的な使用**：コンテナ単位でリソースを割り当てられるため、無駄がありません。  

## Dockerの仕組み

Dockerは、効率的にコンテナを管理し、実行するための技術が集約された仕組みを持っています。
このセクションでは、Dockerの重要な構成要素について説明します。

### 1. Dockerイメージ

Dockerイメージは、アプリケーションやその依存関係、設定をまとめた「テンプレート」のようなものです。  
イメージを使用することで、環境を簡単に再現できます。

- **特長**：変更されない読み取り専用のテンプレート  
- **作成**：Dockerfileというスクリプトを使って作成  
- **共有**：Docker Hubなどのリポジトリで公開・共有が可能  

イメージはコンテナの「設計図」として機能します。

### 2. Dockerコンテナ

Dockerコンテナは、イメージを実行可能な状態にしたものです。  
コンテナは、仮想化された環境の中でアプリケーションを実行します。

- **軽量**：必要最低限のリソースのみ使用  
- **一時的または長期間利用**：コンテナは一時的な処理にも、長期的な運用環境にも使用できます  
- **独立性**：他のコンテナやホストシステムから隔離されています  

### 3. Dockerエンジン

Dockerエンジンは、Dockerの中核となる技術で、以下の2つのコンポーネントから構成されています：

- **Dockerデーモン（dockerd）**：コンテナの作成や管理を行うバックグラウンドプロセス  
- **Docker CLI**：コマンドラインを通じてDockerを操作するインターフェース  

これにより、コンテナのライフサイクル（作成、起動、停止、削除）を簡単に管理できます。

### 4. Docker Hub

Docker Hubは、Dockerイメージを保存・共有できるオンラインサービスです。
公式のイメージや、他の開発者が公開したイメージを利用することで、効率的に開発を進められます。

- **検索可能**：必要なイメージを簡単に検索  
- **カスタムイメージの公開**：自分の作成したイメージを公開することで他の開発者と共有可能  


## Dockerの基本操作

Dockerを実際に使い始めるには、いくつかの基本操作を理解する必要があります。
このセクションでは、Dockerの導入後に覚えるべき操作について説明します。

### 1. Dockerイメージの取得

Dockerイメージは、Docker Hubなどのリポジトリから取得できます。  
以下のコマンドで、公式の`nginx`イメージを取得してみましょう：

```
docker pull nginx
```
このコマンドを実行すると、指定したイメージがローカル環境にダウンロードされます。

### 2. コンテナの作成と起動
ダウンロードしたイメージをもとに、コンテナを作成して起動します。
以下は、nginxコンテナをバックグラウンドで起動する例です：

```
docker run -d -p 8080:80 nginx
```
-d：バックグラウンドで実行
-p 8080:80：ホストのポート8080をコンテナのポート80にマッピング

ブラウザでhttp://localhost:8080にアクセスすると、nginxのデフォルトページが表示されます。

### 3. 実行中のコンテナの確認
現在実行中のコンテナを確認するには、以下のコマンドを使用します：
```
docker ps
```
このコマンドを実行すると、コンテナIDや名前、実行状態などが表示されます。
-aオプションを付けると、停止中のコンテナも含めてすべて表示されます。

### 4. コンテナの停止
実行中のコンテナを停止するには、以下のコマンドを使用します：
```
docker stop <コンテナIDまたは名前>
```
docker psコマンドで確認したコンテナIDまたは名前を指定してください。

### 5. コンテナの削除
不要になったコンテナを削除するには、以下のコマンドを使用します：
```
docker rm <コンテナIDまたは名前>
```
削除する前に、コンテナを停止しておく必要があります（docker stopを使用）。
実行中のコンテナは直接削除できません。

### 6. イメージの削除
不要になったDockerイメージを削除するには、以下のコマンドを使用します：
```
docker rmi <イメージIDまたは名前>
```
イメージを削除する際には、関連するすべてのコンテナを先に削除しておく必要があります。


## 実際の利用例

Dockerは、多様な場面で活用されており、その柔軟性と利便性から多くの開発者に支持されています。
このセクションでは、Dockerが実際にどのような形で利用されているか、具体例を挙げて説明します。

### 1. 開発環境の構築

Dockerは、開発環境の構築において非常に役立ちます。
開発者ごとに異なる環境設定を統一し、すべてのチームメンバーが同じ環境で作業できるようになります。

#### 具体例
- 開発環境に必要なツールやライブラリをまとめたコンテナを作成  
- 複数のプロジェクトで異なる依存関係を管理する際にも便利  

以下のコマンドで、開発環境用のコンテナを起動できます：

```
docker run -it ubuntu
```
これにより、Ubuntuベースの開発環境が簡単に構築されます。

### 2. テスト環境の自動化
Dockerを使えば、テスト環境の自動化も容易です。
例えば、CI/CDパイプラインで、Dockerを使用して環境を構築し、アプリケーションのテストを実行できます。

#### 具体例
- 異なる依存関係や設定を持つ環境でのユニットテストや統合テスト
- JenkinsやGitHub ActionsなどのCIツールと連携してテストの自動化を実現

以下のようなスクリプトを使ってテスト環境を自動構築できます：

```
docker build -t my-app:test .
docker run my-app:test
```


### 3. 本番環境でのデプロイ
Dockerは、本番環境でのデプロイにも利用されています。
コンテナを使うことで、スケーラブルで一貫性のあるデプロイが可能になります。

#### 具体例
- マイクロサービスアーキテクチャの実現：各サービスを独立したコンテナとしてデプロイ
- 負荷分散を容易に実現：複数のコンテナを使用してリクエストを処理

以下のようなコマンドを使って、複数のコンテナを簡単にデプロイできます：

```
docker compose up -d
```

### 4. トレーニングや教育
Dockerは、プログラミングの学習や環境設定のトレーニングにも利用されています。
必要なツールがすべて含まれたコンテナを配布することで、受講者全員が同じ環境で学習を進めることができます。

#### 具体例
- ワークショップやセミナーでのハンズオン環境の提供
- 学習用のサンプル環境をコンテナとして配布

## 注意点と制限

Dockerは便利で強力なツールですが、使用する際にはいくつかの注意点や制限も存在します。
このセクションでは、それらを事前に理解しておくことで、トラブルを未然に防ぐための情報を提供します。


### 1. パフォーマンスの制限

Dockerは軽量な仮想化技術を採用していますが、ホストOSのリソースを共有しているため、以下のようなパフォーマンスの制限が発生する場合があります：

- **I/O性能**：ディスクやネットワークのI/Oが大量に発生するアプリケーションでは、パフォーマンスが低下することがあります。  
- **リソース競合**：複数のコンテナが同時に実行されると、CPUやメモリの競合が発生する可能性があります。


### 2. セキュリティ上のリスク

Dockerコンテナは、ホストOSのカーネルを共有して動作します。
そのため、完全に分離された仮想マシンとは異なり、以下のようなリスクがあります：

- **ホストへの影響**：コンテナ内でのセキュリティ侵害がホストOSに影響を与える可能性があります。  
- **不正なイメージの利用**：信頼できないイメージを利用すると、マルウェアや不要な設定が含まれている場合があります。  
- **権限設定のミス**：コンテナに高い権限を与えることで、攻撃対象となる可能性が高まります。

**対策**：
- 信頼できるソース（公式Docker Hubなど）のイメージを利用する  
- 不要な権限を避け、最小限の権限で運用する  


### 3. 状態を持つアプリケーションの管理

Dockerコンテナは一時的な環境として設計されているため、状態を持つアプリケーション（例：データベース）の運用には注意が必要です。

- **データの永続化**：コンテナを削除すると、永続化の設定がない場合、データも削除されることがあります。 
- **データボリュームの利用**：永続的なデータを管理するために、Docker Volumeを利用する必要があります。

**対策**：
- データをボリュームに保存するように設定する  
- 定期的なバックアップを実施する  

---

### 4. WindowsやmacOSでのパフォーマンス

DockerはLinuxカーネル上で動作するため、WindowsやmacOSで利用する際には、仮想化ツール（例：Hyper-VやAppleのHypervisor）を使用します。
その結果、以下のような制限が発生します：

- **パフォーマンス低下**：Linuxネイティブ環境と比較して処理速度が低下する場合があります。  
- **互換性の問題**：一部の機能がホストOSに依存し、正常に動作しない場合があります。

---

### 5. 学習コスト

Dockerの基本的な使い方は比較的簡単ですが、大規模なシステムで利用する場合、以下のような学習が必要です：

- **Docker ComposeやKubernetesの理解**：複数のコンテナを管理するためには追加のツールが必要になります。  
- **ネットワークやストレージの設定**：複雑なシステム構築には、ネットワークやストレージの深い理解が求められます。

## まとめ

本記事では、Dockerの基本概念から主な特徴、基本操作、実際の利用例、そして注意点や制限について解説しました。
初心者の方でもDockerの基本的な仕組みと活用方法を理解していただけたのではないでしょうか。

### この記事で学べたポイント

- **Dockerの基本概念**  
  コンテナ型仮想化技術としてのDockerの仕組みと従来の仮想化技術との違いを解説しました。

- **Dockerの主な特徴**  
  軽量性、移植性、スケーラビリティといったDockerの強みを学びました。

- **基本操作**  
  イメージの取得やコンテナの作成・起動、削除まで、Dockerの基本的な使い方を説明しました。

- **実際の利用例**  
  開発環境やテスト環境の構築、本番環境でのデプロイなど、Dockerが活躍する場面を具体的に紹介しました。

- **注意点と制限**  
  セキュリティリスクやパフォーマンスの問題、状態を持つアプリケーションの管理など、利用時の注意点を学びました。

### 次のステップ

Dockerの基本を理解したら、さらに以下のようなトピックを学んでみるとより理解が深まると思います。

- **Docker Compose**を使って複数のコンテナを管理する方法  
- **Kubernetes**を利用したコンテナの大規模なオーケストレーション  
- Dockerイメージの最適化やセキュアな運用のベストプラクティス  

Dockerは、学べば学ぶほど活用の幅が広がるツールです。
本記事が、あなたのDocker学習の最初の一歩となれば幸いです。


## 参考

- Docker公式ドキュメント  
  [https://docs.docker.com/](https://docs.docker.com/)  
  Dockerのインストール方法から使い方、応用例までを網羅的に解説しています。
  
</br>

- Docker Hub  
  [https://hub.docker.com/](https://hub.docker.com/)  
  公開されている公式イメージやコミュニティイメージを検索・利用できます。