Dockerってなに！？　~自分なりにまとめてみました~

![](https://datawokagaku.com/wp-content/uploads/2020/01/docker_icon.png)

## はじめに
この記事は、エンジニア成り立ての「見習いエンジニア」が多くの記事や書籍を参考に作成した記事になります。記事の内容で間違っているとことがありましたらコメントでご指摘いただけますと非常に励みになります！

### 経緯
エンジニアになろうと決意して、パソコンに触れてからいくつもの用語や言語の壁が立ち塞がってきている今日この頃です。
そして、あらたに「Docker」という壁が立ち塞がってきたので、その壁を登るためこの記事にまとめてみようと思います。

## 「Docker」ってなに！？
[Dockerのドキュメント](https://docs.docker.jp/v1.11/engine/understanding-docker.html#docker)には以下のように記載しています。
>Docker はアプリケーションを開発（developing）・移動（shipping）・実行（running）するための、オープンなプラットフォームです。Docker は皆さんのアプリケーションをより速く運ぶために設計されています。Docker を使うことで、アプリケーションをインフラから分離し、アプリケーションを管理するようにインフラを扱えるようにします。Dockerはコードの移動をより速く、テストを速く、デプロイを速くし、コードの記述とコードの実行におけるサイクルを短くします。

難しい言い回しで初心者には分かりづらいような気がします。
つまり、**Docker**とは一言で表すなら、**軽量なコンテナ型の仮想化環境を提供してくれるソフトウェア**ということでしょう。

そして、以下で細かい用語や違いなどを記載していきます。

### 軽量なコンテナ型？　コンテナってなに？
コンテナとは、「アプリファイルシステムを隔離するプロセス」のこと。
動作中の個々のプログラムをプロセスと言い、アプリとファイルシステムを隔離するということは、１つの物理マシンの中で動いているにも関わらずそのプロセスの中だけが別のマシンで動いているような状態になることになります。つまり、他のアプリケーションへの影響を気にすることなくアプリの開発・実行ができるようにこれが、従来の仮想化技術と異なるコンテナの仕組みになります。

コンテナを使うと、１つの物理マシンの中で互いに隔離された複数の仮想サーバーを構築することができ、仮想マシン方式よりもシンプルな構成で実現できるようになります。

### その上で、改めて「Docker」ってなに？
コンテナを使うには、コンテナを作成・実行するためのソフトウェアが必要になりますが、そのソフトウェアで有名なものが「Docker」になるわけです。

「コンテナ＝Docker」と言われるくらい、Dockerはコンテナの設計図となる「イメージ」を共有できる場所もあり、それを利用してコンテナを短時間で作成できるという、一種のエコシステムを形成しているため、多くのエンジニアの支持を得ています。

## 仮想サーバーってなに！？
### 物理サーバーとは
まず、サーバーとは利用者のリクエストに応答して、ネットワーク経由でサービスや情報を提供するコンピューターのことです。

そして、サーバーには「物理サーバー」と「仮想サーバー」の2種類が存在し、物理サーバーはハードウェアリソースを持つサーバーのコンピューターそのものを指します。イメージは「大きい黒い機械の塊が室内にたくさんある絵」を浮かべてもらえればと思います。

### 仮想サーバーとは
そして、仮想サーバーは物理サーバーのリソースを仮想化技術で複数台に分割した仮想的なサーバー環境を指します。

仮想なので、実態はなく先ほどの「大きい黒い機械の塊」がインターネット上（クラウド）にあるサーバーがイメージになると思います。

そして、仮想化ソフトウェアを使用することで、1台の物理サーバー内部に、ハードウェアリソースを利用した仮想マシン（仮想環境）を複数構成できます。この仮想マシンに OS やアプリケーションをインストールしたものを、仮想サーバーと呼びます。

### 従来の「サーバー仮想化」とDockerによる「コンテナ型仮想化」の違い

従来のサーバー仮想化は、運用にゲストOSが欠かせませんでしたが、コンテナ型仮想化はすべてのアプリケーションが直接ホストOSによって起動されます。

ゲストOSが必要ないため、仮想サーバーごとのゲストOSをはじめ、CPUやメモリ、ストレージなどのリソースを必要としません。そのため、コンテナ型仮想化を活用することで、リソースをより有効に活用することができる利点が挙げられます。

また、サーバー仮想化では、仮想サーバーが生成されてOSが起動し利用できるようになるまで**分単位の待ち時間**が発生しますが、Dockerのようなコンテナ型仮想化ではコンテナが切り出されて利用可能になるまでの待ち時間は**秒単位**です。この“すぐに使える”という点がコンテナ型仮想化のもう一つの利点だと言えるでしょう。

## メリットとデメリット
### コンテナ型仮想化のメリット
コンテナ型仮想化には、下記のようなメリットが挙げられます。

* 処理が軽い、動作が高速
* 環境構築の工数を削減できる
* 開発と運用の相性が良い

コンテナは、ゲストOSを必要とせずホストOSから直接起動できるため、余分な処理がありません。なので、ゲストOSの起動などを待つ必要がないため処理が軽く、動作が高速です。

また、コンテナはコピーすることができるので新たなコンテナを構築する際にも、比較的簡単に環境構築することができるため、作業工数を大幅に削減することができるでしょう。

そして、コンテナは「DevOps」という開発手法に適しているため、開発と運用の相性が良いというメリットもあり、リリースサイクルの高速化を図ることもできます。

<details><summary>DevOpsとは</summary>

>DevOps（デブオプス）とは、「開発（Development）」と「運用（Operations）」を組み合わせた造語です。簡単に言えば、「開発担当と運用担当が緊密に連携して、柔軟かつスピーディーにシステム開発を行う手法」のことです。

[引用元](https://pfs.nifcloud.com/navi/tech/devops.htm#:~:text=DevOps%EF%BC%88%E3%83%87%E3%83%96%E3%82%AA%E3%83%97%E3%82%B9%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81,%E8%A1%8C%E3%81%86%E6%89%8B%E6%B3%95%E3%80%8D%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82)
</details>

### コンテナ型仮想化のデメリット
反対に、コンテナ型仮想化には下記のようなデメリットもあります。

* ベースとなるOSに対応していなければ動かせない
* 複数ホストでの運用が煩雑
* 学習コストが高くなる

OSには、「Windows」や「macOS」、「Linux」など、さまざまな種類が存在しますが、コンテナ型は、ホストOSに未対応のアプリケーションを起動できないというデメリットがあります。

また、コンテナが増えていき複数ホストで運用するようになると、運用・管理が煩雑になります。

そして、新しい技術のためノウハウを持った技術者も少なく、導入・運用のための学習コストも高くなることもデメリットになるでしょう。


## まとめ
### つまり、Dockerって何がいいの？
チーム開発をする上で、それぞれの開発者が使用しているコンピュータはMacやWindowsなどの違いがあったり、開発者ごとに様々なソフトウェアが入っていることで、チーム開発する前の「環境を揃えること」は大変に面倒です。

そこで、コンテナ型仮想化である「Docker」を導入することで**軽量な動作と環境ファイルの共有**を実現することができます。

つまり、Dockerを使用することの一番のメリットは**ソフトウェアの実行環境を、複雑なアーキテクチャであってもDockerを使って管理することで簡単にどんなマシンにでも共有ができる**ことでしょう。

## 最後に
Dockerは概念を理解せずとも使うことができます。ですが、改めて「Docker」とは何なのか、他と比べての利点は何なのかを理解することで、これから使用していく中ので習得度をより高めることができると思いました。


## この記事は以下のサイトや書籍を参考にして執筆しました
https://www.kagoya.jp/howto/cloud/container/docker/

https://cn.teldevice.co.jp/column/10509/

https://cloud-ace.jp/column/detail196/

[書籍]Docker&仮想サーバー完全入門　Webクリエイター＆エンジニアの作業がはかどる開発環境構築ガイド

https://book.impress.co.jp/books/1121101138