Dockerってなんで必要なんだっけ？



## 1. Dockerの存在意義と使う意味

### Dockerとは

Dockerはオープンソースのコンテナ技術です。コンテナは軽量で移植可能なソフトウェアのパッケージで、開発者がアプリケーションとその依存関係をシステムから切り離して、コードを一貫性を持って実行できるようにするものです。

### Dockerの利点

- **環境統一**: Dockerを使うと、開発者は自分のローカルマシンで動作するものと同じアプリケーションを他のマシンやサーバーでも動作させることができます。

- **依存関係の管理**: アプリケーションの依存関係をDockerfileという設定ファイルに記述することで、それぞれのアプリケーションが必要とするライブラリやツールを明確にすることができます。

- **隔離**: Dockerコンテナは互いに隔離されているため、アプリケーションがシステム全体に影響を与えることはありません。これにより、異なるアプリケーションやプロジェクト間での環境の競合を防ぐことができます。
![スクリーンショット 2023-07-14 午前10.16.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/b1596120-97bc-8bc0-4f4a-23bfe61ea0fa.png)


## Dockerイメージとコンテナの関係性
Dockerでは、イメージとコンテナは2つの主要な概念です。

Dockerイメージは、コンテナを実行するために必要なすべての情報を含む静的なスナップショットです。具体的には、コンテナで実行するアプリケーションとその依存関係、環境変数、ファイルシステムなどを含みます。Dockerイメージは、`Dockerfile`というテキストファイルを元に作成されます。

Dockerコンテナは、Dockerイメージから生成され、実際にアプリケーションを実行するためのランタイム環境です。イメージは読み取り専用で、コンテナはそのイメージの実行可能なインスタンスで、書き込み可能な層を持ちます。

Dockerイメージとコンテナの関係は、クラスとインスタンスの関係に似ています。イメージはクラスのように、どのような状態や振る舞いを持つべきかを定義しています。一方、コンテナはそのイメージ（クラス）から生成され、実際にその定義に従って動作するインスタンスです。

## 2. Dockerのコマンドの意味を理解し、使いこなせる

ここでは基本的なDockerコマンドについて説明します：

- `docker container run`: 新しいコンテナを作成して実行します。`docker container run <image>`でイメージ名を指定します。

ここでは、`docker container run hello-world`をterminalで叩いてみましょう。その前に必ずDocker desktop をインストールし、サインアップして、立ち上げておいてください。

そうすると下のようなものが出てきます。
![スクリーンショット 2023-07-14 午前10.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/e3ca8715-b4c7-6846-2e0c-2a6fe1780d35.png)
`Hello from Docker`とありますね。

- `docker image pull ubuntu`を実行して、Ubuntuのイメージをpullしてみましょう。
![スクリーンショット 2023-07-14 午前10.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/11cc2bb0-af9e-f263-d539-b2bd46626f35.png)
  `docker image ls`で確認しよう。
![スクリーンショット 2023-07-14 午前10.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/f39f24b0-74ba-67f7-a541-1eea21001838.png)
- `docker rm`: このコマンドを使ってさきほどpullしたUbuntoを削除します。`docker rm <container id>`でコンテナIDを指定します。
![スクリーンショット 2023-07-14 午前10.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/051a77d0-6e04-8f71-59cf-56bf986f1c60.png)

- `docker ps`: 現在稼働中のコンテナのリストを表示します。`-a`オプションを使うと、稼働中でないコンテナも表示されます。

- `docker stop`: 稼働中のコンテナを停止します。`docker stop <container id>`でコンテナIDを指定します。



- `docker images`: ローカルに保存されているイメージのリストを表示します。

- `docker container rm <image id>`: イメージを削除します。<image id>`でイメージIDを指定します。

- `docker image pull`: Docker Hubからイメージをダウンロードします。`docker image pull`でイメージ名を指定します。

- `docker image build`: Dockerfileからイメージをビルドします。`docker image build -t <tag> .`でタグ名を指定し、`.`はDockerfileがあるディレクトリを指定します。

## 3. Docker composeで複数のコンテナを効率的に扱える

Docker Composeは、複数のDockerコンテナを一括で管理するためのツールです。YAMLファイルでアプリケーションのサービスを定義し、一つのコマンドでこれらのサービスを一緒に作成、開始、停止することができます。

`docker-compose.yml`ファイルは以下のような形式で記述します：

```yaml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"
```

この例では、2つのサービス、webとredisを定義しています。webサービスは現在のディレクトリのDockerfileからビルドし、ポート5000を外部に公開します。redisサービスはDocker Hubの`redis:alpine`イメージを使用します。

主なDocker Composeのコマンドは以下のとおりです：

- `docker-compose up`: Docker Composeファイルに定義されたすべてのサービスを起動します。

- `docker-compose down`: Docker Composeファイルに定義されたすべてのサービスを停止し、ネットワークとボリュームも削除します。

- `docker-compose ps`: Docker Composeで管理されている現在稼働中のサービスを一覧表示します。

- `docker-compose build`: Docker Composeファイルに定義されたすべてのサービスをビルドします。

## 4. 実ソフトウェア開発にDockerを導入して、活用できる

Dockerをソフトウェア開発に活用するための一般的な方法は次のとおりです：

- **開発環境の統一**: チームメンバー全員が同じDockerイメージを使うことで、"私のマシンでは動く"という問題を解決できます。

- **本番環境のシミュレーション**: Dockerを使えば、本番環境とほぼ同じ条件でアプリケーションをテストすることができます。

- **CI/CDパイプライン**: Dockerを使うと、ビルドからテスト、デプロイまでのプロセスを一貫して行うことができます。

- **マイクロサービスアーキテクチャ**: Dockerはマイクロサービスの開発とデプロイにも適しています。

各サービスを個別のコンテナで実行し、それらをDocker ComposeやKubernetesなどで管理することが可能です。