100日後にエンジニアになるキミ - 95日目 - 開発環境 - Docker について

昨日までのはこちら

[100日後にエンジニアになるキミ - 94日目 - 開発環境 - 仮想化について](https://qiita.com/otupy/items/0b8db399900a5517eb97)

[100日後にエンジニアになるキミ - 91日目 - 運用 - 監視について](https://qiita.com/otupy/items/532d0f78b103d3b39b2d)

[100日後にエンジニアになるキミ - 90日目 - 開発 - CIについて](https://qiita.com/otupy/items/25786feaaa1b1f4d203f)

[100日後にエンジニアになるキミ - 88日目 - データ - データ転送について](https://qiita.com/otupy/items/e720e175c83a84e101c9)

[100日後にエンジニアになるキミ - 86日目 - データベース - Hadoopについて](https://qiita.com/otupy/items/0016a1b9f496627619b6)

[100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について](https://qiita.com/otupy/items/6a4f960ba4df06e27050)

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

本日はにコンテナとDockerについてです。

## コンテナについて

`仮想化`が何たるかは[前回](https://qiita.com/otupy/items/0b8db399900a5517eb97)を見ていただければ良いかと思います。

仮想化と言えば一昔前は`ゲストOS`を用いた仮想化がほとんどでした。
最近では`コンテナ`と呼ばれる技術が出てきています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/de9429ae-76ac-1832-4fef-69141eba086c.png)

参考：https://pfs.nifcloud.com/navi/tech/container_virtualization.htm

従来の仮想化では1台の物理マシン上には`ホストOS`が起動し
そのOS上で複数の`ゲストOS`が稼働していました。

しかし仮想化ソフトを使用した仮想化環境にもデメリットがあります。
複数OSを利用することによる性能劣化や
仮想化ソフトウェアの介在による複雑化などがあります。

そこで注目されているのが`コンテナ`です。

`コンテナ`は`ホストOS`上にアプリケーションの起動に必要な
アプリケーション・ライブラリ・設定ファイルなどをひとまとめにした
`コンテナ`を作成し`コンテナエンジン`上で動作させる技術のことです。

通常の仮想化と似ている点もありますが、大きく異なる点として
`ゲストOS`を用いないということです。

`コンテナ`では`ゲストOS`を起動することなく
アプリケーションの実行環境を構築することが可能になるため
仮想マシンに比べて少ないリソースで済むのが特徴です。

このような`コンテナ`技術を牽引するソフトウェアとしては
`docker`と言うものがあります。



## Dockerについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/cfc41fb8-2613-cc7b-82da-4e702bae9cb0.png)

`Docker`は2013年頃に発表されたコンテナ仮想化を用いて
アプリケーションを実行するためのソフトウェアです。

[Docker](https://github.com/docker/docker-ce)

`Docker`はコンテナ仮想化を用いたOSレベルの仮想化により
環境自体をアプリケーションと同じようにコード（イメージ）として管理可能にし
アプリケーションの素早い提供を実現します。

`Docker`はミドルウェアのインストールや各種環境設定をコード化して管理します。
ソフトウェア開発で実施されてきた構成管理や自動化などを
サーバーの各種設定やミドルウェアのインストールなどにも応用できます。

これらにより、以下のような利点が生まれます。

・ファイルを共有することで、誰でも同じ環境が作れる
・作成した環境イメージを配布しやすい
・スクラップ＆ビルドが容易

データ分析の観点から言えば、誰でも同じ環境を作る利点が大きいです。
Python言語を用いた分析環境ではライブラリのバージョン差異が生まれやすく
分析環境が異なることでのトラブルが発生しやすいです。

環境の統一化をすることで軽減することができます。

また開発環境の構築をする時間の短縮化にもつながります。
新規の案件に参画した場合、開発環境の構築に1日かかってしまうこともあります。
それが配布されたイメージ１つで済みます。

当然`Docker`の学習コストを支払わなければならないのですが
今後はコンテナを利用した開発が増えていくため、抑えておくメリットは大きいです。

また最近では`コンテナ`を管理する`オーケストレーションツール`を使うことで
より運用が楽になって来ています。

最近では`オーケストレーションツール`として`Kubernetes`が注目を浴びています。

参考：https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/

## まとめ

10年以上前は仮想化が流行った時期がありましたが
そこから少し経って今ではコンテナと言う技術が流行ってきています。

コンテナを扱うことのできる`docker`の利用も高まってきており
開発者のニーズも高まってきています。

これからの開発のスタンダードになると思いますので
抑えておいても損はないかと思います。

明日はもう少し詳しく紹介していきます。

君がエンジニアになるまであと05日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython