コンテナを理解してDockerをインストールしよう（macOS用）

# この記事を書くきっかけ
コンテナという言葉を聞いたことはあったけど、それが何かを知らないまま時を過ごしていました。最近買った書籍の中でDockerを使った開発のページが載っており、「この機会に自分もDockerに触れてみたい！」という気持ちになりました。
ただ、Dockerをインストールするにあたって、やはりコンテナとDockerについての最低限の知識は持っておきたいと思い、少し勉強をしました。その結果を記事にしました。

### 対象者
- コンテナについて知りたい人
- Dockerについて知りたい人
- コンテナとDockerの関係を知りたい人
- macOSのパソコンにDockerをインストールする方法を知りたい人
- Dockerがちゃんとインストールされたか知りたい人

# コンテナについて
## コンテナって何？ 【What】
コンテナとは、アプリケーションを実行するための独立した環境を提供する技術です。それぞれのコンテナは、そのアプリケーションが動作するために必要なすべての依存関係やライブラリを含んでいます。

### コンテナの特徴
**1. 軽量**
コンテナはホストシステムのカーネルを共有するため、仮想マシンのように一つのコンテナに全てのOSをインストールする必要がありません。リソースの使用が少ないので、高速な起動が可能です。

**2. 移植性**
コンテナにはアプリケーションが動作するために必要なすべてが含まれているため、異なるホストマシン間で簡単に移動することができます。開発から本番環境までの移行がスムーズになります。

**3. 一貫性**
開発環境、テスト環境、本番環境で同じコンテナを使用することで、「開発環境では動いたのに、本番環境では動かない」といった問題を防ぐことができます。

**4. 隔離性**
各コンテナは他のコンテナから隔離されて動作します。一つのコンテナで何が起きても、他のコンテナやホストマシンには影響を与えません。

## なぜコンテナを使うべきなのか 【Why】
コンテナは、上記の4つの特徴を備えています。そのため、システムのスケールを容易に変更できたり、効率的なソフトウェア開発に一役買ってくれます。コンテナ技術は、現代のアプリケーション開発とデプロイにおいて、なくてはならない技術なんですね。

## コンテナを利用するためにはどうすればいいのか 【How】
Dockerを使おう！

# Dockerについて
## Dockerとは 【What】
Dockerは、ソフトウェア開発とデプロイのためのオープンソースプラットフォームであり、アプリケーションをコンテナという軽量な独立した環境で実行できるようにするサービスです。Dockerを使用することで、アプリケーションとその依存関係を一つのパッケージとしてまとめることができ、異なる環境でも一貫して動作させることができます。

### Dockerの仕組み
**1. Dockerイメージ**
Dockerイメージは、アプリケーションとその動作に必要なすべてのもの（例えば、コード、ライブラリ、設定など）をまとめたものです。これは一種のテンプレートで、このテンプレートを使ってコンテナを作成します。イメージは変更できない「読み取り専用」のファイルシステムを持っており、アプリケーションのすべての依存関係を含んでいます。

**2. Dockerコンテナ**
Dockerコンテナは、Dockerイメージを基にして作られる「動く箱」のようなものです。コンテナはアプリケーションが実行される場所で、イメージの内容を実際に動かすための実行環境を提供します。コンテナはホストシステム（あなたのPCやサーバー）のカーネル（OSの中心部分）を共有するため、仮想マシンよりも軽量で高速です。

**3. Docker Hub**
Docker Hubは、たくさんのDockerイメージが集まっている「倉庫」のようなものです。パブリック（誰でも使える）なイメージや、プライベート（特定の人だけが使える）なイメージを保存・共有できます。必要なイメージをDocker Hubからダウンロードして使うことができますし、自分が作ったイメージを他の人と共有することもできます。


## あえてDockerを使う理由 【Why】
Dockerにはいくつかの大きな利点があります。

**移植性**
Dockerを使うと、開発環境から本番環境まで、どこでも同じようにアプリケーションが動作します。Dockerイメージにはアプリケーションが動くために必要なすべてが含まれているため、異なるコンピュータでも問題なく動作します。これにより、開発者は「自分のPCでは動くのに、本番サーバーでは動かない」という心配をしなくて済みます。

**一貫性と再現性**
Dockerを使うと、開発、テスト、本番環境のすべてで同じ設定を使えます。これにより、どの環境でも同じ動作をするので、問題が起きた時のトラブルシューティングが簡単になります。

**効率性**
Dockerコンテナは非常に軽量です。仮想マシンと比べてリソースの消費が少なく、起動も非常に速いです。一つのホスト（コンピュータ）で多くのコンテナを効率的に実行できるので、リソースの無駄がありません。

**スケーラビリティ**
Dockerを使うと、アプリケーションを簡単にスケールアウト（規模拡大）できます。例えば、アクセスが増えた時に、簡単に新しいコンテナを追加して対応できます。また、Kubernetesなどのツールを使うと、大規模なコンテナ環境の管理が簡単になります。

**隔離性**
各コンテナは他のコンテナやホストシステムから隔離されているため、一つのコンテナで問題が発生しても、他のコンテナに影響を与えません。これにより、セキュリティが向上し、システム全体の安定性が保たれます。

**継続的デリバリー/デプロイ**
DockerはCI/CD（継続的インテグレーション/継続的デリバリー）と非常に相性が良いです。これにより、自動化と効率化が図れます。コンテナイメージを使って、簡単にテスト、ステージング、本番環境にデプロイできます。

***

とりあえず、Dockerはコンテナを実現するめちゃくちゃ便利なサービス！ってことですね。

## 実際にDockerを利用する方法(macOS)　【How】

### Dockerをインストールしよう
- Docker Desktopのダウンロードとインストール
[Dockerの公式サイト（Docker Desktop for Mac）](https://docs.docker.com/desktop/install/mac-install/)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/eaa63f39-46f3-3474-13ce-9093d47b5b37.png)

- ダウンロードしたDocker.dmgファイルを開きます。
- Docker.appファイルをApplicationsにドラッグ＆ドロップします。

![Snipaste_2024-06-17_16-40-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/f68231a5-5865-f56a-b183-fdb20847dd20.png)

- Docker Desktopを起動します。
- 起動後、Dockerのアイコンがメニューバーに表示されるはずです。
- ここはAcceptで許可します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/8c73c984-0749-d208-f9c5-514b8c6d248f.png)

- Use recommendend settings(おすすめの設定)を選択して設定を完了します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/e8ca55b2-712a-538e-30a1-53c49ac68c50.png)


- サインアップの画面になっているはずです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/12b5e3bb-16c8-34b3-0d39-0d52047c64ad.png)


## Dockerの基本操作を知ろう
**Dockerの動作確認**
ターミナルを開き、コマンドを実行してDockerが正しくインストールされているか確認します。
`docker --version`

```
$ docker --version
Docker version 26.1.1, build 4cf5afa
```
Dockerのバージョン情報が表示されれば、インストールは成功です。

***
**Dockerコンテナを起動してみよう**

`docker run hello-world`
このコマンドは、hello-worldというDockerイメージをダウンロードし、コンテナを起動します。成功すると、Dockerが正しく動作していることを示すメッセージが表示されます。

```
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

```
- hello-worldイメージが作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/f5a5b536-5e32-ed7c-113d-50c0cce9da2c.png)

***
全ての設定が終わった後、Macの「Finder」から「アプリケーション」フォルダを開き、Dockerアイコンをクリックして起動しようとしました。しかし、デスクトップ上に「Docker Desktop」が表示されませんでした。
そこで、ターミナルで`docker info`コマンドを実行して確認したところ、Dockerは「起動している」という結果が表示されました。しかし、デスクトップ画面には依然として何も表示されませんでした。

次に、アクティビティモニターを確認したところ、Dockerのプロセスが「起動」していることを確認できました。

最終的に、Macを再起動したところ、問題が解決し、Docker DesktopのGUIが正常に表示されるようになりました。


# まとめ
Dockerとコンテナの関係について。

Dockerは、コンテナ技術を簡単に使用できるようにするためのプラットフォームおよびツールセット。
**Docker = コンテナを作成、管理、実行するための一連のツール**

コンテナは、アプリケーションとその依存関係をパッケージ化し、隔離された環境で実行するための技術。
**コンテナ = ホストシステムのカーネルを共有しつつ、アプリケーションが必要とするライブラリや設定を含む独立したファイルシステムを持つ技術**

Dockerはコンテナ技術を実現する手段ということを覚えておけば、たぶん最初はOKです。